8. 摄像头使用-Opencv

在鲁班猫RK系列板卡上,支持摄像头这种常见的传感器的使用,板卡都有24pin mipi csi接口,测试使用的摄像头是ov5648。 本章将使用opencv-python库使用摄像头并进行简单处理。

提示

教程基于Python 3.8.10版本(镜像系统是Ubuntu20.04)进行实验及讲解。

8.1. opencv-python库简介

OpenCV是计算机视觉中经典的专用库,其支持多语言,跨平台,功能强大,于1999年由Gary Bradsky在英特尔创立,并于2000年发布第一个版本。 OpenCV现在支持与计算机视觉和机器学习相关的众多算法,并且正在日益扩展。 OpenCV支持各种编程语言,如C ++,Python,Java等,可在不同的平台上使用,包括Windows,Linux,OS X(该系统已经更名为macOS),Android和iOS。 基于CUDA和OpenCL的高速GPU操作接口也在积极开发中。

OpenCV-Python是基于Python的库,或者说是OpenCV的Python应用接口,旨在解决计算机视觉问题,结合了OpenCV C++ API和Python语言的最佳特性。

8.2. 鲁班猫板卡添加camera资源

本节实验中,测试使用鲁班猫LubanCat 2板卡为例演示,上电前连接摄像头连接到mipi csi接口,系统启动后:

# 在终端中输入如下命令,可以查看到camera设备资源:
ls /dev/video*

检查板卡上的camera设备资源示例,仅供参考:

broken

linux系统下更多摄像头使用参考 《摄像头》 , 该章节中会介绍v4l-utils等工具,可以查看到摄像头设备的相关信息。

8.3. 相关工具及库安装

实验中我们会使用到一些工具,输入如下命令安装(如果有安装就不需要):

1、安装一些依赖库或者工具:

# 在终端中输入如下命令:
sudo apt update
sudo apt -y install python3-pil python3-numpy python3-pip git wget

# 可能需要的库,有些可能默认安装
sudo apt install libavcodec-dev libavformat-dev libswscale-dev
sudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

等待安装完成后即可。

2、安装opencv-python库:

使用命令直接安装(建议):

# 可以使用apt命令安装python3-opencv包:
sudo apt-get install python3-opencv

# 或者使用pip指定opencv版本安装:
pip3 install opencv-python==4.7.0.68

获取whl文件安装,可以到这里 下载 对应python版本和架构的whl文件

# 例如下面的whl文件,可以使用命令安装:
pip3 install opencv_python-4.5.4.60-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

或者下载源码编译安装,可以参考此 链接

提示

如果使用Debian10系统,要用opencv_python控制摄像头,要安装高版本的opencv_python和pip3, 使用命令(更新pip3和安装whl用root权限): sudo pip3 install --upgrade pip ,然后选择上面的方法安装opencv_python。

3、验证是否安装成功:

打开交互Python终端(或IPython):

cat@lubancat:~$ python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print(cv.__version__)
4.2.0
>>>

8.4. 摄像头拍照

配套代码 io/camera/camera_photo.py文件内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os
import cv2

# 帧宽和高度
width = 640
height = 480

num = 1

# 创建一个VideoCapture对象,并打开系统默认的摄像头(也可以打开视频或者指定的设备)
cap = cv2.VideoCapture(0)

# 不能打开摄像头
if not cap.isOpened():
    raise RuntimeError('Could not open camera.')

# 设置帧宽和高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

while(cap.isOpened()):

    # 返回两个参数,ret表示是否正常打开,frame是图像数组,一帧
    ret,frame  = cap.read()

    # 窗口显示,名为Lubancat_Camera_test
    cv2.imshow("Lubancat_Camera_test", frame)

    # 延迟1ms,并根据键盘输入返回值val,是板卡接的键盘
    val = cv2.waitKey(1) & 0xFF

    # 捕获到键盘输入‘s’,图片保存到当前目录下
    if val == ord('s'):
        print("=======================================")
        # 第一个参数是保存为的图片名,第二个参数为待保存图像,jpeg格式
        cv2.imwrite("photo" + str(num) + ".jpg", frame)
        print("width = ", width)
        print("height = ", height)
        print("success to save photo: "'photo' + str(num)+".jpg")
        print("=======================================")
        num += 1

    # 若检测到按键 ‘q’,退出,是板卡接的键盘
    if val == ord('q'):
        break

# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()

使用带桌面的镜像系统,连接好键盘和屏幕,在板卡系统运行程序,使用摄像头详细看下上面注释。 使用命令运行程序:

sudo python3 camera_photo.py

此时屏幕出现弹窗显示画面,当键盘按下“s”,会保存图片到当前目录下,安装“q”会退出程序。 运行示例:

broken

8.5. 摄像头捕获、录制视频

视频中每一帧代表一幅图像,我们通过捕获一帧帧的图像,进行压缩保存,来录制视频。

配套代码 io/camera/camera_video01.py文件内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import os
import cv2

# 帧宽,高度,帧率
width = 640
height = 480
fps = 25.0

# 创建一个VideoCapture对象,并打开系统默认的摄像头
video = cv2.VideoCapture(0)

# 设置帧宽和高度
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

# 定义视频文件的写入格式,未压缩的YUV颜色编码类型(使用该格式保存的视频文件很大,需要注意下),有些格式可能不支持,编码器失败,需要安装相关库
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fourcc = cv2.VideoWriter_fourcc('I','4','2','0')

# 用于实现多张图像保存成视频文件,第一个参数是需要保存的视频文件名称,第二个函数是编解码器的代码,
# 第三个参数为保存视频的帧率,第四个参数是保存的视频文件的尺寸,一定要与图像的尺寸相同
# out = cv2.VideoWriter('output.mp4',fourcc, fps, (width,height))
out = cv2.VideoWriter('output.avi',fourcc, fps, (width,height))

while(video.isOpened()):
    ret, frame = video.read()
    if ret is True:
        # 窗口显示,名为Lubancat_Camera_video
        cv2.imshow('Lubancat_Camera_video',frame)

        # 将捕捉到的图像存储,保存的视频是没有声音的
        out.write(frame)

        # 延迟1ms,如果键盘按下“q”,退出,是板卡接的键盘
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        print("Unable to read camera!")
        break

# 释放资源
video.release()
out.release()
cv2.destroyAllWindows()

运行程序,就会进行捕获和录制,视频保存在当前目录下,详细过程看下上面注释。当键盘按下“q”时退出,或者直接中断程序运行。

播放视频,也可以用cv2.VideoCapture,参考下:

配套代码 io/camera/camera_video02.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import cv2

# 创建一个VideoCapture对象,选择播放的视频文件
cap = cv2.VideoCapture('output.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    # 窗口显示,名为Lubancat_Camera_video
    cv2.imshow('Lubancat_Camera_video',frame)

    # 延迟1ms,如果键盘按下“q”,退出,是板卡接的键盘
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()