在创建完 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