我有问题。我有一张图片。然后我必须将图像分成两个相等的部分。我这样做(代码编译,一切都很好):
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
答案 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_temp1
和image_temp2
后,newImage
将与您拆分,修改然后合并子图像完全相同。