[英]Can't change webcam resolution with OpenCV in Python (Windows)
[英]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 現在只允許這些分辨率。
來源: 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.