合并两个 cv::Mat 而不复制数据
Posted
技术标签:
【中文标题】合并两个 cv::Mat 而不复制数据【英文标题】:Merge two cv::Mat without copying the data 【发布时间】:2013-01-06 18:05:11 【问题描述】:考虑两个矩阵作为以下sample_method()
方法的输入参数,我想将m1
和m2
这两个矩阵合并成一个新矩阵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 转换为 2d std::vector
如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?
将 Cv::Mat 的数据存储在 std::vector 中