智驾小车|如何给树莓派系统接入摄像头模块

我是李慢慢。

继续来填坑。

这个清明节因为疫情关在家里不得出去,只好把自己的树莓派小车继续搬出来,继续来攻克难关:图像识别。不过这几天还没有进入图像识别流程,纯粹在硬件(摄像头)接入系统(树莓派)上就被卡了很久,把系统搞崩了又是重装系统又是配置环境的,不记录一篇文章,实在是对不起自己。

本文记录的是如何利用树莓派系统,接入摄像头模块,以获取图像。以下详述。

目录:

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-devsudo apt-get install python-opencv

安装完后,在命令行运行python,并导入cv2,顺便查看下cv2的版本,如果出现下面的界面,就代表成功了。

​​​​​​​

pythonimport cv2cv2.__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 keyboardif key == ord('q'):        print("exit the program normally...")breakelif 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 += 1cap.release()cv2.destroyAllWindows()#

上述代码保存为【cv2_get_camera_frame.py】,在命令行运行该脚本。

python cv2_get_camera_frame.py

稍等一会儿,就能打开一个窗口,播放摄像头实时拍摄的画面。如下所示:

按键盘上的快捷方式“c”,可以拍摄一些图片进行保存,如下所示:

通过代码里的设置,可以用c来拍照,用q来推出当前程序。

顺带准备了个测试的效果视频:(发布在微信公众号【车路慢慢】)

好了。以上完成了软硬件的系统集成测试,接下来就真的可以开始做图像识别的测试了。我们下期再见。

本文完。

猜你喜欢

转载自blog.csdn.net/weixin_50262060/article/details/123977015