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

标签 python opencv

我使用的是 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”开源项目帮助找到了解决方案

关于python - 无法在 Python (Windows) 中使用 OpenCV 更改网络摄像头分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722992/

相关文章:

python - `super()` 在 `__new__` 中有什么

python - '[08001][TPT][ODBC SQL Server Wire Protocol 驱动程序]无效的连接数据

python - OpenCV Python 和网络摄像头

python - 筛选列表

python - 更新新词典在 Python 中不起作用

python - SQLAlchemy:如何使用 SQLAlchemy 更改 MySQL 服务器系统变量?

opencv - 使用加速度计和机器学习进行运动类型检测

opencv - cv::Mat 矩阵,如何减少 cv::Mat 中小数点右边的数字?

python - 如何使用 cv2 保存二进制图像(dtype=bool)?

c - 将 Matlab 函数转换为 C 函数