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

问题描述 投票:0回答:3

我正在尝试将视频捕获的帧/窗口大小减小到

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()

print output

我需要帮助了解问题的根源并希望得到解决。

python opencv video kinect video-capture
3个回答
14
投票

这个想法是调整框架大小,而不必担心设置默认框架大小。您可以使用

cv2.VideoCapture().set()
 来将原始 
cv2.resize()
框架调整为
1920x1080
,而不是使用
320x180
。但这种方法不保持纵横比。如果您想保持宽高比,可以使用
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()

6
投票

最后我发现解决了这个问题

当您尝试设置随机分辨率时,如果该分辨率不可用,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/


0
投票

还有另一种方法可以使用 cv2 调整屏幕尺寸

import cv2

image = cv2.imread("image.jpg")

width = 300
height = 300

new_image = cv2.resize(image, (width, height))

cv2.imwrite("new_image.jpg", new_image)
© www.soinside.com 2019 - 2024. All rights reserved.