OpenCV最近upgraded its display window,当它在Qt中使用时。
它看起来非常好,但我没有发现它嵌入现有Qt GUI窗口的任何可能性。唯一的可能性似乎是创建cvNamedWindow
或cv::namedWindow
,但它会创建一个自由浮动的独立窗口。
是否有可能在现有GUI中创建内部的OpenCV窗口?我在OpenCV论坛上找到的只有an unanswered question,有点类似于我自己的。
有一个直截了当的possibility to show an OpenCV image in Qt,但它有两个主要问题:
cvNamedWindow
中,即使对于多个视频同时运行也非常流畅,但如果我浏览IplImage
- > QImage
- > QPixmap
- > QLabel
路由,即使是一个视频也会出现严重延迟)cvNamedWindow
的那些漂亮的新控件。答案 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。