9

OpenCV 最近升级了它的显示窗口,当它用于 Qt 时。它看起来非常好,但是我没有发现任何可能将它嵌入到现有的 Qt GUI 窗口中。唯一的可能性似乎是创建cvNamedWindowor cv::namedWindow,但它创建了一个自由浮动的独立窗口。

是否有可能现有 GUI 中创建该 OpenCV 窗口?我在 OpenCV 论坛上只能找到一个未回答的问题,有点类似于我自己的问题。

在 Qt 中显示 OpenCV 图像是一种直接的可能性,但它有两个主要问题:

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

3 回答 3

9

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

其次,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 服务器等,它是你可以拦截的。

于 2012-07-29T15:13:54.570 回答
0

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

[编辑] 您对哪些特定的新控件如此感兴趣?与我的第一个建议相反,程序员扩展 Qt 控件来模拟它可能会更有效。[/EDIT]

于 2012-07-29T15:11:50.470 回答
-6

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

于 2012-07-29T14:54:20.007 回答