在OpenCV中连接矩阵

9

我有几张尺寸相同的图像,它们都在Mat对象中。我想创建一个cv::Mat对象来存储它们。

因此新矩阵的维度为:widthNew = widthOld x matrices数量,高度保持不变。

我发现可以使用以下代码进行此类复制:

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL)

但是,那么面具如何在三个矩阵中被定义三次呢?
问候, Moataz

请注意,IplImage 的最大尺寸大约为 4000*4000。您可能还需要降低输入图像的分辨率。 - jlengrand
遮罩是可选的,您不需要定义一个。 - Rui Marques
好的,我会记住的,谢谢。 - Moataz Elmasry
3个回答

15

我认为有一个简单的方法可以做到这一点。OpenCV有一些未记录的方法,称为hconcat()vconcat()。第一个是用于水平串联,第二个是用于垂直串联。

你可以这样使用它们:

Mat A, B;
... //In this part you initialize the Mat A and Mat B.

Mat H, V; //These are the destination matrices
hconcat(A, B, H);
vconcat(A, B, V);

我希望这可以帮到你。


目标可以与源之一相同,因此在多线程上下文中(用于组合单个线程的输出),“vconcat(out, out1, out); vconcat(out, out2, out);” 对我很有效。 - Izaan

6

在IT技术方面,您需要使用ROI来定义一个图像,该图像实际上是目标图像的一部分,然后将其复制到该位置。请参见将cv :: Mat复制到另一个ROI中


1

您可能想要查看cvShowManyImages()的源代码, 它是一个函数,它将几个图像作为输入,并将它们连接到单个3通道图像中以进行显示:

所使用的方法是设置单个大图像的ROI,然后调整大小并将输入图像复制到单个大图像上。

如果创建一个足够大以容纳其他图像的目标图像,则不需要调整其大小。

如果您想知道如何在IplImagecv :: Mat之间转换,请参阅此主题


听起来很有趣,谢谢。我觉得我会复制这个想法,使用纯cv::Mat而不是IpImage来实现类似的东西。 - Moataz Elmasry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接