无法更改OpenCV视频捕获分辨率

3
我遇到的问题是无法更改OpenCV视频捕获的分辨率。无论如何,分辨率始终为640x480。我使用的代码是用C++编写的,并且使用的是opencv 3.4.8。我创建了一个非常简单的程序来实现这一点,但无论我尝试什么都似乎不起作用。
以下是完整的代码:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char** argv)
{
    VideoCapture cap(0);
    cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
    cap.set(CAP_PROP_FRAME_WIDTH, 1920);


    // open the default camera, use something different from 0 otherwise;
    // Check VideoCapture documentation.
    if (!cap.open(0))
        return 0;
    for (;;)
    {
        Mat frame;
        cap.read(frame);
        if (frame.empty()) break; // end of video stream
        imshow("this is you, smile! :)", frame);
        if (waitKey(10) == 27) break; // stop capturing by pressing ESC 
    }
    // the camera will be closed automatically upon exit
    // cap.close();
    return 0;
}

当我运行上述代码时,帧的大小始终为640x480。
我尝试使用cap.set()方法将分辨率更改为更小或更高的分辨率。我正在使用ImageSource相机,并且我知道相机支持我尝试使用的这些分辨率,我可以在其他程序中查看以这些分辨率录制的视频。
我尝试使用不同的相机/网络摄像头。
我尝试在创建VideoCapture对象时显式更改后端API。例如:VideoCapture cap(0, CAP_DSHOW)。我尝试过DSHOWFFMPEGIMAGES等。
我尝试在不同的计算机上运行相同的程序。
结果始终是相同的640x480分辨率。
是否有什么简单的问题我遗漏了?我在SO上找到的每篇文章都只是指向使用cap.set()方法更改宽度和高度。

分享相机型号或链接可以帮助您解决这类问题。 - Yunus Temurlenk
@YunusTemurlenk 感谢您的回复!不幸的是,尝试“VideoCapture cap(1)”,“VideoCapture cap(2)”等并没有起作用。我们最初使用的相机是Imaging Source DMK 33GX183。但是,我已经在多台计算机上尝试了多个相机和网络摄像头。因此,这个问题似乎不是特定于成像源相机的。 - MrMiserMeister
2个回答

1
这取决于您的相机后端是什么。正如文档所述:
每个后端以不同的方式支持设备属性(cv :: VideoCaptureProperties),或者可能根本不支持任何属性。
此外,在此 documentation 中也提到:
读/写属性涉及许多层。在这条链上可能会发生一些意外结果。有效行为取决于设备硬件、驱动程序和API后端。
看起来您的相机后端不受OpenCV视频I/O模块支持。
注意:我也遇到过这种相机,其中一些不同分辨率使用不同的数字。例如,您可以通过尝试 VideoCaptur(-1)VideoCapture(1)VideoCapture(2) 等来捕获所需的分辨率。

1
原来错误在于我试图使用的"if(!cap.open(0))"行中。我本以为open只会返回true(如果视频捕获对象已经打开)或false(否则)。但实际上,它会释放视频捕获对象(如果它已经打开),然后重新打开它。
长话短说,这意味着当对象使用cap.open(0)重新打开时,我用来更改分辨率的cap.set()调用将被擦除。此时,分辨率将被设置回默认值640x480。
我正在寻找的方法是cap.isOpened(),它只会返回true或false,表示对象是否已经打开。这是一个简单而愚蠢的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接