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设备资源示例,仅供参考:
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. 摄像头拍照¶
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”会退出程序。 运行示例:
8.5. 摄像头捕获、录制视频¶
视频中每一帧代表一幅图像,我们通过捕获一帧帧的图像,进行压缩保存,来录制视频。
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,参考下:
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()
|