簡體   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