OpenCV读取图片在MFC中显示的问题

昨天做一个小的MFC+OPENCV图像处理程序界面如下:其中在效果演示一栏里加了一个Frame用以显示图像。但是遇到一个问题,如何将IplImage*类型的图像转换为可以再MFC中显示的图像。

各种百度google以后终于找到一解。

由于IplImage存储数据的方式与MFC支持的Bitmap类似,只需要利用opencv自带的类型CvvImage就可以了。

完成的函数如下:

void CMyDlg::ShowPic(IplImage *img)
{
    CDC* pDC=GetDlgItem(IDW_IMAGEWINDOW)->GetDC();
    HDC hDC=pDC->GetSafeHdc();
    CvvImage dcimg;
    dcimg.CopyOf(img,1);
    dcimg.DrawToHDC(hDC,&mypicrect);
}

当然,mypicrect是提前定义好的,希望图片显示正常的矩形。因为这个Frame不一定是合适的大小,而图片DrawToHDC的时候会存在缩放以适应Frame的问题,所以在读入图片时候就将这个矩形进行校正,保证贴图的比例与原图片一致。

读入图片函数如下:

void CMyDlg::OnOpen() 
{
    CFileDialog dialog(true,NULL,NULL,0,"图片文件|*.*");
    dialog.m_ofn.lpstrTitle="打开图片文件";
    if (dialog.DoModal()!=IDOK)
    {
        return;
    }
    oriimg=cvLoadImage(dialog.GetPathName(),-1);
    transimg=cvLoadImage(dialog.GetPathName(),0);
    GetDlgItem(IDW_IMAGEWINDOW)->GetClientRect(&mypicrect);
    if (oriimg->width>mypicrect.Width() )
    {
        if (oriimg->height<=mypicrect.Height())
        {
            mypicrect.bottom=mypicrect.top+mypicrect.Height()*mypicrect.Width()/oriimg->width;
        }
        else
        {
            if (oriimg->height/mypicrect.Height()>oriimg->width/mypicrect.Width())
            {
                mypicrect.right=mypicrect.left+mypicrect.Width()*mypicrect.Height()/oriimg->height;
            }
            else
            {
                mypicrect.bottom=mypicrect.top+mypicrect.Height()*mypicrect.Width()/oriimg->width;
            }
        }
    }
    else
    {
        if (oriimg->height>mypicrect.Height())
        {
            mypicrect.right=mypicrect.left+mypicrect.Width()*mypicrect.Height()/oriimg->height;
        }
        else
        {
            mypicrect.right=mypicrect.left+oriimg->width;
            mypicrect.bottom=mypicrect.top+oriimg->height;
        }
    }
    ShowPic(oriimg);
}


这样就可以将图片读入并正确显示了。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值