27

我正在尝试使用导入 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)

代码工作正常,除了相机默认分辨率为 640x480,我的代码似乎只能设置低于该值的分辨率值。例如,我可以将图像大小设置为 320x240,但无法将其更改为 800x600。我没有出现错误:只需将分辨率设置为默认值(640x480),因为我尝试将其设置为更高的值。

我正在使用的相机(没有其他网络摄像头连接到计算机)是 QuickCam V-UBK45:使用罗技提供的软件,我能够以全分辨率(1280x960)和所有中间分辨率(例如 800x600)拍照.

因此,硬件支持这些帧大小,但我的代码无法访问它们。

有谁知道我能做什么?

4

7 回答 7

19

上面提到的问题是由相机驱动程序引起的。我能够使用 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 文档

我希望这可以帮助你!

于 2019-07-03T16:44:21.623 回答
15

我使用不同的分辨率通过循环从常见分辨率列表中设置图像分辨率

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

似乎 OpenCV 或我的相机只允许某些分辨率。

  • 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

于 2013-11-21T11:51:38.293 回答
8

我让它工作了,所以这篇文章是为其他遇到同样问题的人准备的:

我也在 Logitech C270 上运行。出于某种原因,即使网络摄像头支持 1280x720,它也只会显示 640x480。我的笔记本电脑中的内置网络摄像头仍然存在同样的问题。

如果我在代码中将其设置为 800x600,则显示为 640x480。但是,如果我将其设置为 1024x768,它将变为 800x600。如果我将它设置为 2000x2000 之类的愚蠢的东西,它就会变成 1280x720。

这是 OpenCV 3.0 上的 C++,但也许它也适用于 Python。

于 2015-06-11T15:40:56.377 回答
2

尝试以下代码以获得最大相机分辨率,使用它您可以使用最大分辨率捕获照片或视频:

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)
于 2020-10-20T11:19:50.677 回答
2

对于 cv2 只需更改为这个。

    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
于 2017-12-07T20:11:24.197 回答
1

OpenCV 现在只允许这些分辨率。

  1. “320.0x240.0”:“好的”
  2. “640.0x480.0”:“好的”
  3. “1280.0x720.0”:“好的”

来源:https ://www.learnpythonwithrune.org/find-all-possible-webcam-resolutions-with-opencv-in-python/

这些是常见的决议。它可能支持更多的分辨率,你可以检查一下。如果找不到支持的分辨率。您还可以使用:

frame = imutils(frame, width = 720)

这会将您设置为更接近支持的分辨率。注意:使用您所需的宽度值并将其设置为更接近支持的分辨率,然后您可以使用以下命令检查支持的分辨率:

print(frame.shape)

imutils 方法完全基于经验和周围的测试。

于 2021-06-02T21:08:21.440 回答
-2

我和你有同样的问题,我无法在opencv不同的“应用程序”中获得更高的分辨率。但是使用罗技软件,我可以录制 720p 的视频(相机 C270)。经过几天的研究,我得出了与@break 相同的解释,即他们限制了驱动程序的分辨率。我放弃了,会买一个不同的,非罗技,一个......

于 2013-11-11T23:41:42.227 回答