【问题标题】:Conversion between opencv mat and CImageopencv mat和CImage之间的转换
【发布时间】:2014-08-26 16:28:22
【问题描述】:

我正在寻找一种将存储在 opencv Mat 变量中的图像转换为 CImage 对象的有效方法(CBitmap 也可以)。我所说的高效是指快速和“简写”。 我的扩展搜索导致找到手动将位图标题和数据写入对象的代码,我想避免这种情况,因为我不太明白那里发生了什么。更糟糕的是,它看起来有点被弃用并产生运行时错误...... (我相信我在这里得到它:http://howto-code-it.blogspot.com/2011/05/how-to-convert-iplimage-to-hbitmap.html

至于现在我只是一个一个地复制像素,这不太明智(尽管我需要让它工作),是时候提高性能了;)

如果有人能以其他方式提出转换,我将不胜感激。

【问题讨论】:

    标签: c++ opencv mfc mat


    【解决方案1】:

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

    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】:

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

      bool ok1 = m_matCVImg.isContinuous();
      bool ok2 = (m_matCVImg.cols % 4) == 0;
      
      • ok1:如果您的 m_matCVImg 是 ROI 或稀疏矩阵,则不能直接使用 StretchDIBits
      • ok2:只有当 m_matCVImg 具有模 4 列或 32 位深度时,它才是 DWORD 对齐的

      如果您的检查失败,您需要创建一个带有正确 cols 的临时 cv::Mat

       if (!(ok1 && ok2)) {
         // create a new cv::Mat using
         // m_matCVImg.CopyTo(...) or cv::copyMakeBorder(m_matCVImg,...)
       }
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 2015-01-14
        • 1970-01-01
        • 2019-10-02
        • 2021-08-08
        • 1970-01-01
        • 2014-10-21
        • 2014-11-02
        相关资源
        最近更新 更多