繁体   English   中英

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

[英]List supported OpenCV video capture properties in Python

我正在尝试编写一个函数来自动确定特定网络摄像头支持哪组视频捕获属性。 使用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 语句中,则不会捕获上面的 videoio 错误,因此就好像我根本没有 try-except 一样。 按照本答案中的建议将 except 子句专门cv2.error对我不起作用。 我可以按照这个答案中的建议将输出重新路由到 dev/null ,但这对我来说更像是创可贴而不是治愈。

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

  1. 是否可以在 Python 中捕获 OpenCV videoio 错误? 我怎么做?

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

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

你得到不同的属性是opencv的一个错误,多年来一直存在。 问题是, v4l2-devices 有两个不同的库( v4l2 和 libv4l2 )。 使用 libv4l2 编译 opencv 会导致这些错误。

问题1:你看到的错误不是python产生的,而是底层opencv c++代码产生的。 好像嘿嘿直接写到stdout了。

问题 2:当您在没有 libv4l2 的情况下编译 opencv 时,您的代码应该给出与 v4l2-ctl 完全相同的列表。 使用损坏的 opencv-version 时,您无法设置任何 CAP_PROP 参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM