C++ OpenCV:在捕获视频时更改视频捕获的分辨率

C++ OpenCV:在捕获视频时更改视频捕获的分辨率,c++,opencv,video-capture,C++,Opencv,Video Capture,我正在Windows 10 64位上使用OpenCV 3.1.0。我想能够设置分辨率的网络摄像头,而网络摄像头仍然工作。相机工作后很容易设置分辨率。但我无法设置摄像头拍摄时的分辨率 这是我的密码: cv::VideoCapture cap(0); cap.set(cv::CAP_PROP_FRAME_WIDTH, 0x7FFFFFFF); // working cap.set(cv::CAP_PROP_FRAME_HEIGHT, 0x7FFFFFFF); //

我正在Windows 10 64位上使用OpenCV 3.1.0。我想能够设置分辨率的网络摄像头,而网络摄像头仍然工作。相机工作后很容易设置分辨率。但我无法设置摄像头拍摄时的分辨率

这是我的密码:

cv::VideoCapture cap(0);
cap.set(cv::CAP_PROP_FRAME_WIDTH, 0x7FFFFFFF);          // working
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 0x7FFFFFFF);         // working

while (true) {
    cv::Mat frame;
    cap >> frame;
    if (!frame.data) continue;
    cv::imshow("test", frame);
    if (cv::waitKey(1) >= 0) break;

    int newHeight = 500 + rand() % 4 * 100;
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, newHeight);      // not working
}

int newHeight = 500 + rand() % 4 * 100;
cap.set(cv::CAP_PROP_FRAME_HEIGHT, newHeight);          // not working

我的最佳猜测是,网络摄像头不支持您尝试的CAP_PROP_FRAME_HEIGHT的值。如果将相机连接到Linux设备上,可以使用
v4l2 ctl-d 0--list formats ext
列出支持的视频格式。以下是Microsoft LifeCam影院的输出摘录:

索引:1
类型:视频捕获
像素格式:“MJPG”(压缩)
名称:运动JPEG
尺寸:640x480
间隔:离散0.033s(30.000 fps)
间隔:离散0.050秒(20.000 fps)
间隔:离散0.067s(15.000 fps)
间隔:离散0.100秒(10.000 fps)
间隔:离散0.133s(7.500fps)
尺寸:1280x720
间隔:离散0.033s(30.000 fps)
间隔:离散0.050秒(20.000 fps)
间隔:离散0.067s(15.000 fps)
间隔:离散0.100秒(10.000 fps)
间隔:离散0.133s(7.500fps)
...

我最近没有检查Windows上是否有类似于
v4l2 ctl
的东西,它用于从相机查询信息。UVC通常由最新的网络摄像头支持。

问题是我只设置了一个随机高度,而网络摄像头只支持其预设分辨率。因此,它会选择一个最匹配的预设分辨率来显示它。

我确信我的网络摄像头支持这一点。我从你的评论中得到了一个提示,找到了问题所在。谢谢你了。