第一步,转换格式前预先获得待显示控件的大小,若相等则不做处理,若不等则首先改变Mat图像大小,再进行转换。

        CRect rect;
        GetDlgItem(IDC_STATIC_SRC)->GetClientRect(&rect);
        cv::Size winSize(rect.right, rect.bottom);
 
        // Resize the source to the size of the destination image if necessary
        cv::Mat cvImgTmp(winSize, CV_8UC3);
        if (imgSrc.size() != winSize)
        {
            cv::resize(imgSrc, cvImgTmp, winSize);
        }
        else
        {
            cvImgTmp = imgSrc;
        }    

第二步,将Mat图像转换成CImage格式


int Mat2CImage(Mat *mat, CImage &img) {
    if (!mat || mat->empty())
        return -1;
    int nBPP = mat->channels() * 8;
    img.Create(mat->cols, mat->rows, nBPP);
    if (nBPP == 8)
    {
        static RGBQUAD pRGB[256];
        for (int i = 0; i < 256; i++)
            pRGB[i].rgbBlue = pRGB[i].rgbGreen = pRGB[i].rgbRed = i;
        img.SetColorTable(0, 256, pRGB);
    }
    uchar* psrc = mat->data;
    uchar* pdst = (uchar*)img.GetBits();
    int imgPitch = img.GetPitch();
    for (int y = 0; y < mat->rows; y++)
    {
        memcpy(pdst, psrc, mat->cols*mat->channels());//mat->step is incorrect for those images created by roi (sub-images!)
        psrc += mat->step;
        pdst += imgPitch;
    }
 
    return 0;
}


第三步,可以直接显示CImage格式图像
    CImage imgDst;
        Mat2CImage(&cvImgTmp, imgDst);
        imgDst.Draw(GetDlgItem(IDC_STATIC_SRC)->GetDC()->GetSafeHdc(), rect);


原文:https://blog.csdn.net/u014682691/article/details/51296219 
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐