OpenCv Mat 对象应用到MFC

本文深入解析了C++图像处理中的关键概念,重点介绍了如何使用CImage接口将OpenCV Mat类型图像转换为CImage格式,并详细解释了相关函数与参数的用法。同时,提供了实例代码演示,帮助开发者掌握图像处理的基础技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void MatToCImage(Mat & mat, CImage & cImage) 

   int width = mat.cols; 
    int height = mat.rows; 
    int channels = mat.channels(); 
 
    cImage.Destroy();//这一步是防止重复利用造成内存问题  
    cImage.Create(width,height,8*channels); 
 
    uchar* ps; 
    uchar* pimg = (uchar*)cImage.GetBits(); //获取CImage的像素存贮区的指针  
    int step = cImage.GetPitch();//每行的字节数,注意这个返回值有正有负  
   
    // 如果是1个通道的图像(灰度图像) DIB格式才需要对调色板设置    
    // CImage中内置了调色板,我们要对他进行赋值:  
 
 if (1 == channels) 
    { 
        RGBQUAD* ColorTable;   
        int MaxColors=256;   
        //这里可以通过CI.GetMaxColorTableEntries()得到大小(如果你是CI.Load读入图像的话)    
       ColorTable = new RGBQUAD[MaxColors];   
        cImage.GetColorTable(0,MaxColors,ColorTable);//这里是取得指针    
        for (int i=0; i<MaxColors; i++)   
        {   
            ColorTable[i].rgbBlue = (BYTE)i;   
            //BYTE和uchar一回事,但MFC中都用它    
            ColorTable[i].rgbGreen = (BYTE)i;   
            ColorTable[i].rgbRed = (BYTE)i;   
       }   
       cImage.SetColorTable(0,MaxColors,ColorTable);   
        delete []ColorTable;   
    } 
    for (int i = 0; i < height; i++) 
    { 
       ps = mat.ptr<uchar>(i); 
       for (int j = 0; j < width; j++) 
        { 
           if (1 == channels) 
            { 
                *(pimg + i*step + j) = ps[j]; 
                //*(pimg + i*step + j) = 105;  
            } 
            else if (3 == channels) 
            { 
               *(pimg + i*step + j*3) = ps[j*3]; 
               *(pimg + i*step + j*3 + 1) = ps[j*3 + 1]; 
               *(pimg + i*step + j*3 + 2) = ps[j*3 + 2]; 
            } 
        } 
    } 

    //string str = CString2StdString(_T("C:\\sample1020.bmp"));  
    //imwrite(str,mat);  
    //这句话就是用来测试cimage有没有被赋值  
    //cImage.Save(_T("C:\\sample1024.bmp"));  

void  DisplayImageEx(CWnd* pWnd, const CImage& image) 

    CDC *m_pDC = pWnd->GetDC();//获取窗口所拥有的设备上下文,用于显示图像  
    pWnd->UpdateWindow(); 
 
    CRect rc; 
    //客户区大小  
    //CRect rc1;  
    pWnd->GetWindowRect(&rc); 
     
    
    //ScreenToClient(&rc);  
     
    ::SetStretchBltMode(m_pDC->GetSafeHdc(),COLORONCOLOR);//设置位图的伸缩模式  
    image.StretchBlt(m_pDC->GetSafeHdc(),0,0,rc.Width()-1,rc.Height()-1, 
        0,0,image.GetWidth(),image.GetHeight(),SRCCOPY); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值