【问题标题】:Can't change OpenCV video capture resolution无法更改 OpenCV 视频捕获分辨率
【发布时间】:2021-03-02 07:20:31
【问题描述】:

我遇到的问题是我无法更改 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() 更改宽度和高度。

【问题讨论】:

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

标签: c++ opencv


【解决方案1】:

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

每个后端都支持设备属性 (cv::VideoCaptureProperties) 以不同的方式或可能根本不支持任何属性。

在这个documentation中也提到了:

读/写属性涉及很多层。一些意想不到的 结果可能会沿着这条链发生。有效行为取决于 来自设备硬件、驱动程序和 API 后端

OpenCV Video I/O 模块似乎不支持您的摄像头后端。

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

【讨论】:

    【解决方案2】:

    原来错误出现在“if(!cap.open(0))”行中,我试图用它来检查 cap 是否已成功初始化。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2016-03-27
      • 1970-01-01
      • 2013-04-03
      • 2020-11-14
      • 2013-03-28
      相关资源
      最近更新 更多