我正在尝试使用导入OpenCV的python代码从我的网络摄像头获取图像。代码如下:
import sys
sys.path.append("C:\\opencv\\build\\python\\2.7")
import cv2
import cv2.cv as cv
import time
# Set resolution
cap = cv2.VideoCapture(0)
print "Frame default resolution: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 600)
print "Frame resolution set to: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
# Acquire frame
capture = cv.CreateCameraCapture(0)
img = cv.QueryFrame(capture)
代码工作正常,但Camera默认分辨率为640x480,我的代码似乎只能设置低于此值的分辨率值。例如,我可以将图像大小设置为320x240,但我无法将其更改为800x600。我没有出现错误:只需将分辨率设置为默认值(640x480),因为我尝试将其设置为更高的值。
我正在使用的相机(没有其他网络摄像头连接到计算机)是QuickCam V-UBK45:使用Logitech提供的软件,我能够以全分辨率(1280x960)和所有中间分辨率拍摄照片(例如800x600)。
因此,硬件支持这些帧大小,但我的代码无法访问它们。
有谁知道我能做什么?
答案 0 :(得分:8)
我使用不同的分辨率通过循环
从List of common resolutions设置图像分辨率def set_res(cap, x,y):
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, int(x))
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, int(y))
return str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)),str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT))
和this就是我得到的。
似乎cv或我的相机只允许某些分辨率。
160.0 x 120.0
176.0 x 144.0
320.0 x 240.0
352.0 x 288.0
640.0 x 480.0
1024.0 x 768.0
1280.0 x 1024.0
答案 1 :(得分:5)
我让它发挥作用,所以这篇文章适用于遇到同样问题的其他人:
我也在Logitech C270上运行。出于某种原因,即使网络摄像头支持1280x720,它也只会显示640x480。我的笔记本电脑中的内置网络摄像头仍然存在同样的问题。
如果我在代码中将其设置为800x600,则显示为640x480。但是,如果我将其设置为1024x768则变为800x600。如果我将它设置为像2000x2000这样愚蠢的东西,它就会变成1280x720。
这是在OpenCV 3.0上的C ++中,但也许它也适用于Python。
答案 2 :(得分:2)
对于cv2,只需更改为此。
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
答案 3 :(得分:1)
上述问题是由相机驱动程序引起的。我可以使用Direct Show作为后端对其进行修复。我读到(很抱歉,但我不记得在哪里)几乎所有的相机都提供了一个驱动程序,可以在DirectShow中使用它们。因此,我在Windows中使用DirectShow与摄像头进行交互,因此可以根据需要配置分辨率,还可以获取摄像头的原始纵横比(16:9)。 您可以尝试使用此代码,看看它是否适合您。
import cv2
cam = cv2.VideoCapture(0,cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
r, frame = cam.read()
...
print('Resolution: ' + str(frame.shape[0]) + ' x ' + str(frame.shape[1]))
在OpenCV文档中,我为那些想进一步了解OpenCV后端(OpenCV docs)的人提供了以下信息
希望这对您有帮助!
答案 4 :(得分:0)
我和你有同样的问题,我无法在opencv
不同的“应用程序”中获得更高的分辨率。但是使用罗技软件,我能够以720p录制视频(摄像机C270)。经过几天的研究,我得到了与@break相同的解释,他们限制了驱动程序中的分辨率。我放弃了,会买一个不同的非Logitech,一个......
答案 5 :(得分:0)
尝试以下代码以获得最大相机分辨率,使用它可以使用最大分辨率捕获照片或视频:
import cv2
HIGH_VALUE = 10000
WIDTH = HIGH_VALUE
HEIGHT = HIGH_VALUE
capture = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
capture.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(width,height)
答案 6 :(得分:0)
OpenCV 现在只允许这些分辨率。
来源:https://www.learnpythonwithrune.org/find-all-possible-webcam-resolutions-with-opencv-in-python/
这些是常见的分辨率。它可能支持更多的分辨率,您可以查看。 如果找不到支持的分辨率。您还可以使用:
frame = imutils(frame, width = 720)
这会将您设置为更接近支持的分辨率。 注意:使用您需要的宽度值并将其设置为更接近支持的分辨率,然后您可以使用以下方法检查支持的分辨率:
print(frame.shape)
imutils 方法完全基于经验和测试。