将两个垫子图像合并为一个

Merge two Mat images into one

本文关键字:合并 一个 图像 两个      更新时间:2023-10-16

>我有一个问题。我有一个图像。然后我必须将图像分成两个相等的部分。我这样做了(代码已编译,一切都很好):

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();

然后我必须独立更改每个部分,最后合并为一个。我不知道如何正确做到这一点。我应该如何将图像的这两个部分合并为一个图像?
示例:https://i.stack.imgur.com/CLDK7.jpg

几种方法可以做到这一点,但我发现最好的方法是使用 cv::hconcat(mat1, mat2, dst) 进行水平合并或cv::vconcat(mat1, mat2, dst)用于垂直合并。

不要忘记照顾空矩阵合并案例!

似乎 cv::Mat::p ush_back 正是您要找的:

C++:void Mat::p ush_back(const Mat& m):将元素添加到矩阵底部。

Parameters:    
    m – Added line(s).

这些方法将一个或多个元素添加到矩阵的底部。当 elem 是 垫子,其类型和列数必须与 容器矩阵。

或者,您可以创建适当大小的新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));

这个怎么样:

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将与您拆分,修改然后合并子图像完全相同。