树莓派上的摄像头与OpenCV
树莓派上都有OpenCV了,是不是再装个摄像头玩[奸笑]
参考:Accessing the Raspberry Pi Camera with OpenCV and Python
1 摄像头连接及配置
摄像头安装及配置我就不写了,懒的翻译原文……
1.1 安装依赖
安装带array
子模块的picamera
,用以将图像Numpy的array传给OpenCV处理:
1 | source activate cv |
1.2 摄像头图像预览
需要注意的是,树莓派上的vnc-server默认配置是不能将传输摄像头预览图像传送到vnc-client上的,需要修改配置:在树莓派上打开vnc-server的菜单 -> Options...
-> TroubleShooting
-> 选择Enable experimental direct capture mode
。(参考Sending Raspberry Pi Camera preview to a laptop running VNC Viewer)
2 使用Python+OpenCV访问摄像头输出的图片
通过Python将摄像头输出的图片送入OpenCV进行显示,显示时用到了OpenCV的highGUI:
1 | from picamera.array import PiRGBArray |
需要注意的是获取图片时使用的矩阵格式为format="bgr"
,参见4.2. Capturing to an OpenCV object。
使用PiRGBArray
对象的好处就是省去了将原始的RGB矩阵封装成各种格式(如JPEG)的步骤,这样读入OpenCV时也就省去了OpenCV将各种格式解码为RGP矩阵的步骤,尤其是在树莓派这种资源受限的设备上能够节省很多算力。
1 | from picamera.array import PiRGBArray |
3 试一试图像的透视变换
搞事情之前:我想在Python模块搜索路径中加入我的工作环境~/pyworkspace
,以后的事情都在这里搞。
因此,在~/berryconda3/envs/cv/lib/python3.5/site-packages
下新建workspace.pth
文件,写入内容:
1 | /home/pi/pyworkspace |
搞一个小事情先,试一下OpenCV的性能,比如4 Point OpenCV getPerspective Transform Example,矩形的四点透视变换。
1 | mkdir cvpi && cd cvpi |
透视变换的代码思路:
- 通过Python代码测量图片中目标矩形区域的长宽;
- 计算输出直角坐标系中的矩形顶点坐标
- 利用
cv2.getPerspectiveTransform()
函数计算变换矩阵并应用,输出图片
1 | import numpy as np |
测试变换效果:
1 | cd ../.. |
1 | from cvpi.transform.perspective_transform import four_point_transform |
4 试一试OpenCV文档扫描器
在搞事情之前:
1 | # pwd: ~./pyworkspace/cvpi |
作者还开源了自己封装的OpenCV常用函数,比如上面的透视变换就包含在内,安装imutils工具包:
1 | pip install --upgrade imutils |
另外,我发现16G的卡已经用了很多空间了,所以推荐删点空间出来:
1 | sudo apt-get purge wolfram-engine |
1 | from cvpi.transform.perspective_transform import four_point_transform |