将OpenCV窗口嵌入Qt GUI

10
OpenCV 最近在 Qt 中 升级了其显示窗口。它看起来非常好,但是我没有找到任何可能性将它嵌入到现有的 Qt GUI 窗口中。唯一的可能性似乎是创建一个 cvNamedWindowcv::namedWindow,但它创建了一个独立的浮动窗口。
有没有可能在现有的 GUI 中创建 OpenCV 窗口 内部?我在 OpenCV 论坛上找到的所有内容都是一个未被回答的问题,与我的问题有些相似。
有一个直接的在 Qt 中显示 OpenCV 图像的可能性,但它有两个主要问题:
1. 这涉及逐像素复制图像,速度相当慢。每个像素都有函数调用!(在我的测试应用程序中,如果我从图像创建视频,并在cvNamedWindow中显示它,即使是多个视频同时运行,它也非常流畅,但是如果我通过IplImage -> QImage -> QPixmap -> QLabel路线,即使只有一个视频,也会有严重的延迟) 2. 我无法使用cvNamedWindow的那些漂亮的新控件。
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服务器等,您无法拦截它。

4
我发现了一个有趣的项目,可以更快地进行转换:http://code.google.com/p/qt-opencv-multithreaded/。它实际上是使用`cv::Mat`在工作,但由于它与`IplImage`相同,因此即使使用旧的API也可以使用。 const uchar *qImageBuffer = (const uchar*)mat.data; QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); 当链接的解决方案在我的系统上出现卡顿时,这个解决方案没有。 - vsz
首先,这是一个不错的项目,很高兴了解。所提出的解决方案仅适用于有限的一组场景(Mat 不是 BGR,而是 RGB,数据格式匹配,Mat 对象生存于 QImage),但您省略了一个重复。如果它对您有效,那太好了!(对我来说由于上述原因它并不起作用 :))。 - ypnos

0

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

[编辑] 你对哪些具体的新控件感兴趣?对于程序员来说,扩展Qt控件以模拟它可能比我的第一个建议更有效率。[/编辑]


1
如果我找不到更好的解决方案,我将尝试自己实现它,我只是不想重复造轮子。因为我认为我不是第一个同时使用Qt和Opencv的人,我想可能已经存在一个简单的解决方案。 - vsz

-6

简单地查看OpenCV Highgui实现即可。据我回忆,它使用Qt。


3
什么泛泛的回答!问题中已经明确表明这是一个已知的事实。 - ypnos
这是问题的第一句话。 - ypnos
@ypnos:你错了。 "a与b配合使用"并不意味着"a是基于b实现的"。话虽如此,你的无关只适用于我的回答的第二句话。第一句话才是OP应该做的。我曾经这样做过。 - Cheers and hth. - Alf
1
请不要挑剔糟糕的措辞。为什么不继续阅读链接文档中的第一句话:“此图解释了使用Qt GUI实现的新功能。”你想快速回答问题是可以理解的,但并没有太大帮助。 - ypnos
@ypnos:对于任何想成为程序员的人来说,答案就是他们所需要的。网上远在其他地方写的文档与 OP 的知识无关。现在考虑一下,如果你能够(?),那么选择的“解决方案”和这个答案说的一样,只不过描述得更详细。也就是说,你所声称的“没有帮助”早已被证明是错误的了。我认为你代表着 SO 中 80% 的问题:盲目从众。 - Cheers and hth. - Alf
请允许我由衷地反对您对我在SO上所“代表”的草率评估(也许您可以先花时间浏览一下我的历史记录?)。我仍然坚持我的观点,即您的回答只是重复了问题的第一句话。这与符合性有什么关系呢? - ypnos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接