将两个 Mat 图像合并为一个
Posted
技术标签:
【中文标题】将两个 Mat 图像合并为一个【英文标题】:Merge two Mat images into one 【发布时间】:2014-12-04 14:10:24 【问题描述】:我有问题。我有一个图像。然后我必须将图像分成两个相等的部分。我是这样弄的(代码编译好了,一切正常):
Mat image_temp1 = image(Rect(0, 0, image.cols, image.rows/2)).clone();
Mat image_temp2 = image(Rect(0, image.rows/2, image.cols, image.rows/2)).clone();
然后我必须独立更改每个部分,最后合并为一个。我不知道如何正确地做到这一点。我应该如何将这 2 个图像部分合并为一张图像? 示例:http://i.stack.imgur.com/CLDK7.jpg
【问题讨论】:
【参考方案1】:有几种方法可以做到这一点,但我发现最好的方法是使用cv::hconcat(mat1, mat2, dst)
进行水平合并或使用cv::vconcat(mat1, mat2, dst)
进行垂直合并。
不要忘记处理空矩阵合并情况!
【讨论】:
哇!我不敢相信文档中没有这些功能。【参考方案2】:看来cv::Mat::push_back 正是你要找的:
C++: void Mat::push_back(const Mat& m) : 将元素添加到矩阵的底部。
Parameters: m – Added line(s).
这些方法将一个或多个元素添加到矩阵的底部。当元素是 Mat ,其类型和列数必须与中的相同 容器矩阵。
或者,您可以创建适当大小的新cv::Mat
并将图像部分直接放入其中:
Mat image_temp1 = image(Rect(0, 0, image.cols, image.rows/2)).clone();
Mat image_temp2 = image(Rect(0, image.rows/2, image.cols, image.rows/2)).clone();
...
cv::Mat result(image.rows, image.cols);
image_temp1.copyTo(result(Rect(0, 0, image.cols, image.rows/2)));
image_temp2.copyTo(result(Rect(0, image.rows/2, image.cols, image.rows/2));
【讨论】:
【参考方案3】:这个怎么样:
Mat newImage = image.clone();
Mat image_temp1 = newImage(Rect(0, 0, image.cols, image.rows/2));
Mat image_temp2 = newImage(Rect(0, image.rows/2, image.cols, image.rows/2));
通过不使用clone()
创建临时映像,您在修改临时映像时隐式修改了newImage
,而无需再次合并它们。更改image_temp1
和image_temp2
后,newImage
将与拆分、修改和合并子图像完全相同。
【讨论】:
以上是关于将两个 Mat 图像合并为一个的主要内容,如果未能解决你的问题,请参考以下文章