在OpenCV中添加两个Mat到窗口中

Adding two Mat into a window in OpenCV

本文关键字:两个 Mat 窗口 OpenCV 添加      更新时间:2023-10-16

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

PS:这不是关于合并成一个单一的图像。

任何想法?

使用Qt和这个函数:如何将opencv cv::Mat转换为qimage

Highgui不支持每个窗口多个矩阵

我认为在纯opencv中不可能做到这一点,因为opencv是图像处理库,只支持最少的用户界面,只有一些功能。

你可以创建一个更大的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 ) ) );

我正在考虑同样的事情,遇到了你的问题。考虑到Mat的工作方式,它实际上只是一个智能指针,即具有定义其指向的数据如何组织的头信息。

这意味着您不能使用mat容器,并且现在所有显示相关的内容一次只能使用一个mat对象。所以一个好的简单有效的方法是不容易实现的。

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

如果你下定决心去做(我知道那种感觉,我这样做是因为我找不到更好的选择)。你可以在内存中为你的数据缓冲区分配一个连续的空间。

现在,您可以按照您认为适合多个映像的方式对内存进行分区。即使用指针算术。你需要确保你想要显示的图像是相邻的。

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

当然,使用这种方法,它们会永久地粘在一起,形成一定的形状。

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

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