您的位置:首页 > 运维架构

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

2013-01-16 11:28 716 查看
昨天做一个小的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);
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: