1、摄像头驱动教程

您当前位置: 首页 > Raspblock视觉全向车 > AI视觉教程

OpenCV使用到的常见API函数:

1、cv2.VideoCapture()函数:

cap = cv2.VideoCapture(0)

VideoCapture()中参数是0,表示树莓派video0。

(注意:可以通过命令ls /dev/ 查看当前摄像头)

                                              image.png

 

cap = cv2.VideoCapture("…/1.avi")

VideoCapture("…/1.avi"),表示参数是视频文件路径则打开视频。

2、cap.set()函数

设置摄像头参数 不要随意修改,常见配置方法:

capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);  #宽度

capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); #高度

capture.set(CV_CAP_PROP_FPS, 30);            #帧数

capture.set(CV_CAP_PROP_BRIGHTNESS, 1);      #亮度 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

 

 

CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳

CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点

CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)

CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度

CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度

CV_CAP_PROP_FPS - 帧率

CV_CAP_PROP_FOURCC - 表示codec的四个字符

CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数

函数cvGetCaptureProperty获得摄像头或者视频文件的指定属性。

以下为详细参数:

#define CV_CAP_PROP_POS_MSEC       0     //以毫秒计算的当前的位置

#define CV_CAP_PROP_POS_FRAMES     1  //以帧计算当前的位置

#define CV_CAP_PROP_POS_AVI_RATIO  2  //视频的相对位置,从0 1 前面这三个参数应该是跟视频播放,读取相关的动态信息

#define CV_CAP_PROP_FRAME_WIDTH    3    //帧宽

#define CV_CAP_PROP_FRAME_HEIGHT   4   //帧高度

#define CV_CAP_PROP_FPS            5    //帧率

#define CV_CAP_PROP_FOURCC         6   //4 字符编码方式

#define CV_CAP_PROP_FRAME_COUNT    7 //视频帧数

#define CV_CAP_PROP_FORMAT         8   //视频格式

#define CV_CAP_PROP_MODE           9    //后端特定值,指示当前捕获模式。

#define CV_CAP_PROP_BRIGHTNESS    10   //亮度

#define CV_CAP_PROP_CONTRAST      11  //对比度

#define CV_CAP_PROP_SATURATION    12 //饱和度

#define CV_CAP_PROP_HUE           13  //色调

#define CV_CAP_PROP_GAIN          14 //增益

#define CV_CAP_PROP_EXPOSURE      15 //曝光

#define CV_CAP_PROP_CONVERT_RGB   16 //布尔型标记图像是否应该被转换为RGB.

#define CV_CAP_PROP_WHITE_BALANCE 17 //白平衡

#define CV_CAP_PROP_RECTIFICATION 18 //立体声摄像机校正标志(注意:仅支持DC1394 v2xcur-rently)

 

3cap.isOpened()函数

返回true表示成功,false表示不成功

 

4ret,frame = cap.read()函数

cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件未读取到结尾,它的返回值就为False。

frame就是每一帧的图像,是个三维矩阵。

 

5、cv2.waitKey()函数:

参数是1,表示延时1ms切换到下一帧图像,参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。

参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停。

 

6、cap.release()与destroyAllWindows()函数:

cap.release()释放视频,调用destroyAllWindows()关闭所有图像窗口。

 

代码实现过程

    由于我们整个教程都运行在JupyterLab中,所以必须了解里面的各种组件,这里我们需要用到图像显示组件。

1、导入库:

    import ipywidgets.widgets as widgets

2、设置Image组件:

    image_widget = widgets.Image(format='jpeg', width=600, height=500)

l  format:显示格式。

l  width:宽度。

l  height:高度。

3、显示Image组件:

    display(image_widget) 

4、打开摄像头并读取图像:

    image = cv2.VideoCapture(0)                           #打开摄像头

    ret, frame = image.read()                             #读取摄像头数据

5、赋值给组件

    #转化图像为jpeg并赋值给视频显示组件

    image_widget.value = bgr8_to_jpeg(frame)

 

代码路径: /home/pi/Yahboom_Project/3.AI视觉课程/01.摄像头驱动教程.ipynb

 

import cv2

import ipywidgets.widgets as widgets

import threading

import time

 

#设置摄像头显示组件

image_widget = widgets.Image(format='jpeg', width=600,   height=500) 

display(image_widget)        #显示摄像头组件

#bgr8转jpeg格式

import enum

import cv2

 

def bgr8_to_jpeg(value, quality=75):

    return   bytes(cv2.imencode('.jpg', value)[1])

image = cv2.VideoCapture(0)                           #打开摄像头

 

# width=1280

# height=960

# cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度

# cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度

 

image.set(3,600)      

image.set(4,500)

image.set(5, 30)  #设置帧率

image.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M',   'J', 'P', 'G'))

image.set(cv2.CAP_PROP_BRIGHTNESS, 40) #设置亮度 -64 - 64  0.0

image.set(cv2.CAP_PROP_CONTRAST, 50)   #设置对比度 -64   - 64  2.0

image.set(cv2.CAP_PROP_EXPOSURE, 156)  #设置曝光值 1.0   - 5000  156.0

 

ret, frame = image.read()       #读取摄像头数据

image_widget.value = bgr8_to_jpeg(frame)

while 1:

    ret, frame =   image.read()

    image_widget.value =   bgr8_to_jpeg(frame)

    time.sleep(0.010)

image.release()                #使用完成对象记住释放掉对象,不然下一个程序使用这个对象模块会被占用,导致无法使用

 

image.png