在创建完 VideoCapture 对象并成功打开摄像头后,可以使用函数 video.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,详情可以见下表。与get方法对应的就是set方法,因此其中的一些值可以使用video.set(propId, value) 来修改,value 就是你想要设置成的新值。查看摄像头的分辨率可以使用 video.shape 函数,其中前两个值分别是高、宽值。除此常用方法外,还可以使用 video.get(3)video.get(4),前者对应摄像头的宽,后者对应高。默认情况下,摄像头的分辨率的为:640X480,我们可以使用set方法对其修改,如改为320X240: video.set(3, 320), video(4, 240)

方法释义
cv2.VideoCapture.get(0)视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3)在视频流的帧的宽度
cv2.VideoCapture.get(4)在视频流的帧的高度
cv2.VideoCapture.get(5)帧速率
cv2.VideoCapture.get(6)编解码的4字-字符代码
cv2.VideoCapture.get(7)视频文件中的帧数
cv2.VideoCapture.get(8)返回对象的格式
cv2.VideoCapture.get(9)返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)色调图像(仅适用于照相机)
cv2.VideoCapture.get(14)图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)曝光(仅适用于照相机)
cv2.VideoCapture.get(16)指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)× 暂时不支持
cv2.VideoCapture.get(18)立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

下面是一个完整的设置摄像头分辨率的demo (以下两种设置方式均可):

import cv2

if __name__ == "__main__":
    webcam = cv2.VideoCapture(0)
    
    if not webcam.isOpened():
        print("can't open the camera!!!")
    # cv2.namedWindow("video", 0)
    # cv2.resizeWindow("video", 960, 720)
    # method 1:
    webcam.set(3, 1920)  # width=1920
    webcam.set(4, 1080)  # height=1080
    # method 2:
    # webcam.set(cv2.CAP_PROP_FRAME_WIDTH, 960)
    # webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
    while True:
        ret, frame = webcam.read()
        print(frame.shape[:2])  # just need the first two values.
        cv2.imshow("video", frame)
        # Hit 'q' on the keyboard to quit!
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Release handle to the webcam
    webcam.release()
    cv2.destroyAllWindows()

下面有趣的东西来了!!!
在 Windows 中,以上方法可以成功改变摄像头的分辨率,即如上代码中将分辨率设置为:1920X1080,但是在Linux(博主测试了Ubuntu16.04及Ubuntu18.04)中,上面的方法却不完全成功,分辨率的确改变了,但是却改为了:800X600,即最大分辨率为:800X600。(注: 博主只是发现了这一现象,却没搞懂其中原理,如有大牛看到此问题,请不吝赐教)

-------------------------------------------------------------手动分割线-------------------------------------------------------------------


以下方法可以用来改变窗口的显示大小,但是不等于摄像头的分辨率。(不相信的伙伴可以自己试试)

cv2.namedWindow("video", 0)  # 0 即 cv2.WINDOW_NORMAL,表示可以自己调整窗口大小。注意:此“winname”参数应与后面的inshow()中一致。
cv2.resizeWindow("video", 960, 720)  # 修改窗口大小为960X720

参考文献

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐