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

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

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

有什么想法吗?

【问题讨论】:

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

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


【解决方案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,则无需实际复制任何数据 - 这一切都通过图像标题神奇地发生。见stackoverflow.com/questions/6378543/…
    【解决方案3】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多