【发布时间】: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,但这对我来说更像是一种创可贴而不是治愈方法。
所以,这是我的两个问题:
是否可以在 Python 中捕获 OpenCV videoio 错误?我该怎么做?
有没有更好的方法来仅获取支持 捕获属性的列表?将
v4l2-ctl作为子进程运行,然后处理输出中的文本以确定捕获属性会更好吗?
【问题讨论】:
-
感谢发帖,遇到了同样的问题!!!