我是李慢慢。
继续来填坑。
这个清明节因为疫情关在家里不得出去,只好把自己的树莓派小车继续搬出来,继续来攻克难关:图像识别。不过这几天还没有进入图像识别流程,纯粹在硬件(摄像头)接入系统(树莓派)上就被卡了很久,把系统搞崩了又是重装系统又是配置环境的,不记录一篇文章,实在是对不起自己。
本文记录的是如何利用树莓派系统,接入摄像头模块,以获取图像。以下详述。
目录:
1、硬件配置
2、系统配置
3、简单测试
4、opencv测试
1、硬件配置
1个树莓派板卡:4B
1个摄像头模块:USB摄像头
1个无线键鼠套装
1个5英寸的显示器
如下:
连好线之后就是下面这个样子:
这次的主角呢,就是下面这个东西(USB摄像头模块)。
2、系统配置
树莓派系统安装的是官方下载的镜像,版本如下所示。
如何判断摄像头模块是否有接入树莓派?
摄像头模块在连线前后分别在命令行输入以下内容,以判断系统是否有检测到该设备,如果有多出来的就是USB摄像头。
lsusb
如果没有检测到,需要到系统配置里去使能摄像头功能,然后重启系统。
sudo raspi-config
摄像头拍摄程序是系统里哪一个?
系统能识别到摄像头硬件的话,就可以拍个照试试看了,但用哪一个摄像头呢?同样的,需要通过插拔摄像头来看看:
ll /dev/video*
不知道为什么我这里识别到多出来的摄像头有两个,video0和video1,不管它,我用video0好了。
这里需要提一下,有时候在用后文的方法获取摄像头图像后video0会不见了,导致无法再进行拍摄,只有重启才能解决问题。所以,这里需要进行以下配置,将之固化。解决方案:使用root权限打开/etc/modules 然后添加一行:bcm2835-v4l2(注意,这里是4l2不是412),然后重启树莓派。
3、效果测试-简单测试
如何用摄像头拍摄一张照片呢?
如果是官方的CSI接口的摄像头,使用如下命令:
raspistill -o image_name.jpg
我这里用的是USB接口的摄像头,使用如下命令:
fswebcam /dev/video0 ./img1.jpg
不过用这个之前,系统可能没有这个程序,需要安装一下。
sudo apt-get install fswebcam
接下来是愉快的测试:
找到这个路径下的图片,双击打开,如下:
终于可以拍照了,这距离我做图像识别的目标又近了一大步。
如何用摄像头进行录像?
上面是通过程序驱动摄像头进行拍照并且保存了。但是实际做图像识别的时候,摄像头获得的数据应该是视频类的?或者为了回放方便,是视频格式的。在这里,怎么来获得视频的效果呢?
方法:可以安装一个程序【luvcview】
sudo apt-get install luvcview
然后,直接运行这个程序,就可以在桌面打开一个窗口,实时获取摄像头的输入了。嘿嘿,开心。
luvcview
以上内容,还只是简单的摄像头功能测试。进行到这一步,后续其实还有很多玩法,比如使用远程访问摄像头拍摄内容实现监控的效果。但我这里的目的是研究自动驾驶小车的图像识别功能,也就不折腾了。
4、opencv测试
用python获取摄像头内容:
为了做图像识别,传统的方式,还是用opencv进行图像的抓取,再进一步做识别。基于此,以下做了些简单的图像获取的测试。
首先需要给系统装上opencv和numpy的包。(其中numpy的包,系统一般自带了,剩下的就是安装下面这两个包。)
sudo apt-get install libopencv-dev
sudo apt-get install python-opencv
安装完后,在命令行运行python,并导入cv2,顺便查看下cv2的版本,如果出现下面的界面,就代表成功了。
python
import cv2
cv2.__version__
注:为啥叫cv2而不叫opencv呢?这是因为OpenCV是基于C/C++开发的,有两个版本,''cv”版本的API是C语言开发的,''cv2''版本的API是基于C++语言开发的,为了保持向后兼容性所以叫"cv2",但我们都知道cv2就是OpenCV本尊。
接下来就是利用这个包进行图像的抓取测试了。
编写以下代码:
#-*- coding:UTF-8 -*-
import cv2
img_count = 0
cap = cv2.VideoCapture(0)
print("Is the camera opened?",cap.isOpened())
# set the size of image.
cap.set(cv2.CAP_PROP_FRAME_WIDTH,500)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,500)
# create a window.
cv2.namedWindow('image_win',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)
while(True):
ret,frame = cap.read()# ret is the status,frame is the image.
if not ret:
print("can not take a image, exit...")
break
cv2.imshow('image_win',frame)
#print("frame: ",frame)
key = cv2.waitKey(1)#get the input from keyboard
if key == ord('q'):
print("exit the program normally...")
break
elif key == ord('c'):
cv2.imwrite("{}.png".format(img_count),frame)# save the image.
print("a png is saved as: {}.png".format(img_count))
img_count += 1
cap.release()
cv2.destroyAllWindows()
#
上述代码保存为【cv2_get_camera_frame.py】,在命令行运行该脚本。
python cv2_get_camera_frame.py
稍等一会儿,就能打开一个窗口,播放摄像头实时拍摄的画面。如下所示:
按键盘上的快捷方式“c”,可以拍摄一些图片进行保存,如下所示:
通过代码里的设置,可以用c来拍照,用q来推出当前程序。
顺带准备了个测试的效果视频:(发布在微信公众号【车路慢慢】)
好了。以上完成了软硬件的系统集成测试,接下来就真的可以开始做图像识别的测试了。我们下期再见。
本文完。