build_embed_linux_system

基于v4l2的摄像头开发

摄像头作为嵌入式系统的eyes,是实现图像采集的重要手段。很多重要的应用,如车牌识别,二维码识别,人脸识别,其最基本的图像输入都依赖于摄像头的采集。摄像头的应用依赖于底层的摄像头驱动(USB摄像头,网络摄像头,CSI摄像头对应不同的驱动);这部分内容在相应驱动章节进行说明。

对于应用部分上层,则依赖于Linux系统实现的V4l2标准,提供统一的图像采集接口。​V4L2支持三种方式来采集图像:内存映射方式、直接读取方式和用户指针方式。

本文中主要以前两种方式进行说明。从驱动开始实现摄像头应用,并显示到屏幕绘制是很复杂的过程,实现类似照相机的功能,如果完全由自己开发,是相当复杂的过程。不过依赖于开源的库,如opencv,qt等,实现摄像头应用开发,是相对简单的。这里将从易到难讲解如何实现摄像头应用开发。

hardware

本文中使用的为USB免驱摄像头,适配uvc协议,Linux免驱,先不考虑硬件的差别。插入摄像头后,首先要查看当前USB摄像头设备信息。可通过v4l2-ctl查看摄像头信息。

# 安装查看摄像头命令
sudo apt install v4l-utils

# 查看摄像头信息
v4l2-ctl --list-devices

这里可通过增加的/dev/videoX设备,即通过移除和安装摄像头,找到增加的摄像头设备文件,即为摄像头对应的设备文件。

python_opencv

对于已经找到的设备文件,可通过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

cpp_opencv

上述使用python+opencv的方式,可以快速验证摄像头图像采集,图像显示。不过产品中如果需要集成到QT软件中,为了实现这个目的,我们就需要使用opencv的C++库来实现此功能,具体步骤如下所示。

  1. 交叉编译opencv库
  2. 编写opencv代码,实现摄像头图像采集,图像显示功能

其中交叉编译opencv库的方法。

# 下载opencv源码


next_chapter

返回目录

直接开始下一节说明: 综合应用开发