将两个 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_temp1image_temp2 后,newImage 将与拆分、修改和合并子图像完全相同。

【讨论】:

以上是关于将两个 Mat 图像合并为一个的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 的窗口中添加两个 Mat

将两个图像合并为一个方向问题

如何使用FFmpeg将两个图像合并为一个? [重复]

将两个或多个图像合并为一个

Python将两个图像合并成一个图像(横向合并)

将 Mat 图像转置为更大的 Mat 图像,Opencv