簡體   English   中英

Python OpenCV 訪問網絡攝像頭最大分辨率

[英]Python OpenCV access webcam maximum resolution

我正在嘗試使用導入 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)拍照.

因此,硬件支持這些幀大小,但我的代碼無法訪問它們。

有誰知道我能做什么?

上面提到的問題是由相機驅動程序引起的。 我能夠使用 Direct Show 作為后端來修復它。 我讀到(對不起,但我不記得在哪里)幾乎所有的相機都提供了一個允許它們從 DirectShow 使用的驅動程序。 因此,我在 Windows 中使用 DirectShow 與相機進行交互,我能夠根據需要配置分辨率,並獲得相機的原始縱橫比 (16:9)。

你可以試試這個代碼,看看它是否適合你:

import cv2

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # this is the magic!

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

r, frame = cap.read()
...
print('Resolution: ' + str(frame.shape[0]) + ' x ' + str(frame.shape[1]))

在 OpenCV 文檔中,我為那些想了解更多關於 OpenCV 后端的人找到了以下信息( OpenCV 文檔

我希望這可以幫助你!

我使用不同的分辨率通過循環從常見分辨率列表中設置圖像分辨率

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

我讓它工作了,所以這篇文章是為其他遇到同樣問題的人准備的:

我也在 Logitech C270 上運行。 出於某種原因,即使網絡攝像頭支持 1280x720,它也只會顯示 640x480。 我的筆記本電腦中的內置網絡攝像頭仍然存在同樣的問題。

如果我在代碼中將其設置為 800x600,則顯示為 640x480。 但是,如果我將其設置為 1024x768,它將變為 800x600。 如果我將它設置為 2000x2000 之類的愚蠢的東西,它就會變成 1280x720。

這是 OpenCV 3.0 上的 C++,但也許它也適用於 Python。

嘗試以下代碼以獲得最大相機分辨率,使用它您可以使用最大分辨率捕獲照片或視頻:

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)

對於 cv2 只需更改為這個。

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

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 方法完全基於經驗和周圍的測試。

我和你有同樣的問題,我無法在opencv不同的“應用程序”中獲得更高的分辨率。 但是使用羅技軟件,我可以錄制 720p 視頻(相機 C270)。 經過幾天的研究,我得出了與@break 相同的解釋,即他們限制了驅動程序中的分辨率。 我放棄了,會買一個不同的,非羅技,一個......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM