Python OpenCV访问网络摄像头的最大分辨率

Ste*_*Ste 12 python webcam opencv resolution logitech

我正在尝试使用导入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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

有谁知道我能做什么?

dug*_*ggi 9

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

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))
Run Code Online (Sandbox Code Playgroud)

是我得到了什么.

似乎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


ube*_*lig 6

我得到了它的工作,所以这篇文章是针对遇到同样问题的其他人的:

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

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

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

  • 这是正确的,尝试`(7680, 4320)` 给我`(1280.0, 720.0)`,这是我相机的最大分辨率。 (2认同)

小智 5

上述问题是由相机驱动程序引起的。我可以使用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]))
Run Code Online (Sandbox Code Playgroud)

在OpenCV文档中,我为那些想进一步了解OpenCV后端的人提供了以下信息(OpenCV docs

希望对您有所帮助!

  • 这个人为我做到了。谢谢你!! (2认同)
  • 伟大的!这成功了,而且它的启动速度比标准后端快得多 (2认同)
  • MERCI BEAUCOUP,cv2.CAP_DSHOW 解决了一切。我在这个问题上花了两个小时。有关信息,该代码在没有它的情况下可以在 Windows 7 上的 Logitech C310 上运行,但在具有相同摄像头的 Windows 10 上不再运行。 (2认同)