【问题标题】:List supported OpenCV video capture properties in Python列出 Python 中支持的 OpenCV 视频捕获属性
【发布时间】:2017-12-22 04:26:04
【问题描述】:

我正在尝试编写一个函数来自动确定特定网络摄像头支持哪些视频捕获属性集。使用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。按照this answer 中的建议将except 子句专门用于cv2.error 对我不起作用。我可以按照this answer 中的建议将输出重新路由到 dev/null,但这对我来说更像是一种创可贴而不是治愈方法。

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

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

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

【问题讨论】:

  • 感谢发帖,遇到了同样的问题!!!

标签: python opencv


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2016-01-09
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多