真的非常迷 - -
双目摄像头通过一根usb与电脑连接,如果直接这样会报错。但是调用摄像头0和1(电脑摄像头和双目左)或0和2(电脑摄像头和双目右)都是可以的。
cap1 = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
cap2 = cv2.VideoCapture(2 + cv2.CAP_DSHOW)
while True:
ret1, frame1 = cap1.read()
et2, frame2 = cap2.read()
cv2.imshow('frame1', frame1)
cv2.imshow('frame2', frame2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cap1.release()
cv2.destroyAllWindows()
查了很久,发现是这样:https://bbs.csdn.net/topics/391889458
“
换台电脑试试吧
这事儿我去年遇到过 不是程序问题 同样的程序换了几台电脑跑 有的电脑可以同时以1208*720标清打开两个甚至3个摄像头
有的只能打开1路标清
但是分辨率改成640*480就能同时打开两路
结论就是USB总线带宽问题
是电脑的USB设备器件不行 传输带宽达不到同时开启两路视频的要求
现在的电脑主板都号称支持USB2.0 但制造商总会在你看不到的地方偷工减料 导致USB总线带宽不足
”
所以修改分辨率:
cap1 = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
cv2.VideoCapture.set(cap1, 3, 270) # 这里Property identifier要求是int
cv2.VideoCapture.set(cap1, 4, 270) # 见下图,3表示CV_CAP_PROP_FRAME_WIDTH,设为270.(设为1和270的效果一样)
# 注意顺序,先设置分辨率,再实例化另一个摄像头。否则依旧报错。
cap2 = cv2.VideoCapture(2 + cv2.CAP_DSHOW)
cv2.VideoCapture.set(cap2, 3, 1)
cv2.VideoCapture.set(cap2, 4, 1)
ret1, frame1 = cap1.read()
ret2, frame2 = cap2.read()
while ret1 and ret2:
ret1, frame1 = cap1.read()
ret2, frame2 = cap2.read()
cv2.imshow('frame1', frame1)
cv2.imshow('frame2', frame2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap1.release()
cap2.release()
cv2.destroyAllWindows()
扫描二维码关注公众号,回复:
12680491 查看本文章