将OpenCV窗口嵌入到Qt GUI中

时间:2012-07-29 14:22:10

标签: c++ c qt opencv

OpenCV最近upgraded its display window,当它在Qt中使用时。 它看起来非常好,但我没有发现它嵌入现有Qt GUI窗口的任何可能性。唯一的可能性似乎是创建cvNamedWindowcv::namedWindow,但它会创建一个自由浮动的独立窗口。

是否有可能在现有GUI中创建内部的OpenCV窗口?我在OpenCV论坛上找到的只有an unanswered question,有点类似于我自己的。

有一个直截了当的possibility to show an OpenCV image in Qt,但它有两个主要问题:

  1. 它涉及逐个像素地复制图像,而且速度很慢。它具有每个像素的函数调用! (在我的测试应用程序中,如果我从图像中创建视频,并将其显示在cvNamedWindow中,即使对于多个视频同时运行也非常流畅,但如果我浏览IplImage - > QImage - > QPixmap - > QLabel路由,即使是一个视频也会出现严重延迟)
  2. 我无法使用cvNamedWindow的那些漂亮的新控件。

3 个答案:

答案 0 :(得分:8)

首先,图像转换并不像您想象的那样低效。 '函数调用'每个像素至少在我的代码中(你引用的问题的答案之一)都是通过优化编译来内联的。

其次,highgui / imshow中的代码也是如此。无论哪种方式,您都必须从矩阵到ARGB图像。转换QImage - > QPixmap基本上就是将数据从主内存移动到GPU内存。这也是您无法直接访问QPixmap数据并且必须通过QImage的原因。

第三,如果使用QGLWidget绘制图像,速度要快几倍,我假设你在OpenCV版本中启用了QT_OPENGL。我使用QPainter在QGLWidget中绘制QPixmap,速度没问题。以下是示例代码:

http://sourceforge.net/p/gerbil/svn/19/tree/gerbil-gui/scaledview.h

http://sourceforge.net/p/gerbil/svn/19/tree/gerbil-gui/scaledview.cpp

现在回答您原来的问题:您当前的选择是从OpenCV获取代码,包含在不同命名空间下的项目中,并根据您的需要进行更改。除此之外,你现在别无选择。 OpenCV的highgui使用自己的事件循环,与X服务器等的连接,你无法拦截。

答案 1 :(得分:0)

我的第一个猜测是想要这样说:我敢肯定,如果你深入研究namedWindow的代码,你会发现他们使用某种标准的,虽然不是经常被引用的对象来绘制窗口(这是在openCV代码中)。如果你足够雄心勃勃,你可以自己扩展这个类,直接连接到Qt中的框架或自定义小部件。甚至可能有一种方法可以使用Qt框架的类似方法或(通用)窗口小部件类的扩展来获取整个窗口并嵌入它。这是一个非常有趣的问题,而且与我最近一直在做的工作直接相关,所以我会继续思考和研究它,看看我是否能提出其他更有帮助的东西。

[编辑]您对此感兴趣的具体新控件是什么?与我的第一个建议相反,程序员可能更有效地扩展Qt控件以模拟它。[/ EDIT]

答案 2 :(得分:-5)

只需查看opencv highgui实现。我记得它使用qt。