*************************************文章内容无意义,存档用****************************************
简单介绍在MFC对话框里使用Picture控件来显示和处理图像,主要使用的是CvvImage这个被opencv2.2以上版本取消的类。
更多功能参考:http://blog.csdn.net/chenyusiyuan/article/details/4744097。
1、新建“对话框”类型的MFC应用程序
2、添加opencv的依赖库(这里方便起见添加opencv2.4版本的所有依赖库):
opencv_calib3d240d.lib
opencv_contrib240d.lib
opencv_core240d.lib
opencv_features2d240d.lib
opencv_flann240d.lib
opencv_gpu240d.lib
opencv_highgui240d.lib
opencv_imgproc240d.lib
opencv_legacy240d.lib
opencv_ml240d.lib
opencv_nonfree240d.lib
opencv_objdetect240d.lib
opencv_photo240d.lib
opencv_stitching240d.lib
opencv_ts240d.lib
opencv_video240d.lib
opencv_videostab240d.lib
3、添加CvvImage.h和CvvImage.cpp文件,并在CxxxDlg.cpp中包含(这里下载):
4、添加一个picture control(控件ID:IDC_SHOW_IMAGE)和button控件(控件ID:IDC_BTN_OPEN):
5、为button控件添加事件响应函数:
两个地方:一个是项目使用“多字节字符集”,所以CString和string之间可以默认转化;二是载入图像采用了高版本的Mat对象,转化为CvvImage时通过IplImage间接转化(参考我的另一篇:http://blog.csdn.net/holybin/article/details/17711013)。
void CtestDlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
//open image dialog
//包含所有opencv支持的图像格式
CFileDialog dlgOpenFile(TRUE,
NULL,
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST,
"Windows bitmap(*.bmp;*.dib)|*.bmp;*.dib|JPEG image(*.jpeg;*.jpg;*.jpe)|*.jpeg;*.jpg;*.jpe|\
Portable network graphics(*.png)|*.png|Portable bitmap forma(*.pbm;*.pgm;*.ppm)|*.pbm;*.pgm;*.ppm|\
Sun rasters(*.sr;*.ras)|*.sr;*.ras|TIFF image(*.tif;*.tiff)|*.tif;*.tiff|OpenEXR HDR image(*.exr)|*.exr|\
JPEG 2000 image(*.jp2)|*.jp2|\
All Files(*.*)|*.*||");
//open ok
string imgPath;
if(dlgOpenFile.DoModal()==IDOK)
{
//get image path
imgPath = dlgOpenFile.GetPathName(); //注:使用“多字节字符集”才可以直接默认从CString转string
}
else
{
return;
}
//load image
Mat srcImg = imread(imgPath);
if (srcImg.empty())
{
AfxMessageBox("Error loading source image!", MB_ICONSTOP|MB_OK);
return;
}
/
//Mat to CvvImage
IplImage iplSrcImg = srcImg; //注:浅拷贝只复制数据头
CvvImage cvvSrcImg;
cvvSrcImg.CopyOf( &iplSrcImg );
/
//show image
CDC* pDC = GetDlgItem(IDC_SHOW_IMAGE)->GetDC();
HDC hDC = pDC->GetSafeHdc();
CRect rect;
GetDlgItem(IDC_SHOW_IMAGE)->GetClientRect(&rect);
cvvSrcImg.DrawToHDC(hDC, &rect);
ReleaseDC( pDC );
}
6、运行结果:
这里没有加入缩放,来适应picture control的显示区域比例,实现起来也很简单。整个工程文件在这里。