【问题标题】:Python OpenCV access webcam maximum resolutionPython OpenCV 访问网络摄像头最大分辨率
【发布时间】:2013-10-27 04:53:26
【问题描述】:

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

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

有人知道我能做什么吗?

【问题讨论】:

  • 相机是否在其他应用程序中捕捉 640x480 的视频
  • @goncalopp 所说的让我想到,他们可能会限制驱动程序中 视频流 (带宽)的分辨率,而他们的应用程序仍然能够采用 单张更高分辨率的照片。
  • 你知道 cv2 中的代码吗,就像不要混合 cv 和 cv2。有什么想法吗?

标签: python opencv webcam resolution logitech


【解决方案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)

希望对你有帮助!

【讨论】:

  • 这个是为我做的。谢谢!!
  • 太棒了!这成功了,而且它的启动速度比标准后端快得多
  • MERCI BEAUCOUP,cv2.CAP_DSHOW 解决了一切。我在这个问题上花了两个小时。有关信息,该代码在 Windows 7 上适用于 Logitech C310,但在 Windows 10 上没有更多信息。
  • 改用cv2.resize方法不是更快吗?
  • 它的 cam 不是 cap
【解决方案2】:

我使用不同的分辨率通过循环设置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))

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 这是正确的,尝试(7680, 4320) 给我(1280.0, 720.0),这是我相机的最大分辨率。
    【解决方案4】:

    对于 cv2 只需更改为这个。

        cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
    

    【讨论】:

      【解决方案5】:

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

      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】:

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

        1. '320.0x240.0':'好的'
        2. '640.0x480.0':'OK'
        3. '1280.0x720.0':'OK'

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

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

        frame = imutils(frame, width = 720)
        

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

        print(frame.shape)
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多