【问题标题】:How to change cv::Mat image dimensions dynamically?如何动态更改 cv::Mat 图像尺寸?
【发布时间】:2020-03-31 07:28:38
【问题描述】:

我想声明一个 cv::Mat 对象并在我的代码中的其他地方更改它的维度(nrows 和 ncols)。我在 OpenCV 的文档中找不到任何方法。他们总是建议在构造函数中包含维度。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    一个简单而干净的方法是使用create() 方法。你可以任意调用它,当它的参数与现有缓冲区不匹配时,它会重新分配图像缓冲区:

    Mat frame;
    
    for(int i=0;i<n;i++)
    {
        ...
        // if width[i], height[i] or type[i] are != to those on the i-1
        // or the frame is empty(first loop)
        // it allocates new memory
        frame.create(height[i], width[i], type[i]); 
        ... 
        // do some processing
    }
    

    文档可在https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html#a55ced2c8d844d683ea9a725c60037ad0获取

    【讨论】:

    • 不会 create() 破坏原始图像吗?我以为你必须使用调整大小
    • 你说得对 Mat::create 取消引用之前的数据 docs.opencv.org/modules/core/doc/… 而 Mat::resize 保留它就像 STL 向量类 docs.opencv.org/modules/core/doc/…
    • 由于我懒得解释的原因,resize() 不能作为 STL 容器的函数工作,而 create() 在这种情况下可以完成工作。仅当新大小与原始大小不匹配时才会重新分配。
    • 你混淆了论点。它是 void create (int rows, int cols, int type)。因此,frame.create(height, width, type)。
    【解决方案2】:

    如果您要调整图片大小,请查看resize()

    使用您想要的维度和数据类型创建一个新的Mat dst,然后:

    cv::resize(src, dst, dst.size(), 0, 0, cv::INTER_CUBIC);
    

    除了cv::INTER_CUBIC,还有其他的插值方法,查看文档。

    【讨论】:

    • 感谢 karl,但我的问题是我想动态定义 cv::Mat 对象的类型和维度。 resize() 可能是一种解决方案,但这并不是我想要的。
    • 好吧,我已经为此目的使用了resize()(据我所知),次数多得我数不清了。每当您需要更改 src Mat 的尺寸时,您只需声明一个具有所需尺寸和类型的新 Mat,然后执行 resize() 以便将数据缩放到新尺寸。如果您愿意,您仍然可以执行src = dst.clone(); 将重新标注的数据复制到原始 Mat。
    【解决方案3】:

    您是否只想使用您这样计算的Size 变量来定义它?

    // dynamically compute size...
    Size dynSize(0, 0);
    dynSize.width = magicWidth();
    dynSize.height = magicHeight();
    
    int dynType = CV_8UC1;
    // determine the type you want...
    
    Mat dynMat(dynSize, dynType);
    

    【讨论】:

    • 谢谢!我想我找到了解决方案,声明 cv::Mat image;并在其他地方通过调用 create() as image.create(magicWidth(), magicHeight(), dynType); 来动态更改其属性;
    • 是的,create() 绝对应该在你声明了Mat 对象之后与构造函数做同样的事情。
    【解决方案4】:

    如果您知道最大尺寸并且只需要使用总 Mat 中的行/列的子范围,请使用函数 cv::Mat::rowRange 和/或 cv::Mat::colRange

    http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-rowrange

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2018-02-11
      • 2021-12-31
      • 2011-09-26
      相关资源
      最近更新 更多