opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

文章目录:

1,为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。之后,你就可以一帧一帧的捕获视频了。但是最后,别忘了停止捕获视频。使用 ls /dev/video*命令可以查看摄像头设备

2,ret, frame = cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。有时 cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使用 cap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,见表其中的一些值可以使用cap.set(propId,value) 来修改,value 就是

你想要设置成的新值。例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240。

官方给出的set(self, propId, value)的函数的定义说明

       def set(self, propId, value): # real signature unknown; restored from __doc__
        """
        set(propId, value) -> retval
        .   @brief Sets a property in the VideoCapture.
        .   
        .   @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...)
        .   or one from @ref videoio_flags_others
        .   @param value Value of the property.
        .   @return `true` if the property is supported by backend used by the VideoCapture instance.
        .   @note Even if it returns `true` this doesn't ensure that the property
        .   value has been accepted by the capture device. See note in VideoCapture::get()
        """

注意:

从上面给出的定义说明,有些属性值设置成功之后,即使返回True值,也不代表设置的属性值会被捕捉设备接收,详细参见:VideoCapture::get()。我尝试设置摄像头的帧率,虽然返回True值,但是帧率并没有发生改变。

propld : property id
set(self, propId, value) 函数的定义,第一参数填写属性的id就是propId,当然也可以直接填写属性的全称例如,设置帧的宽度:

cap.set(3, 1080)
等价于
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1080)

第一中设置属性比较简单,第二种设置属性比较直观

set(self, propId, value): 对应的所有属性表如下:

参数propld功能
cv2.CAP_PROP_POS_MSEC0视频文件的当前位置(以毫秒为单位)或视频捕获时间戳
cv2.CAP_PROP_POS_FRAMES1基于0的索引将被解码/捕获下一帧
cv2.CAP_PROP_POS_AVI_RATIO2视频文件的相对位置:0 - 视频的开始,1 - 视频的结束
cv2.CAP_PROP_FRAME_WIDTH3帧的宽度
cv2.CAP_PROP_FRAME_HEIGHT4帧的高度
cv2.CAP_PROP_FPS5帧速
cv2.CAP_PROP_FOURCC64个字符表示的视频编码器格式
cv2.CAP_PROP_FRAME_COUNT7帧数
cv2.CAP_PROP_FORMAT8byretrieve()返回的Mat对象的格式
cv2.CAP_PROP_MODE9指示当前捕获模式的后端特定值
cv2.CAP_PROP_BRIGHTNESS10图像的亮度(仅适用于相机)
cv2.CAP_PROP_CONTRAST11图像对比度(仅适用于相机)
cv2.CAP_PROP_SATURATION12图像的饱和度(仅适用于相机)
cv2.CAP_PROP_HUE13图像的色相(仅适用于相机)
cv2.CAP_PROP_GAIN14图像的增益(仅适用于相机)
cv2.CAP_PROP_EXPOSURE15曝光(仅适用于相机)
cv2.CAP_PROP_CONVERT_RGB16表示图像是否应转换为RGB的布尔标志
cv2.CAP_PROP_WHITE_BALANCE17目前不支持
cv2.CAP_PROP_RECTIFICATION18立体摄像机的整流标志

get(self, propId):函数的作用是获取摄像头设置的相关属性值,官方给出的定义如下:

    def get(self, propId): # real signature unknown; restored from __doc__
        """
        get(propId) -> retval
        .   @brief Returns the specified VideoCapture property
        .   
        .   @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...)
        .   or one from @ref videoio_flags_others
        .   @return Value for the specified property. Value 0 is returned when querying a property that is
        .   not supported by the backend used by the VideoCapture instance.
        .   
        .   @note Reading / writing properties involves many layers. Some unexpected result might happens
        .   along this chain.
        .   @code {.txt}
        .   `VideoCapture -> API Backend -> Operating System -> Device Driver -> Device Hardware`
        .   @endcode
        .   The returned value might be different from what really used by the device or it could be encoded
        .   using device dependent rules (eg. steps or percentage). Effective behaviour depends from device
        .   driver and API Backend
        """

注意:

并非所有的参数都支持所有的摄像机 – 实际上,它们是OpenCV库中最麻烦的部分之一。每种摄像机类型 – 从android摄像机到usb摄像机到专业摄像机提供了一个不同的接口来设置其参数。并且在OpenCV代码中有许多分支来支持尽可能多的分支,但当然不是所有的可能性都被覆盖。
你可以做的是调查你的相机驱动程序,做一个补丁OpenCV,并发送到code.opencv.org。这样别人就会喜欢你的工作,就像你喜欢别人的一样。

Reference:
1、https://segmentfault.com/a/1190000015575701
2、https://blog.csdn.net/qq_31077649/article/details/75194719
3、http://zhaoxuhui.top/blog/2017/05/05/%E5%9F%BA%E4%BA%8EPython%E7%9A%84OpenCV%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%863.html

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

  • 44
    点赞
  • 251
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是使用OpenCV摄像头获取图像并进行压缩保存的Python代码,附有详细注释: ```python import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) # 设置图像编解码器 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 设置保存视频的文件名和编解码器、帧率以及分辨率 out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) while True: # 读取摄像头捕获的帧 ret, frame = cap.read() # 缩小图像尺寸 frame = cv2.resize(frame, (320, 240)) # 将帧写入输出视频 out.write(frame) # 显示帧 cv2.imshow('frame', frame) # 如果按下q键,则退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头和输出视频 cap.release() out.release() # 关闭所有OpenCV窗口 cv2.destroyAllWindows() ``` 逐行解释: 1. 导入OpenCV模块 ```python import cv2 ``` 2. 打开摄像头 ```python cap = cv2.VideoCapture(0) ``` 其,参数0表示打开默认的摄像头设备,如果有多个摄像头,则可以使用不同的数字来表示不同的设备。 3. 设置图像编解码器 ```python fourcc = cv2.VideoWriter_fourcc(*'XVID') ``` OpenCVVideoWriter_fourcc函数用于设置视频编解码器,常用的编解码器包括XVID、MJPG、DIVX等。 4. 设置保存视频的文件名和编解码器、帧率以及分辨率 ```python out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) ``` 其,参数'output.avi'表示保存视频的文件名,fourcc表示编解码器,20.0表示帧率,(640, 480)表示视频分辨率。 5. 循环读取摄像头捕获的帧 ```python while True: ret, frame = cap.read() ``` 其,cap.read()函数返回两个值:ret表示是否成功读取到帧,frame表示读取到的帧。 6. 缩小图像尺寸 ```python frame = cv2.resize(frame, (320, 240)) ``` 使用cv2.resize函数将读取到的帧缩小为320x240的尺寸,以减小输出视频的大小。 7. 将帧写入输出视频 ```python out.write(frame) ``` 使用out.write函数将读取到的帧写入输出视频。 8. 显示帧 ```python cv2.imshow('frame', frame) ``` 使用cv2.imshow函数显示读取到的帧,其'frame'表示窗口的名称,frame表示要显示的帧。 9. 如果按下q键,则退出 ```python if cv2.waitKey(1) & 0xFF == ord('q'): break ``` 使用cv2.waitKey函数等待键盘输入,如果按下q键,则退出循环。 10. 释放摄像头和输出视频 ```python cap.release() out.release() ``` 使用cap.release()函数和out.release()函数释放摄像头和输出视频资源。 11. 关闭所有OpenCV窗口 ```python cv2.destroyAllWindows() ``` 使用cv2.destroyAllWindows()函数关闭所有OpenCV窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值