我尝试从wxImage
原始数据中制作cv::Mat
,并wxBitmap
在wxPanel
派生类中绘制它(这个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);
}
左边的小图片是我尝试加载并使用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));
然而它是同样的事情......如果我加载一个大图像,它有时会抛出一个未处理的内存异常。
答案 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);