无法使用 [OpenCV] cv2.VideoCapture.set() 设置框架宽度和高度

Can't set frame width and height with [OpenCV] cv2.VideoCapture.set()

我正在尝试将视频捕获的 frame/window 大小减小到 320x180,但我似乎做不到。我正在使用 Windows 适用于 Xbox One 的 Kinect,它使用适配器连接到我的电脑。

我尝试将 cv2.CAP_PROP_FRAME_WIDTH 设置为 320,将 cv2.CAP_PROP_FRAME_HEIGHT 设置为 180,但是一旦我尝试获取值,它就会 returns 1920 和 1080。我也尝试安装和重新安装Kinect SDK 和驱动程序。

import cv2
import numpy as np

vid = cv2.VideoCapture(0)

vid.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 180)
vid.set(cv2.CAP_PROP_FPS, 25)

print(vid.get(cv2.CAP_PROP_FPS))
print(vid.get(cv2.CAP_PROP_FRAME_WIDTH))

while True:
    ret, frame = vid.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

vid.release()
cv2.destroyAllWindows()

print output

我想知道问题出在哪里,希望得到解决。

想法是调整框架大小而不必担心设置默认框架大小。您可以使用 cv2.resize() to resize the original 1920x1080 frame into 320x180. But this method does not maintain aspect ratio. If you wanted to maintain aspect ratio, you can use the imutils 库代替 cv2.VideoCapture().set()imutils.resize() 函数调整框架大小并保持宽高比。将 width 参数更改为您想要的分辨率

import cv2
import imutils

cap = cv2.VideoCapture(0)

while(cap.isOpened()):
    ret, frame = cap.read()

    frame = imutils.resize(frame, width=320)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

终于我发现解决了这个问题

当您尝试设置随机分辨率时,如果该分辨率不可用,opencv 会设置最近的分辨率。

您可以运行下面的命令找出您的网络摄像头的所有可用分辨率。

uvcdynctrl -f

并且只设置那些分辨率。 (我的网络摄像头分辨率:1280x720、640x480、640x360)

vid.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

参考:https://techoverflow.net/2018/12/18/how-to-set-cv2-videocapture-image-size/