合并两个 cv::Mat 而不复制数据

Posted

技术标签:

【中文标题】合并两个 cv::Mat 而不复制数据【英文标题】:Merge two cv::Mat without copying the data 【发布时间】:2013-01-06 18:05:11 【问题描述】:

考虑两个矩阵作为以下sample_method()方法的输入参数,我想将m1m2这两个矩阵合并成一个新矩阵m12。我阅读了this reference,然后还阅读了this reference,但这两种解决方案将数据从源矩阵复制到目标矩阵。

bool sample_method(const Mat& m1, const Mat& m2)

    if(m1.cols != m2.cols)
    
        cout << "Error: m1.cols != m2.cols" << endl;
        return false;
    

    Mat m12(m1.rows+m2.rows,m1.cols,DataType<float>::type);
    // merging m1 and m2
    m12(Rect(0,0,m1.cols,m1.rows)) = m1;
    m12(Rect(0,m1.rows,m2.cols,m2.rows)) = m2;

    return true;

如何在不复制数据的情况下将两个 Mat 连接到一个 Mat 中? 为什么我的代码不起作用?

【问题讨论】:

【参考方案1】:

我认为你永远不会让它发挥作用。 Mat 对象有一个指向其数据的指针,然后是帮助它解释该数据的参数。您要求用两个不相关的内存块制作一个 Mat,如果不以某种方式存储指向它们的指针,并且 Mat 没有成员变量可以放入它,就无法做到这一点。

【讨论】:

【参考方案2】:
m12(Rect(0,0,m1.cols,m1.rows)) = m1;

左边部分为 m12 矩阵的指定部分创建一个标题。当您将 m1 分配给此标头时 - 此标头开始指向与 m1 相同的数据。注意:不要在那里复制数据。 这段代码什么都不做

不复制数据就无法合并两个矩阵。

【讨论】:

以上是关于合并两个 cv::Mat 而不复制数据的主要内容,如果未能解决你的问题,请参考以下文章

试图将 cv::Mat 数据复制到 uchar *

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?

将 Cv::Mat 的数据存储在 std::vector 中

如何直接在boost共享内存中编写opencv cv :: Mat图像

Opencv 在 cv::Mat 中存储 Yuyv (YCrCb)