我正在寻找一种将存储在opencv变量中的图像转换为CImage对象的有效方法(CBitmap也很好)。我所说的高效是指快速,和‘短拼写’。扩展搜索的结果是找到了一些代码,这些代码是手动将位图头和数据写入对象的,这是我想要避免的,因为我不太明白那里发生了什么。更糟糕的是,它看起来有点不可取,并产生运行时错误..。(我想我是在这里得到的:http://howto-code-it.blogspot.com/2011/05/how-to-convert-iplimage-to-hbitmap.html)
就目前而言,我只是一个接一个地处理像素,这不是太明智(虽然我需要让它工作),是时候改进性能了;
如果有人能以另一种方式提出转换,这也将是值得赞赏的。
发布于 2014-08-27 01:25:02
要复制数据,不需要逐个像素地复制数据。一种方法是(及其标题):
CImage* m_pImg;
cv::Size m_sizeShow;
cv::Mat m_matCVImg;
BITMAPINFO bitInfo;
...
StretchDIBits(m_pImg->GetDC(), 0, 0,
m_sizeShow.width, m_sizeShow.height, 0, 0,
m_sizeShow.width, m_sizeShow.height,
matImgTmp.data, &bitInfo, DIB_RGB_COLORS, SRCCOPY);请查看http://kvy.com.ua/transformation-of-opencv-image-to-mfc-image-in-msvc-project/的分步说明。
发布于 2015-05-06 13:51:59
需要进行一些检查,因为StretchDIBits要求m_matCVImg必须对齐并且必须是连续的。
bool ok1 = m_matCVImg.isContinuous();
bool ok2 = (m_matCVImg.cols % 4) == 0;如果您的检查失败,您需要使用右cols创建临时cv::Mat。
if (!(ok1 && ok2)) {
// create a new cv::Mat using
// m_matCVImg.CopyTo(...) or cv::copyMakeBorder(m_matCVImg,...)
}最后,如果你的m_matCVImg是灰色的,你必须准备一个平面调色板在bitInfo.bmiColors;
https://stackoverflow.com/questions/25510743
复制相似问题