USB摄像机:OpenCV VideoCapture返回部分帧

2024-05-13 14:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个程序来处理来自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_WIDTHcv.CAP_PROP_FRAME_HEIGHT)更改为320x240或更小的分辨率会导致捕获一个完整的帧,但任何更大的都不会

我也尝试过用v4l2-ctl更改各种参数,但这也没用。在

我能做些什么来解决这个问题?在

下面是我的python代码:

^{pr2}$

当我使用笔记本电脑内置的网络摄像头(通常是/dev/video0)时,该代码可以正常工作,但是当我使用USB摄像头时,它会显示部分帧。在

我在ubuntu16.04上使用python2.7.12和opencv3.3.1


Tags: dev图像网络参数分辨率framecv摄像机
1条回答
网友
1楼 · 发布于 2024-05-13 14:18:43

可能默认情况下opencv会从你的网络摄像头请求未压缩的图像。这就是为什么当你降低分辨率或FPS时,你会得到一个完整的图像,否则带宽对于整个图像来说是不够的。在

您可以尝试设置编解码器cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))。在

相关问题 更多 >