wxWidgets + OpenCV:wxBitmap无法正确绘制wxImage

时间:2014-09-07 04:27:12

标签: c++ opencv wxwidgets

我尝试从wxImage原始数据中制作cv::Mat,并wxBitmapwxPanel派生类中绘制它(这个bmImage类。

以下是将cv::Mat数据加载到wxImage的代码。

cv::Mat asCvMat = cv::imread("something.png", 1);
cv::imshow("preview", asCvMat);
cv::Mat cvtResult;
aswxImage = wxImage(asCvMat.cols, asCvMat.rows, asCvMat.data, true);
wxLogMessage(wxT("%s"), std::string((char*)asCvMat.data));

这里是用于绘制wxBitmap的代码。

void bmImage::render(wxDC& dc) {
    wxBitmap bitmap = wxBitmap(aswxImage);
    dc.DrawBitmap(bitmap, wxPoint(0, 0), false);
}

enter image description here

左边的小图片是我尝试加载并使用cv::imshow显示的图片,而右边的图片是生成的wxBitmap。它没有正确显示图像。我应该如何解决此问题以正确显示图像?

另外,令我困惑的是asCvMat.data的(null)值。这是否意味着wxImage()已完成从中加载所有像素数据,因此它已到达终点(\0)?

修改

cv::Mat asCvMat = cv::imread("something.png", 1);
cv::imshow("preview", asCvMat);
void *mdata = malloc((size_t)(asCvMat.dataend - asCvMat.datastart));
std::memcpy(mdata, asCvMat.data, (size_t)(asCvMat.dataend - asCvMat.datastart));

cv::Mat cvtResult;
aswxImage = wxImage(asCvMat.cols, asCvMat.rows, (unsigned char*)mdata, false);

wxLogMessage(wxT("%s"), std::string((char*)mdata));

然而它是同样的事情......如果我加载一个大图像,它有时会抛出一个未处理的内存异常。

2 个答案:

答案 0 :(得分:1)

您确定cv::Mat数据是wxImage所期望的格式,即没有任何交错的简单RGB吗?

另外,您如何致电render()?你不能直接调用它,它是从你的wxEVT_PAINT处理程序调用的吗?

答案 1 :(得分:0)

解决方案:

sizer_to_contain_image->Add(image, 1, wxEXPAND);

sizer_containing_image->SetSizeHints(frame_containing_sizer);