python下使用opencv以MJPG读取usb摄像头
修改格式的原因
用 cap = cv2.VideoCapture(1)
打开usb双目摄像头时发现帧率很低,使用cap.set(cv2.CAP_PROP_FPS, 30)
设置FPS也无效。经搜索后得知该双目相机在YUY2格式,2560x720分辨率下的帧率只有3,而同分辨率下MJPG格式可以达到30帧
修改过程中遇到的问题
很多博客中给出的方案是在设置分辨率之前或者之后加入一句
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
但我在测试过程中发现不管将这条语句按哪个顺序来放都无效,于是上google尝试寻找答案。最后在https://www.kurokesu.com/main/2020/07/12/pulling-full-resolution-from-a-webcam-with-opencv-windows/上找到了可行的解决方案。
解决办法
- 在VideoCapture中添加一个参数cv2.CAP_DSHOW
- 在
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
之前加上一句cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('m', 'j', 'p', 'g'))
代码如下
cap = cv2.VideoCapture(1, cv2.CAP_DSHOW) # 这里要添加一个参数
# cap.set(cv2.CAP_PROP_FPS, 30) # 经测试这条语句没有作用,不知道为什么
# 下面这两条语句缺一不可,原因不明
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('m', 'j', 'p', 'g'))
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# 设置分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
之后成功以30帧获取2560x720的分辨率的图像