2014-12-04 104 views
2

我遇到问题。我有一个形象。然后我必须将图像分成两个相等的部分。我做了这个像(编译代码,一切都很好):将两个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(); 

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

回答

6

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

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

+2

哇!我无法相信这些功能在文档中不存在。 – brotherofken 2014-12-04 17:14:14

3

似乎cv::Mat::push_back正是你寻找:

C++:空隙垫::的push_back(常量垫&米):添加元素的矩阵的底部。

Parameters:  
    m – Added line(s). 

该方法将一个或多个元素添加到矩阵的底部。当元素为 垫时,其类型和列数必须与容器矩阵中的相同。

或者,您可以创建合适的大小和位置的图像部分的新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)); 
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将与您拆分,修改并合并子图像完全相同。