2016-06-09 293 views
2

我正在使用Microsoft LifeCam HD 3000. 默認分辨率爲640x480,但支持1280x720。用於改變分辨率爲OpenCV的使用Python中的OpenCV無法更改網絡攝像頭分辨率(Windows)

公共代碼也沒有影響:

video_capture = cv2.VideoCapture(0) 

print video_capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 1280) 
print video_capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 720) 

print video_capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH) 
print video_capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT) 

輸出:

True 
True 
640.0 
480.0 
  • 在不同的軟件,例如OBS工作室的攝像頭很容易向配置1280×720。
  • 也試過任何支持的分辨率,但結果是一樣的
  • 要求高的分辨率也並沒有影響

請幫我之前更改FPS較低:)

回答

0

最後我發現了一個問題OpenCV資源並解決它。

MS Lifecam HD3000僅適用於YUY2格式,也需要精確的分辨率才能被請求,或者只是拒絕它(有些相機只選擇最接近的分辨率)。

我不得不修改 'cap_dshow.cpp' 來計算在對應於正確YUY2方式解析請求(每像素2個字節):

原始代碼[靜態布爾setSizeAndSubtype(...)]:

//buffer size 
if (mediatype == MEDIASUBTYPE_RGB24) 
{ 
    VD->pAmMediaType->lSampleSize = attemptWidth*attemptHeight*3; 
} 
else 
{ 
    // For compressed data, the value can be zero. 
    VD->pAmMediaType->lSampleSize = 0; 
} 

更換,以

if (mediatype == MEDIASUBTYPE_RGB24) { 
    VD->pAmMediaType->lSampleSize = attemptWidth*attemptHeight * 3; 
} 
else if ((mediatype == MEDIASUBTYPE_YUY2) || (mediatype == MEDIASUBTYPE_YVYU) || 
    (mediatype == MEDIASUBTYPE_UYVY)) { 

    VD->pAmMediaType->lSampleSize = attemptWidth*attemptHeight * 2; 
} 
else { 
    VD->pAmMediaType->lSampleSize = 0; 
} 

可能也會出現一些其他的格式和攝像頭的問題。我會在GitHub上打開一個問題

感謝'OBS Studio'的開源項目幫助我們找出解決方案