首页/文章/ 详情

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

1年前浏览3344
我是李慢慢。

继续来填坑。


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


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


目录:

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来推出当前程序。




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


本文完。


来源:车路慢慢
python自动驾驶
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-22
最近编辑:1年前
李慢慢
硕士 自动驾驶仿真工程师一枚
获赞 11粉丝 71文章 122课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈