2016-06-09 530 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'的开源项目帮助我们找出解决方案