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



我遇到的问题是无法更改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对象(即VideoCapture cap(0, CAP_DSHOW)(时,我已经尝试过显式地更改后端API。我试过DSHOWFFMPEGIMAGES

我试过在不同的计算机上运行相同的程序。

结果始终是相同的640x480分辨率。

有什么简单的东西我错过了吗?我在SO上找到的其他帖子似乎都指向使用cap.set()来更改宽度和高度。

这取决于你的相机后端是什么。正如文档所说:

每个后端都支持设备属性(cv::VideoCaptureProperties(或者可能根本不支持任何属性。

本文档中还提到:

读取/写入属性涉及许多层。有些意外结果可能会沿着这个链条发生。有效行为取决于从设备硬件、驱动程序和API后端

OpenCV视频I/O模块似乎不支持您的相机后端。

注意:我也遇到过这样的相机,其中一些相机的分辨率不同,使用的数字也不同。例如,您可以通过尝试VideoCaptur(-1)VideoCapture(1)VideoCapture(2)。。。

发现错误在;如果(!cap.open(0((";我试图用来检查cap是否已成功初始化的行。

我的印象是,如果视频捕捉对象是打开的,那么open只是返回true,否则就是false。但如果视频捕获对象已经打开,它实际上会释放它,然后重新打开它

长话短说,这意味着当用cap.open(0(重新打开对象时,我用来更改分辨率的cap.set((调用被删除。此时,分辨率被设置回默认值640x480。

我正在寻找的方法是cap.isOpened((,如果对象是打开的,它只返回true或false。一个简单愚蠢的错误。

最新更新