好的。我已经得到了关于WxWidgets的答案。其中一个关键是不要与openCV City Hall争RGB序列的问题。OpenCv非常喜欢“BGR”。WxWidgets仅使用“RGB”。尽管opencv数据结构有一个字节序列字段,但很少被使用。即使是在显示图像的高级GUI函数(在MS Windows上),如果字节序列设置为“RGB”,也会出现明显的蓝色柑橘效果。我固执地在我的本地安装中修复了这个错误,但其他操作也失败了。所以,我只能叹气并将opencv侧的字节顺序设置为“BGR”,并根据需要进行字节交换。
以下C++代码要求将其转换为wxImages的openCV图像为RGB,序列为“BGR”,8位深度和3个交错通道,并且width_step = width*3。这些例程不检查兼容性。使用需谨慎。一个适合生产环境的版本将提供ROI和其他花哨功能。
#include "wx/wx.h"
#include "cv.h"
#include "highgui.h"
void copy_and_swap_rb(char *s, char *d, int size) {
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_and_swap_rb((char*)wx.GetData(), ipl->imageData, ipl->imageSize);
}
void cv2wx(IplImage *ipl, wxImage &wx ) {
copy_and_swap_rb( ipl->imageData, (char*)wx.GetData(),
wx.GetWidth()*wx.GetHeight()*3);
}
IplImage *cv_from_wx(wxImage &wx) {
IplImage *ret = cvCreateImage(cvSize(wx.GetWidth(), wx.GetHeight()),
IPL_DEPTH_8U, 3);
wx2cv(wx, ret);
return ret;
}
wxImage wx_from_cv( IplImage *cx) {
wxImage wx(cx->width, cx->height, (unsigned char*) malloc(cx->imageSize), false);
cv2wx(cx, wx);
return wx;
}