繁体   English   中英

使用Python中的OpenCV无法更改网络摄像头分辨率(Windows)

[英]Can't change webcam resolution with OpenCV in Python (Windows)

我使用的是Microsoft LifeCam HD 3000.默认分辨率为640x480,但支持1280x720。

更改OpenCV分辨率的常用代码不起作用:

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 studio这样的不同软件中,网络摄像头可轻松配置为1280x720。
  • 还试过任何支持的分辨率,但结果是一样的
  • 在请求高分辨率之前将FPS更改为较低也不起作用

请帮我:)

最后我在OpenCV源中发现了一个问题并解决了它。

MS Lifecam HD3000仅以YUY2格式工作,并且还要求精确的分辨率,或者它只是拒绝它(有些相机只选择最接近的一个)。

我必须修改'cap_dshow.cpp'以正确的方式计算与YUY2相对应的解析请求(每像素2个字节):

原始代码[static bool 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”开源项目,该项目有助于找到解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM