0

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

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

有任何想法吗?

4

3 回答 3

0

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

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

// 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 ) ) );
于 2013-05-03T12:11:55.510 回答
0

使用 Qt 和此功能: 如何将 opencv cv::Mat 转换为 qimage

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

于 2013-05-03T12:12:22.957 回答
0

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

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

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

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

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

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

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

显然,这也可以反过来做,即创建 mat 对象并让它分配空间,然后使用uchar *data成员从 Mat 对象中获取数据指针(请记住为指针算法转换为您喜欢的类型) . 您可以使用该缓冲区创建 2 个新的 Mat 对象。

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

于 2018-10-24T14:30:11.017 回答