我正在开发一个程序来处理来自Ubuntu上USB摄像头的帧。目前我在python中使用OpenCV。当我试图使用cv2.VideoCapture
对象读取帧时,我只得到partial frames。在
我使用的相机是一个Kayeton GS1M2812USB摄像头,它声称兼容UVC。大多数应用程序(比如cheese)将摄像机列在可用的网络摄像机中,但不显示任何帧。另一方面,googlehangouts可以毫无问题地显示摄像机上的实时帧。在
我还可以使用streamer
成功捕获图像和视频。e、 g.:
streamer -c /dev/video1 -o capture.jpg
最初当我试图使用cv.VideoCapture
时,我得到了选择超时,没有图像。经过一番研究,我发现用nodrop=1
重新启动uvcvideo模块至少可以从opencv获得部分帧(就像上面链接的那样)。在
我尝试将uvcvideo超时参数设置为一个可笑的大值,并与所有其他参数和各种怪癖搞混了,但没有用。在
我确实发现,在每次调用read()
之前,将分辨率(cv.CAP_PROP_FRAME_WIDTH
和cv.CAP_PROP_FRAME_HEIGHT
)更改为320x240或更小的分辨率会导致捕获一个完整的帧,但任何更大的都不会
我也尝试过用v4l2-ctl
更改各种参数,但这也没用。在
我能做些什么来解决这个问题?在
下面是我的python代码:
^{pr2}$当我使用笔记本电脑内置的网络摄像头(通常是/dev/video0
)时,该代码可以正常工作,但是当我使用USB摄像头时,它会显示部分帧。在
我在ubuntu16.04上使用python2.7.12和opencv3.3.1
可能默认情况下opencv会从你的网络摄像头请求未压缩的图像。这就是为什么当你降低分辨率或FPS时,你会得到一个完整的图像,否则带宽对于整个图像来说是不够的。在
您可以尝试设置编解码器
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
。在相关问题 更多 >
编程相关推荐