首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Win32 VC++上使用其他图形用户界面(如Qt或WxWidgets)的OpenCV

在Win32 VC++上使用其他图形用户界面(如Qt或WxWidgets)的OpenCV
EN

Stack Overflow用户
提问于 2010-02-06 06:33:57
回答 5查看 21K关注 0票数 17

我想使用OpenCV的图像处理功能,而不是OpenCV图形用户界面。我使用的是OpenCV 2.0。对于图形用户界面功能,我将使用Qt4或WxWidgets。我用VC++ 2008Express (VC++ 9.0)编译。

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

  1. 是否有必要做一些事情来禁用OpenCV的higui,这样它就不会干扰首选的图形库,如果有,如何做?
  2. 如何将OpenCV图像转换成某种东西(位图?)首选图形用户界面可以显示的内容(也许还有save)?
  3. (Optional)如何将使用首选界面加载的图像转换为OpenCV可以使用的形式?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-11 08:55:25

好吧。我已经为WxWidgets找到了我自己问题的答案。一个关键是不要为了RGB序列而与openCV市政厅打架。OpenCv真的很喜欢"BGR“。WxWidgets仅使用"RGB“。opencv数据结构有一个用于字节序列的字段,但很少被采用。如果字节序列设置为"RGB“,即使是显示图像的highGui函数(在MS Windows上)也会显示出壮观的蓝色橘子。我固执地在本地安装中修复了这个bug,但其他操作也失败了。因此,我只需叹一口气,将opencv端的字节顺序设置为"BGR“,并根据需要进行字节交换。

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

代码语言:javascript
复制
#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;
}
票数 5
EN

Stack Overflow用户

发布于 2012-03-06 05:24:27

我知道我在这个讨论中来得太晚了,但我只是偶然发现了它。无论如何,几年来我一直非常愉快地一起使用OpenCV和wxWidgets,所以我想我应该加入进来:

是否有必要做些什么来禁用OpenCV的higui,这样它就不会干扰首选的图形库,如果有,又是如何做的呢?

一般不是这样的。对于特定版本的OpenCV和Windows,你可能会遇到一些小问题。不过,在大多数情况下,集成是非常顺利的。我经常使用wx作为我的前端和highgui中支持图像捕获的部分。我已经在Windows、Ubuntu和OS的几个版本上做到了这一点。

如何将OpenCV图像转换为某种东西(位图?)首选GUI可以显示(也许还可以保存)?

在wxImage之间来回复制的另一种方法是将IplImage的数据直接填充到OpenGL纹理中,然后在wxGLCanvas上绘制它。此策略的一大优点是,您可以使用标准的OpenGL方法在纹理上绘制。

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

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

(开始自插)

我写的代码是MADTraC项目的一部分,它是一个实时计算机视觉应用程序的图形用户界面/应用程序框架。

(末端自插头)

票数 5
EN

Stack Overflow用户

发布于 2010-02-06 19:22:03

是否有必要做些什么来禁用OpenCV的higui,这样它就不会干扰首选的图形库,如果有,又是如何做的呢?

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

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

如果你在那个线程中找不到你想要的东西,你可以开始一个新的线程。

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

祝好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2210937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档