在Win32 VC ++上使用其他GUI(如Qt或WxWidgets)的OpenCV

时间:2010-02-05 22:33:57

标签: qt image-processing opencv wxwidgets

我想使用OpenCV的图像处理功能,但不使用OpenCV GUI。我正在使用OpenCV 2.0。我将使用Qt4或WxWidgets来实现GUI功能。我用VC ++ 2008 Express(VC ++ 9.0)编译。

我想它可以分解为两三个问题:

  1. 是否有必要做一些事情来禁用OpenCV的higui,这样就不会干扰首选的GUI库,若然,怎么做?

  2. 如何将OpenCV图像转换为首选GUI可以显示(也可能保存)的内容(位图?)?

  3. (可选)如何将使用首选界面加载的图像转换为OpenCV可以使用的表单?

5 个答案:

答案 0 :(得分:5)

我知道我在这次讨论中已经太迟了,但我碰巧碰到了它。无论如何,我几年来一直很愉快地使用OpenCV和wxWidgets,所以我想我会投入:

  

是否有必要做一些事情来禁用OpenCV的higui,这样它就不会干扰首选的GUI库,如果是这样,怎么做?

一般情况下。对于特定版本的OpenCV和Windows,您可能会遇到一些问题。但是,在大多数情况下,整合非常顺利。我经常使用wx作为我的前端支持图像捕获的highgui部分。我已经在几个版本的Windows,Ubuntu和OS X上完成了这个。

  

如何将OpenCV图像转换为首选GUI可以显示(也可能保存)的某些内容(位图?)?

在wxImage之间来回复制的替代方法是将IplImage的数据直接填充到OpenGL纹理中并将其绘制在wxGLCanvas上。这种策略的一大优势是,您可以使用标准的OpenGL方法在纹理上绘制。

  

(可选)如何将使用首选界面加载的图像转换为OpenCV可以使用的表单?

不要:)我使用wxFileDialog等让用户指定路径,但所有后端都是直接OpenCV。

(开始自我插件)

代码我写了很多这样做是MADTraC项目的一部分,这是一个用于实时计算机视觉应用的GUI /应用程序框架。

(结束自我插件)

答案 1 :(得分:4)

好。我已经得到了WxWidgets自己问题的答案。一个关键是不要打开openCV市政厅关于RGB序列。 OpenCv真的很喜欢“BGR”。 WxWidgets仅使用“RGB”。 opencv数据结构有一个字节序列字段,但它很少被尊重。如果字节序列设置为“RGB”,即使显示图像的highGui函数(在MS Windows上)也会显示蓝色的橘子。我固执地修复了本地安装中的错误,但其他操作也失败了。所以,我只是感叹并将opencv端的字节顺序设置为“BGR”并根据需要进行字节交换。

下面的C ++代码要求它转换为wxImages的openCV图像是RGB,序列“BGR”,8位深度和3个交错通道,并且width_step = width * 3。例程不检查兼容性。使用自负。准备好黄金时段的版本将提供感兴趣的区域(ROI)和其他功能。

#include "wx/wx.h"
#include "cv.h"
#include "highgui.h" // Optional


void copy_and_swap_rb(char *s, char *d, int size) {
    // Copy image data source s to destination d, swapping R and B channels.
    // Assumes 8 bit depth, 3 interleaved channels, and width_step = width*3
    const int step = 3;
    char *end = s + size;
    while (s<end) {
        d[0] = s[2];
        d[1] = s[1];
        d[2] = s[0];
        d += step; s += step;   
    }
}

void wx2cv(wxImage &wx, IplImage *ipl) {
    // Copy image data from wxWidgets image to Ipl (opencv) image
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3.
    copy_and_swap_rb((char*)wx.GetData(), ipl->imageData, ipl->imageSize);
}

void cv2wx(IplImage *ipl, wxImage &wx ) {
    // Copy image data from Ipl (opencv) image to wxImage
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3.
    copy_and_swap_rb( ipl->imageData, (char*)wx.GetData(),   
                      wx.GetWidth()*wx.GetHeight()*3);
}

IplImage *cv_from_wx(wxImage &wx) {
    // Return a new IplImage copied from a wxImage. 
    // Must be freed by user with cvReleaseImage().
    IplImage *ret = cvCreateImage(cvSize(wx.GetWidth(), wx.GetHeight()), 
                                  IPL_DEPTH_8U, 3);
    wx2cv(wx, ret);
    return ret;
}

wxImage wx_from_cv( IplImage *cx) {
    // Return new wxImage copied from a compatible IplImage.
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels
    // Fear not. The copy on return is cheap; does not deep-copy the data.
    wxImage wx(cx->width, cx->height, (unsigned char*) malloc(cx->imageSize), false);
    cv2wx(cx, wx);
    return wx;
}

答案 2 :(得分:1)

  

是否有必要做一些事情来禁用OpenCV的higui,这样它就不会干扰首选的GUI库,如果是这样,怎么做?

答案:我不明白为什么它不应该是可行的,或者它是一个设计不良的库(我不认为OpenCV是)。

对于您的其他问题(以及问题1的“如何”),我对QtCentre进行了快速搜索,并发现了一个关于OpenCV integration with Qt的有趣话题。您可以查看一些源代码示例。

如果您在该主题中找不到所需内容,则可以开始新主题。

或google for OpenCV integration in Qt或搜索Google Code,有些项目同时使用Qt和OpenCV(OpenCV Stereo Vision is one)。

祝你好运。

答案 3 :(得分:0)

我对OpenCV了解不多,但我使用wxWidgets很多。

我强烈推荐使用wxWidgets,因为它具有直观的结构和代码布局。

此外,QT仅在Windows上的LGPL下提供,因此许可可能是个问题。 wxWidgets可以无限制地用于商业项目。

至于来回转换图像,wxWidgets有大量用于处理图像的类/函数。

答案 4 :(得分:0)

我取得了一些进展。 OpenCV的GUI部分似乎确实不受影响。我甚至在WxWidgets应用程序中使用它来显示图像,似乎没有任何不好的事情发生。那是在使用VC ++ 2008的Windows XP机器上.OpenCV / highGUI与窗口系统的唯一交互是进行直接的Windows API调用,并监视事件队列中的键盘事件,并将其传递给它。

我正在研究如何将OpenCV图像转换为WxWidgets图像并返回。对你们有很大的帮助。 : - )