不幸的是,opencv 中的 C4V2 调用不适用于我使用 UVC 驱动程序开箱即用的任何相机进行静态图像捕获。
为了调试我一直在尝试使用直接调用 c4v2 的 c 代码来完成此操作的问题。
我一直在玩这里找到的示例代码。它使用从视频流中拉帧的方法。
你可以编译它:
gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename
我已经尝试了 3 台罗技相机。最好的似乎是罗技 C910。但即使它也存在重大问题。
以下是我在尝试使用此代码完成相同任务时遇到的问题。
它几乎每次都适用,宽度和高度设置为 1920x1080。
当我直接从命令行查询其他可能性时,例如:
v4l2-ctl --list-formats-ext
我尝试了一些其他“可用”的较小尺寸,它挂在等待相机释放缓冲区的选择中。
此外,当我尝试直接从命令行设置其他尺寸时,例如:
v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV
然后检查
v4l2-ctl -V
我发现它返回正确的像素格式,但通常不是正确的大小。
显然,这款在 UVC 网站上列为 UVC 并因此兼容 v4l2 的相机无法满足要求。我怀疑这对其他相机同样糟糕。我试过的另外两个在网站上也被列为兼容但问题更严重。
发布此消息后,我对 LogitechC910 进行了更多测试。我想我会发布结果,以防它帮助别人。
我写了一个脚本来测试上面提到的 v4l2 采集器代码,当它被 v4l2 查询时,相机声称它支持的所有格式是结果:
640x480 => Hangs on clearing buffer
160x120 => Works
176x144 => Works
320x176 => Works
320x240 => Works
432x240 => Works
352x288 => Works
544x288 => Works
640x360 => Works
752x416 => Hangs on clearing buffer
800x448 => Hangs on clearing buffer
864x480 => Works
960x544 => Works
1024x576 => Works
800x600 => Works
1184x656 => Works
960x720 => Works
1280x720 => Works
1392x768 => Works
1504x832 => Works
1600x896 => Works
1280x960 => Works
1712x960 => Works
1792x1008 => Works
1920x1080 => Works
1600x1200 => Works
2048x1536 => Works
2592x1944 => Hangs on clearing buffer.
事实证明,640x480 的默认设置不起作用,这就是困扰我和大多数在留言板上发帖的人的原因。
由于它正在抓取视频帧,因此它在启动时抓取的第一帧可能有不正确的曝光(通常是黑色或接近它)。我相信这是因为由于它被用作摄像机,它会随时调整曝光并且不关心第一帧。我相信这也让我和其他看到第一帧为黑色或接近黑色并认为这是某种错误的人陷入了困境。后面的帧有正确的曝光
事实证明,如果您避开上面列出的地雷并忽略所有错误消息,那么带有 python 包装器的 opencv 可以在这台相机上正常工作。错误消息是由于相机接受 v4l2 命令时它没有正确响应的事实。因此,如果您设置宽度,它实际上会正确设置,但它会以不正确的宽度响应。
要使用 python 包装器在 opencv 下运行,您可以执行以下操作:
import cv2
import numpy
cap = cv2.VideoCapture(0) #ignore the errors
cap.set(3, 960) #Set the width important because the default will timeout
#ignore the error or false response
cap.set(4, 544) #Set the height ignore the errors
r, frame = cap.read()
cv2.imwrite("test.jpg", frame)