摄像头作为嵌入式系统的eyes,是实现图像采集的重要手段。很多重要的应用,如车牌识别,二维码识别,人脸识别,其最基本的图像输入都依赖于摄像头的采集。摄像头的应用依赖于底层的摄像头驱动(USB摄像头,网络摄像头,CSI摄像头对应不同的驱动);这部分内容在相应驱动章节进行说明。
对于应用部分上层,则依赖于Linux系统实现的V4l2标准,提供统一的图像采集接口。V4L2支持三种方式来采集图像:内存映射方式、直接读取方式和用户指针方式。
本文中主要以前两种方式进行说明。从驱动开始实现摄像头应用,并显示到屏幕绘制是很复杂的过程,实现类似照相机的功能,如果完全由自己开发,是相当复杂的过程。不过依赖于开源的库,如opencv,qt等,实现摄像头应用开发,是相对简单的。这里将从易到难讲解如何实现摄像头应用开发。
本文中使用的为USB免驱摄像头,适配uvc协议,Linux免驱,先不考虑硬件的差别。插入摄像头后,首先要查看当前USB摄像头设备信息。可通过v4l2-ctl查看摄像头信息。
# 安装查看摄像头命令
sudo apt install v4l-utils
# 查看摄像头信息
v4l2-ctl --list-devices
这里可通过增加的/dev/videoX设备,即通过移除和安装摄像头,找到增加的摄像头设备文件,即为摄像头对应的设备文件。
对于已经找到的设备文件,可通过python+opencv的方式进行快速验证。Opencv支持以下接口实现摄像头图像采集,图像显示。
首先,安装opencv库。
# 安装python支持opencv库
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
然后,编写python代码,实现摄像头图像采集,图像显示。
# capture.py
import cv2
# 获取摄像头视频流(1对于/dev/video1)
cam = cv2.VideoCapture(1)
while (cam.isOpened()):
# 读取图像并显示
retval, img = cam.read()
cv2.imshow("Video", img)
# 等待按键结束
key = cv2.waitKey(1)
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
执行python代码,可查看摄像头图像实时显示出来。
python3 test.py
上述使用python+opencv的方式,可以快速验证摄像头图像采集,图像显示。不过产品中如果需要集成到QT软件中,为了实现这个目的,我们就需要使用opencv的C++库来实现此功能,具体步骤如下所示。
其中交叉编译opencv库的方法。
# 下载opencv源码
直接开始下一节说明: 综合应用开发