我正在尝试编写一个功能,可以自动确定特定网络摄像头支持哪组视频捕获属性。这对v4l2-ctl
很简单,但我不知道如何使用OpenCV的内置函数干净利落地完成它。使用v4l2-ctl
,我会调用:
$ v4l2-ctl --device <webcam> --list-ctrls
为我的笔记本电脑的集成网络摄像头(/dev/video0
)以及我插入的任何USB网络摄像头提供了一组不同的摄像头控制。到目前为止,在Python OpenCV中,我是最好的能做的是:
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 try语句中,则上面的视频错误不会被捕获,所以它就好像我没有尝试 - 除了根本没有。如this answer中所建议的那样,专门针对cv2.error
的except子句并不适用于我。我可以按照this answer的建议将输出重新路由到dev / null,但这似乎更像是一个创可贴而不是治愈我。
所以,这是我的两个问题:
是否有可能在Python中捕获OpenCV视频错误?我该怎么做?
是否有更好的方法只获取支持的捕获属性列表?将v4l2-ctl
作为子进程运行会更好,然后处理输出中的文本以确定捕获属性吗?
答案 0 :(得分:0)
答案有点晚了,但也许还有其他人也有同样的问题。
获得不同的属性是opencv的错误,多年来存在。问题在于,v4l2设备有两个不同的库(v4l2和libv4l2)。使用libv4l2编译opencv会导致这些错误。
问题1:您看到的错误不是由python产生的,而是由基础opencv c ++代码产生的。看来,嘿直接写到了stdout。
问题2:如果在没有libv4l2的情况下编译了opencv,则您的代码应与v4l2-ctl完全相同。使用损坏的opencv版本时 您将无法设置任何CAP_PROP参数。