【问题标题】:Can't change webcam resolution with OpenCV in Python (Windows)无法在 Python (Windows) 中使用 OpenCV 更改网络摄像头分辨率
【发布时间】:2016-06-09 10:10:47
【问题描述】:

我正在使用 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 更改为较低也没有效果

请帮帮我:)

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    最后我在 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”开源项目帮助找出解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      相关资源
      最近更新 更多