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



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

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中?为什么我的代码不工作?

我认为你不可能做到这一点。Mat对象有一个指向其数据的指针,然后是帮助它解释该数据的参数。您要求从两个不相关的内存块中创建Mat,如果不以某种方式存储指向它们的指针,Mat没有成员变量可以将其放入。

m12(Rect(0,0,m1.cols,m1.rows)) = m1;

左边的部分为m12矩阵的指定部分创建一个标题。当你将m1赋值给这个头时-这个头开始指向与m1相同的数据。注意:此处不复制数据。这段代码什么也不做

不复制数据是不可能合并两个矩阵的

最新更新