无法使用 [OpenCV] cv2 设置帧宽和帧高。VideoCapture.set()



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

我尝试将cv2.CAP_PROP_FRAME_WIDTH设置为 320,cv2.CAP_PROP_FRAME_HEIGHT设置为 180,但一旦我尝试获取值,它就会返回 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()

打印输出

我希望帮助了解问题的根源,并希望得到修复。

这个想法是调整框架大小,而不必担心设置默认框架大小。您可以使用cv2.resize()将原始1920x1080帧的大小调整为320x180,而不是使用cv2.VideoCapture().set()。但是这种方法不能保持纵横比。如果要保持纵横比,可以使用imutils库。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/

最新更新