与Win32 VC ++上的其他GUI(例如Qt或WxWidgets)一起使用的OpenCV
image-processing
opencv
4
0

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

我猜它分为两个或三个问题:

  1. 是否有必要做一些事情来禁用OpenCV的higui,以免干扰首选的GUI库?如果是,怎么办?

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

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

好的。对于WxWidgets,我已经有了自己的问题的答案。一个关键是不与RGB序列对抗openCV市政厅。 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;
}
收藏
评论

我知道我对这个讨论太迟了,但是我只是在讨论中碰巧发生了。无论如何,几年来我一直很开心地同时使用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 /应用程序框架。

(端自插)

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号