为什么DSHOW可以控制白平衡而OpenCV不能?

Why DSHOW can control white balance but OpenCV cannot?

我正在开发一个 Windows 独立应用程序,它需要拍照然后进行编辑。

对于捕获和编辑,我使用的是 OpenCV。

为了在我的编辑过程中保持一致的行为,我想禁用自动曝光和自动白平衡。

我设法用 OpenCV 控制曝光,但不是白平衡。虽然,当我使用 DSHOW 面板时,我可以更改白平衡。

要打开 DSHOW 面板,我使用以下命令:

cam.set(cv2.CAP_PROP_SETTINGS, 1)

从 OpenCV 中,我可以读取白平衡值设置,但无法对其进行编辑(set(...) returns False 当我尝试这样做时)。而且我什至看不懂自动白平衡设置。

Auto WB  -1.0
XI Auto WB  -1.0
XI Manual WB  -1.0
WB Temp  -1.0
WB Blue U  5415.0
WB Red V  -1.0

根据我在网上阅读的内容,我们不能过分依赖此 API,因为大多数相机不符合规格。

我想知道 DSHOW 面板有什么 OpenCV 不能做的?

这是完整的脚本:

import cv2

# I choose DSHOW backend to be able to open
# the dshow settings window
cam = cv2.VideoCapture(0, cv2.CAP_DSHOW)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    if not ret:
        print("failed to grab frame")
        break
    cv2.imshow("test", frame)

    k = cv2.waitKey(1)

    # Quit
    if k == ord('q') or k == ord('Q'):
        print("Closing...")
        break
    # Open DShow control panel.
    elif k == ord('p') or k == ord('P'):
        print("Opening director show panel control...")
        print(cam.set(cv2.CAP_PROP_SETTINGS, 1))
    # Toggle white balance
    elif k == ord('t') or k == ord('T'):
        print("Change white balance value. Trying different things...")
        print(cam.set(cv2.CAP_PROP_AUTO_WB, 1))
        print(cam.set(cv2.CAP_PROP_AUTO_WB, 0))
        print(cam.set(cv2.CAP_PROP_AUTO_WB, True))
        print(cam.set(cv2.CAP_PROP_AUTO_WB, False))
        print(cam.set(cv2.CAP_PROP_XI_MANUAL_WB, 1))
        print(cam.set(cv2.CAP_PROP_XI_MANUAL_WB, 0))
        print(cam.set(cv2.CAP_PROP_XI_AUTO_WB, 1))
        print(cam.set(cv2.CAP_PROP_XI_AUTO_WB, 0))
    # Show white balance
    elif k == ord('w') or k == ord('W'):
        print("White balance settings :")
        print("Auto WB ", cam.get(cv2.CAP_PROP_AUTO_WB))
        print("XI Auto WB ", cam.get(cv2.CAP_PROP_XI_AUTO_WB))
        print("XI Manual WB ", cam.get(cv2.CAP_PROP_XI_MANUAL_WB))
        print("WB Temp ", cam.get(cv2.CAP_PROP_WB_TEMPERATURE))
        print("WB Blue U ", cam.get(cv2.CAP_PROP_WHITE_BALANCE_BLUE_U))
        print("WB Red V ", cam.get(cv2.CAP_PROP_WHITE_BALANCE_RED_V))

cam.release()

cv2.destroyAllWindows()

我设法使用 Direct Show 控制相机的自动白平衡和曝光。不幸的是,目前无法通过 OpenCV 完成此操作。