我试图写一个函数,自动确定哪一组视频捕获属性是支持特定的摄像头。这对于v4l2-ctl来说很简单,但是我不知道如何使用OpenCV的内置函数来干净地完成它。使用v4l2-ctl,我将调用:
$ v4l2-ctl --device <webcam> --list-ctrls它为我的笔记本电脑集成网络摄像头(/dev/video0)和我插入的任何USB摄像头提供了一套不同的摄像头控制。到目前为止,在中,我所能做的最好的是:
def list_supported_capture_properties(cap: cv2.VideoCapture):
""" List the properties supported by the capture device.
"""
supported = list()
for attr in dir(cv2):
if attr.startswith('CAP_PROP'):
if cap.get(getattr(cv2, attr)) != -1:
supported.append(attr)
return supported当调用此函数时,OpenCV输出许多错误消息,如下所示:
VIDEOIO ERROR: V4L2: Autofocus is not supported by your device
VIDEOIO ERROR: V4L2: getting property #32 is not supported如果我将cap.get包装在Python语句中,那么上面的视频it错误就不会被捕获,所以就好像我根本没有尝试过一样--只是根本没有尝试。按照cv2.error中的建议,将for子句专门用于this answer并不适用于我。我可以按照this answer中的建议,将输出重路由到dev/null,但对我来说,这更像是一种创可贴,而不是一种解药。
以下是我的两个问题:
v4l2-ctl作为子进程运行,然后处理输出中的文本以确定捕获属性?发布于 2019-11-05 01:12:47
答案有点晚了,但也许还有其他人也有同样的问题。
获得不同的属性是opencv的一个缺陷,而opencv已经存在很多年了。问题是,v4l2设备有两个不同的库(v4l2和libv4l2)。用libv4l2编译opencv会导致这些错误。
问题1:您看到的错误不是由python产生的,而是由底层的opencv c++代码产生的。看来嘿是直接写出来的。
问题2:在没有libv4l2的情况下编译opencv时,您的代码应该给出与v4l2-ctl完全相同的列表。在使用损坏的opencv-版本时,您不能设置任何CAP_PROP参数。
https://stackoverflow.com/questions/47935846
复制相似问题