在OpenCV的窗口中添加两个Mat

时间:2013-05-03 11:20:58

标签: c++ visual-studio-2010 opencv

根据OCV阵列操作的链接,我没有找到两种不同Mat的方法,并将它们放入一个只显示两个图像的窗口。

PS:这不是将图像合并为一个。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我认为在纯opencv中不可能这样做,因为opencv是图像处理库,并且支持最少的用户interface,具有一些功能。

您可以创建一个更大的Mat,其中包含原始的两个图像。为了能够区分图像,您可以创建黑线边界,例如:

// the 20 there is an example for border between images
Mat display = Mat::zeros ( MAX ( image1.rows, image2.rows ), image1.cols + 20 + image2.cols, image1.type() );

image1.copyTo ( Mat ( display, Rect ( 0, 0, image1.cols, image1.rows ) ) );
image2.copyTo ( Mat ( display, Rect ( image1.cols + 20, 0, image2.cols, image2.rows ) ) );

答案 1 :(得分:0)

使用Qt和此功能: how to convert an opencv cv::Mat to qimage

Highgui还不支持每个窗口的几个矩阵。

答案 2 :(得分:0)

我在想同样的事情,并且遇到了您的问题。按照Mat的工作方式,它实际上只是一个智能指针,即具有标头信息,该信息定义了它指向的数据的组织方式。

这意味着您不能使用mat容器,并且现在与显示相关的所有内容一次仅使用一个mat对象。因此,很难轻易实现一种简单有效的方法。

警告,您现在负责自己处理内存

如果您非常有决心做到这一点(我知道那种感觉,并且我这样做是因为我找不到更好的选择)。您可以在内存中为数据缓冲区分配连续的空间。

现在,您可以根据需要为多张图像分配该内存。即使用指针算法。您需要确保要显示的图像彼此相邻。

此时,您可以使用Mat(cv::Size size, int type, void *buffer)创建一个Mat对象,该对象覆盖2个对象的整个内存空间。

当然,使用这种方法,它们会以某种形式永久地粘在一起。

显然,这也可以通过另一种方法来完成,即创建mat对象并让其分配空间,然后使用uchar *data成员从Mat对象中获取数据指针(记住要强制转换为指针算术的首选类型)。然后,您可以使用该缓冲区创建2个新的Mat对象。

遗憾的是,由于Mat对象在内存中的表示方式,此方法不允许您进行水平串联。