Jiv*_*son 17 qt wxwidgets opencv image-processing
我想使用OpenCV的图像处理功能,但不是OpenCV GUI.我正在使用OpenCV 2.0.我将使用Qt4或WxWidgets来实现GUI功能.我用VC++ 2008 Express(VC++ 9.0)编译.
我想它分为两三个问题:
是否有必要做一些事情来禁用OpenCV的higui,这样它就不会干扰首选的GUI库,如果是这样,怎么做?
如何将OpenCV图像转换为首选GUI可以显示(也可能保存)的某些内容(位图?)?
(可选)如何将使用首选界面加载的图像转换为OpenCV可以使用的表单?
好的。对于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;
}
Run Code Online (Sandbox Code Playgroud)
我知道我讨论的时间已经太晚了,但我碰巧碰到了它.无论如何,我几年来一直很开心地使用OpenCV和wxWidgets,所以我想我会投入:
是否有必要做一些事情来禁用OpenCV的higui,这样它就不会干扰首选的GUI库,如果是这样,怎么做?
不一般.对于特定版本的OpenCV和Windows,您可能会遇到一些问题.但是,在大多数情况下,整合非常顺利.我经常使用wx作为我的前端和 highgui的部分,以实现图像捕获.我在几个版本的Windows,Ubuntu和OS X上完成了这个.
如何将OpenCV图像转换为首选GUI可以显示(也可能保存)的某些内容(位图?)?
在wxImage之间来回复制的替代方法是将IplImage的数据直接填充到OpenGL纹理中并将其绘制在wxGLCanvas上.这种策略的一大优势是,您可以使用标准OpenGL方法在纹理上绘制.
(可选)如何将使用首选界面加载的图像转换为OpenCV可以使用的表单?
不要:)我使用wxFileDialog等让用户指定路径,但所有后端都是直接OpenCV.
(开始自插)
我编写的代码很多都是MADTraC项目的一部分,MADTraC是一个用于实时计算机视觉应用的GUI /应用程序框架.
(结束自插)
| 归档时间: |
|
| 查看次数: |
19975 次 |
| 最近记录: |