无法使用 [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()
我想知道问题出在哪里,希望得到解决。
想法是调整框架大小而不必担心设置默认框架大小。您可以使用 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/
我正在尝试将视频捕获的 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()
我想知道问题出在哪里,希望得到解决。
想法是调整框架大小而不必担心设置默认框架大小。您可以使用 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/