在 OpenCV 的窗口中添加两个 Mat

Posted

技术标签:

【中文标题】在 OpenCV 的窗口中添加两个 Mat【英文标题】:Adding two Mat into a window in OpenCV 【发布时间】:2013-05-03 11:20:57 【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

第一个想法:如果你有c++标签,你不应该有IplImages,而是cv::Mat。 我是说马特。顺便说一句,我正在使用 cv::Mat :) 【参考方案1】:

使用 Qt 和这个函数: how to convert an opencv cv::Mat to qimage

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

【讨论】:

【参考方案2】:

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

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

// 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 ) ) );

【讨论】:

这是第一步。现在他只需要合并这两个图像,很高兴发布它。 :) 如果您使用 roi,则无需实际复制任何数据 - 这一切都通过图像标题神奇地发生。见***.com/questions/6378543/…【参考方案3】:

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

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

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

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

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

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

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

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

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

【讨论】:

以上是关于在 OpenCV 的窗口中添加两个 Mat的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头

Ubuntu中的OpenCV不显示窗口

Windows 中的 QtCreator 和 Matlab 库

C# 窗口中的 C++ opencv 应用程序

opencv显示窗口有显示xy和rgb

opencv nameWindow 窗口名字乱码