根据OCV阵列操作的链接,我没有找到两种不同Mat的方法,并将它们放入一个只显示两个图像的窗口。
PS:这不是将图像合并为一个。
有什么想法吗?
答案 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对象在内存中的表示方式,此方法不允许您进行水平串联。