列出Python中支持的OpenCV视频捕获属性

时间:2017-12-22 04:26:04

标签: python opencv

我正在尝试编写一个功能,可以自动确定特定网络摄像头支持哪组视频捕获属性。这对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,但这似乎更像是一个创可贴而不是治愈我。

所以,这是我的两个问题:

  1. 是否有可能在Python中捕获OpenCV视频错误?我该怎么做?

  2. 是否有更好的方法只获取支持的捕获属性列表?将v4l2-ctl作为子进程运行会更好,然后处理输出中的文本以确定捕获属性吗?

1 个答案:

答案 0 :(得分:0)

答案有点晚了,但也许还有其他人也有同样的问题。

获得不同的属性是opencv的错误,多年来存在。问题在于,v4l2设备有两个不同的库(v4l2和libv4l2)。使用libv4l2编译opencv会导致这些错误。

问题1:您看到的错误不是由python产生的,而是由基础opencv c ++代码产生的。看来,嘿直接写到了stdout。

问题2:如果在没有libv4l2的情况下编译了opencv,则您的代码应与v4l2-ctl完全相同。使用损坏的opencv版本时 您将无法设置任何CAP_PROP参数。