首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv mat与CImage的转换

opencv mat与CImage的转换
EN

Stack Overflow用户
提问于 2014-08-26 16:28:22
回答 2查看 3.5K关注 0票数 0

我正在寻找一种将存储在opencv变量中的图像转换为CImage对象的有效方法(CBitmap也很好)。我所说的高效是指快速,和‘短拼写’。扩展搜索的结果是找到了一些代码,这些代码是手动将位图头和数据写入对象的,这是我想要避免的,因为我不太明白那里发生了什么。更糟糕的是,它看起来有点不可取,并产生运行时错误..。(我想我是在这里得到的:http://howto-code-it.blogspot.com/2011/05/how-to-convert-iplimage-to-hbitmap.html)

就目前而言,我只是一个接一个地处理像素,这不是太明智(虽然我需要让它工作),是时候改进性能了;

如果有人能以另一种方式提出转换,这也将是值得赞赏的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-27 01:25:02

要复制数据,不需要逐个像素地复制数据。一种方法是(及其标题):

代码语言:javascript
复制
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/的分步说明。

票数 2
EN

Stack Overflow用户

发布于 2015-05-06 13:51:59

需要进行一些检查,因为StretchDIBits要求m_matCVImg必须对齐并且必须是连续的。

代码语言:javascript
复制
bool ok1 = m_matCVImg.isContinuous();
bool ok2 = (m_matCVImg.cols % 4) == 0;
  • ok1:如果您的m_matCVImg是ROI或稀疏矩阵,则不能直接使用StretchDIBits
  • ok2:您的m_matCVImg只有在具有模4cols或32位深度时才对齐。

如果您的检查失败,您需要使用右cols创建临时cv::Mat。

代码语言:javascript
复制
 if (!(ok1 && ok2)) {
   // create a new cv::Mat using
   // m_matCVImg.CopyTo(...) or cv::copyMakeBorder(m_matCVImg,...)
 }

最后,如果你的m_matCVImg是灰色的,你必须准备一个平面调色板在bitInfo.bmiColors;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25510743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档