Created on Sun Nov 4 2018 @author:JohnsonGao
基础知识:
图像处理部分:
平时&灰度化gray 0=>黑 255=>白 e.i.数字是“亮度值”
(注意这里官网simpleCV tutorial中的例程都是错的,grayscale写成了greyscale)
官网截图:
binarize 大于阈值(更白的)=>0(黑),小于阈值(更黑的)=>255(白)
经过黑色的拍照、转换成矩阵、print,灰度值的0对应黑色(与所学一致)
但是bynarize会反一下。
先dilate操作会变亮(白),erode会把黑的变多。
胶带宽度大概22个像素(后来才知道的是跑道不是只有黑色胶带,黑色胶带外面是深蓝色的场地,因此不需要检测胶带的中点进行计算)
https://pinout.xyz/pinout/pin32_gpio12 网址有对应的不同规则定义的管脚号(import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)#setmode
时可以定义到底使用哪种管脚定义方式):
(gpio readall命令也可以看到对应的列表)
所遇到的问题及解决方式:
问题1:Mac上写入系统和出问题后的抹除
使用Mac的Terminal命令行
df –h 查看挂载的SD卡
diskutil unmount 卸载分区
diskutil list 确认设备
sudo dd bs=4mif=imgfile of=/dev/sdaddress
见https://www.jianshu.com/p/5dc83db2b78e,
https://www.jianshu.com/writer#/notebooks/30116262/notes/35440028
问题2:安装SimpleCV
1.安装依赖:
sudo apt-getinstall ipython python-opencv python-scipy python-numpy python-pygamepython-setuptools git
2.从github下载资源
git clonehttps://github.com/sightmachine/SimpleCV.git
3.在的本地文件夹运行安装程序
cd SimpleCV
sudo pythonsetup.py install
问题3:树莓派摄像头设备找不到/dev/video0的解决方法:
开始的时候用simpleCV进行拍照的操作:
from SimpleCVimport *
cam=Camera()
img=cam.getImage()
会提示/dev没有video0
解决方法1:/etc/modules中添加一行:(/etc文件夹目录一般用来存放程序所需的整个文件系统的配置文件)
bcm2835-v4l2注意:这里是字母L不是数字1
解决方法2:创建/etc/modules-load.d/rpi-camera.conf(.conf 是config的简写,也就是配置文件,多用于存取硬件驱动程序的安装配置信息)
里面内容:
# camera device
snd-bcm2835
bcm2835-v4l2
问题4:python与C程序的兼容问题:
解决方法:通过gcc XXX.c -o XXX -lwiringPi -lpthread生成对应的可执行文件XXX,然后通过python调用命令行执行可执行文件(sudo ./XXX)的形式来实现。
具体python调用terminal方式——使用os.system('terminalcode')或者os.popen('terminalcode'):
#used to testxjreturn.c's executable file and read the return value
import os
output=os.popen('sudo./xjreturn')
outputvalue=output.read()
print outputvalue
#注:这里的output.read()读取的是sudo后的输出,即对应C程序中的printf(”YYY”)中的YYY。
问题5:Mac实现远程操控(学习文件中介绍的是Windows的,Mac中很多东西是不一样的)
解决方法1:远程命令行ssh操控:
找到树莓派对应的ip地址=>在Macterminal中使用ssh
pi@ipaddress=>输入密码:raspberry
实际截图:
解决方法2:远程桌面操控:使用Microsoft Remote Desktop(简单一点,推荐用这个)或者Vncviewer
具体操作见:https://www.jianshu.com/p/a8b3ccad9535?utm_campaign
其中vnc的方式很多网上的教程不够细化,可以看:https://blog.csdn.net/u010900754/article/details/53048998
问题6:几种图片格式不一致,影响不同库中图片处理函数的同时使用,需要转化格式
因为我们需要对图像进行滤波等处理,为了使用python中的skimage的库,我们通过type(operation)查看各个步骤后的对应的代表图像的变量的格式。后来我们发现大概有如下的区别:Numpy数组,cv的图像格式instance。其中数组有两种,cv和skimage中的定义是不一样的。
具体的:skimage图像格式
通道:RGB 像素值:[0,1]
Opencv图像格式
通道:BGR 像素值:[0,255]
解决方法:先用cv中的灰度化grayscale函数(灰度化后RGB值基本相等,不用管RGB顺序问题),再乘除255来进行转换。
【也可以使用已经写好的函数进行转换,可以转换彩色图像(考虑到了RGB三色的顺序也不一样的问题)。详见:
https://blog.csdn.net/san_junipero/article/details/79958305】
问题5:例程中的程序会跑飞,于是通过查看官网:http://wiringpi.com/reference/software-pwm-library/
官网截图:
softPwmCreate(intpin,int initial value,int pwmRange)
softPwmWrite(int
pin,int pwmvalue)中的pwmRange推荐值为100,过大可能因为硬件频率不够而无法停下,后面会跑飞(最高速继续运转)。
问题7:命令程序优先级的实现
为防止跑出赛道,我们可以在使用摄像头的同时使用使用传感器进行辅助。比如循迹传感器因为可以检测出深色(黑色)和白色而可以加以使用。为简化程序修改,我们将左右循迹传感器左右交换后放置到外侧。之后通过if判断来实现。
问题8:通过SimpleCV使用摄像头拍摄图像并使用Python进行处理
使用SimpleCV得到图像,先后进行dilate()和erode()(把杂点去除,分辨、保留跑道和边缘等),再进行bynarize(parameter)二值化处理,parameter以上的(白)会变成0(黑),以下的(黑)会变成255(白)——会黑白颠倒!!!相当于白色跑道最后处理后会变成黑色的。
然后通过提取特定若干行的黑色(跑道)的像素值(通过numpy.nonzero(范围)),然后取两头的均值进而找到跑道中点,比较识别后的跑道中点和视野中点决定是否转向以及转向哪边。如果只有一边则说明偏向那一边,往另一边转向。
问题9:多线程的实现——Python图像处理和传感器的联合使用
因为我们的Python图像处理函数速度较慢,我们希望能够图像在一边处理着的同时运行使用传感器和图像综合的辅助程序。同时打开两个terminal通过读写同一个文件来传递参数的方式即可实现。
其他常见问题:
1. 网络没连接导致命令行执行安装东西时下载不了,无法进行。
2. 未进行sudo apt-get update进行更新操作,部分包安装不了或版本过低。
3. 不同树莓派小车的地址、热点WiFi名称都一样(pi3,12345678),所以在一起的时候回连接到别人的小车上,可以使用网线杜绝这种情况的发生。
本来我们是希望彻底放弃C程序通过使用Python的API接口进行操作的,但是Python的wiringPi部分出现了问题,无法持续运行,只是例程的一小部分可以运行,所以就继续延续使用了C程序来生成对应的可执行文件了。