【问题标题】:OpenCV with other GUI (like Qt or WxWidgets) on Win32 VC++在 Win32 VC++ 上带有其他 GUI(如 Qt 或 WxWidgets)的 OpenCV
【发布时间】:2011-01-13 17:36:27
【问题描述】:

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

我猜它分为两三个问题:

  1. 是否有必要禁用 OpenCV 的 higui,使其不会干扰首选的 GUI 库,如果需要,如何操作?

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

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

【问题讨论】:

    标签: qt image-processing opencv wxwidgets


    【解决方案1】:

    我知道我在这个讨论中已经很晚了,但我只是碰巧遇到了它。无论如何,几年来我一直很高兴地一起使用 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/应用程序框架。

    (结束自插)

    【讨论】:

      【解决方案2】:

      好的。我已经回答了我自己的 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;
      }
      

      【讨论】:

      • 这似乎适用于 RGB 图像。如果我有灰度 IplImage 怎么办?
      【解决方案3】:

      我已经取得了一点进步。 OpenCV 的 GUI 部分似乎不碍事。我什至在 WxWidgets 应用程序中使用它来显示图像,似乎没有发生任何不好的事情。那是在使用 VC++ 2008 的 Windows XP 机器上。OpenCV/highGUI 似乎与窗口系统的唯一交互是直接调用 Windows API 并监视事件队列中的键盘事件,它会传递。

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

      【讨论】:

        【解决方案4】:

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

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

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

        如果您在该主题中没有找到您想要的内容,您可以开始一个新主题。

        或者用谷歌搜索OpenCV integration in Qt 或者在谷歌代码上搜索,有些项目同时使用了Qt 和OpenCV (OpenCV Stereo Vision is one)。

        祝你好运。

        【讨论】:

          【解决方案5】:

          好吧,我对 OpenCV 了解不多,但我经常使用 wxWidgets。

          我强烈推荐 wxWidgets 仅仅是因为它直观的结构和代码布局。

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

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

          【讨论】:

          • 我在 LPGL 的 QT 上看到的唯一问题(在 Windows 或 Linux 上都无所谓)是 IF Jive 更改 QT 库中的某些内容并且不要不想分享他的变化。这是不行的。除此之外,没有需要担心的许可问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-28
          • 2015-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-08
          相关资源
          最近更新 更多