前言:基于前面的实验,我们已经对旭日x3派安装了Ubuntu系统,python+opencv环境和jupyterlab并且进行了控制双色LED灯和继电器实现控制的实验。下面我将和我的小伙伴们使用旭日X3进行摄像头的驱动的实验,从而一起了解旭日X3强大的视频处理能力和高性能的特点。

旭日X3派的摄像头驱动

  实验准备

  硬件设备准备

  1. 旭日X3派一块

  2. USB数据线(tpye-c)

  3. USB摄像头(ANC狼魔)

  其他准备

  1. MpbaXterm

  2. Ubuntu20.04系统环境

  3. python3.8.10环境

  4. jupyterlab环境

  5. 笔记本电脑一台

  实验开始

   介绍

       摄像头驱动程序是一个和摄像头打交道的程序,这个程序包括一些对此设有特殊用途的知识,这个硬件设备如何和计算机传输信息,数据格式如何,应该如何初始化,如何中止等类似的问题。例如人脸识别,用摄像机或摄像头采集含有人脸的图像或视频,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术。由此可见,摄像头是除了鼠标键盘以外,摄像头也是比较常见的输入设备,本次实验采用的是ANC狼魔摄像头,传感器类型为CMOS ,最大帧数为30FPS, 成像距离是30cm ,适用机型为笔记本,台式机 。其功能特点:业内首创速率60帧/秒及声像同步技术,内置有弱光增益技术IP远程安全监控方案最佳效果的传感器 ;麦克风:内置降噪音麦克风 ;下面博主分享一下我和小伙伴们的驱动经过。

      首先,连接电源,将摄像头连接USB接口(在旭日X3派中有三个USB接口,分别是一个USB Type-A 3.0和两个USB Type-A 2.0)

 

接上电源打开MobaXterm进行ssh连接,输入输入账号和密码,博主这边同样是选择最高权限用户,连接WiFi(因为前面博主已经讲过了,在这里就不啰嗦了)

 连上WiFi之后,我们也无法看见摄像头的内容,即使通过无线连接连接上了vnc也无法查看,让摄像头的内容呈现出来就是我们今天的任务

  连接ssh后,在命令行输入如下代码

jupyter lab --ip=0.0.0.0 --port=8888 --allow-root

打开浏览器,输入显示的ip地址,进入到jupyterlab,点击新建,选择notebook--python3

在这里我们可以查看一下自己的opencv版本(博主使用的是python3.8.10和opencv4.2.0)

import cv2
cv2.__version__

为什么要这样做呢?

因为博主在写代码时就出现了问题

如果opencv的版本不同,参数名称不同,就容易导致我们在运行程序的时候报错

然后直接输入程序,运行代码

import cv2 as cv
 #打开摄像头
image = cv.VideoCapture(0)                           
#编辑图像宽度
image.set(3,600)
image.set(cv.CAP_PROP_FRAME_WIDTH,600)
#编辑图像高度
image.set(4,500)
image.set(cv.CAP_PROP_FRAME_HEIGHT,500)
#编辑视频帧率
image.set(5, 30)  #设置帧率
image.set(cv.CAP_PROP_FPS, 30)
#解码方式四字符
image.set(cv.CAP_PROP_FOURCC, cv.VideoWriter.fourcc('M', 'J', 'P', 'G'))
#编辑图像亮度
image.set(cv.CAP_PROP_BRIGHTNESS, 63) #设置亮度 -64 - 64  0.0
#编辑图像对比度
image.set(cv.CAP_PROP_CONTRAST, 0)   #设置对比度 -64 - 64  2.0
#编辑图像曝光度
image.set(cv.CAP_PROP_EXPOSURE, 2000)  #设置曝光值 1.0 - 5000  156.0
 while (image.isOpened()):
 #逐帧捕获
 ret, frame = image.read()
#显示图像
cv.imshow("real_time",frame)
#等待按键ESC按下
if(cv.waitKey(5) == 27):
        break
 #释放摄像头
image.release()
#关闭所有该程序打开的窗口
cv.destroyAllWindows()

代码主要是调用了opencv函数库中的VideoCapture类

运行代码后会跳出一个小窗口,实时呈现摄像头的画面,如果大家想退出的话,直接按ESC就可以了

如果按照博主给的代码直接运行的话,可能画面比较暗,大家可以自己设定一下

大家可以从代码的注释中看出,我们可以设置图像的宽度,高度,帧率,亮度,对比度,曝光值的数值,这就是VideoCapture类下的作用

以便大家对VideoCapture类的使用,我把其下的get参数表和set参数表列出来,以供参考

param define
cv2.VideoCapture.get(0) CV_CAP_PROP_POS_MSEC 视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1) CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4) CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
cv2.VideoCapture.get(5) CV_CAP_PROP_FPS 帧速率
cv2.VideoCapture.get(6) CV_CAP_PROP_FOURCC 编解码的4字-字符代码
cv2.VideoCapture.get(7) CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数
cv2.VideoCapture.get(8) CV_CAP_PROP_FORMAT 返回对象的格式
cv2.VideoCapture.get(9) CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
capture.set 作用
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080); 宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960); 高度
capture.set(CV_CAP_PROP_FPS, 30); 帧率 帧/秒
capture.set(CV_CAP_PROP_BRIGHTNESS, 1); 亮度
capture.set(CV_CAP_PROP_CONTRAST,40) 对比度 40
capture.set(CV_CAP_PROP_SATURATION, 50); 饱和度 50
capture.set(CV_CAP_PROP_HUE, 50); 色调 50
capture.set(CV_CAP_PROP_EXPOSURE, 50); 曝光 50 获取摄像头参数

这样我们就可以根据自己所处环境的差异调节出适合自己的一系列参数。

(如果大家懂得处理图像的话,也可以用摄像头照亮你的美,但是博主对摄影什么的七窍通六通窍——一窍不通,所以大家就不要嫌弃了)