将两个Mat图像合并为一个

时间:2014-12-04 14:10:24

标签: c++ c opencv

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

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

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

3 个答案:

答案 0 :(得分:13)

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

不要忘记处理空矩阵合并案例!

答案 1 :(得分:3)

似乎cv::Mat::push_back正是您所寻找的:

  

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

Parameters:    
    m – Added line(s).
     

方法将一个或多个元素添加到矩阵的底部。当elem是   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));

答案 2 :(得分:1)

这个怎么样:

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