OPENCV笔记都是记录MFC下做图像处理的项目时,遇到的问题,留此博客以备记录。
本文主要是需要打开一个对话框,手动选取图片,显示在MFC的picture control上。关于在程序中使用绝对路径读取图片的代码,这里直接给出,不做过多的说明了。
OpenCV使用绝对路径读取图片:
void CMyDlg::OnBnClickedBtnloadimg()
{
// TODO: 在此添加控件通知处理程序代码
IplImage *SrcImg;
SrcImg = cvLoadImage("c:\\users\\administrator\\desktop\\1.jpg");//使用绝对路径读取图片
//SrcImg = cvLoadImage(".\\1.jpg"); //表示从当前文件夹下读取
if (!SrcImg->imageData)
{
AfxMessageBox("cvLoadImage() err");//使用多字节字符集
//AfxMessageBox(_T("cvLoadImage() err")); //使用Unicode字符集
}
if (SrcImg->nChannels != 1)//如果不是灰度图,转换成灰度图
{
IplImage *GrayImg = cvCreateImage(cvGetSize(SrcImg), IPL_DEPTH_8U, 1);
cvCvtColor(SrcImg, GrayImg, CV_BGR2GRAY);
}
else
{
cvReleaseImage(&GrayImg);
GrayImg = SrcImg;
}
/*
picture control显示图片,picture control的ID为IDC_ShowSrcImg
*/
//获取IDC_STATIC控件的设备环境,以便对其进行图像操作
CDC* pDCSrc = GetDlgItem(IDC_ShowSrcImg)->GetDC();//获得显示空间的DC,MFC类一般都是以C开头
HDC hDCSrc = pDCSrc->GetSafeHdc();//得到hDC句柄进行绘图操作
CvvImage cimgsrc;
cimgsrc.CopyOf(GrayImg);
//将图像显示到IDC_ShowImgSrc控件上
CRect rectsrc;
GetDlgItem(IDC_ShowSrcImg)->GetClientRect(&rectsrc);
cimgsrc.DrawToHDC(hDCSrc, &rectsrc);
// 释放
ReleaseDC(pDCSrc);
}
OpenCV弹出对话框,选择图片进行显示:
void CMyDlg::OnBnClickedBtnopenimg()
{
// TODO: 在此添加控件通知处理程序代码
IplImage* SrcImg = NULL;
CFileDialog dlg(
TRUE, _T("*.bmp;*.jpg;*.tif"), NULL,
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
"image files All Files (*.*) |*.*||", NULL
);// 选项图片的约定;
dlg.m_ofn.lpstrTitle = _T("打开图片");// 打开文件对话框的标题名;(*.bmp; *.jpg) |*.bmp; *.jpg |
if (dlg.DoModal() == IDOK)// 判断是否获得图片;
{
if (dlg.GetFileExt() != "bmp" && dlg.GetFileExt() != "jpg"&&dlg.GetFileExt() != "tif")
{
AfxMessageBox(_T("请选择正确的图片格式!"), MB_OK);
return;
}
CString mPath = dlg.GetPathName();// 获取图片路径;
SrcImg = cvLoadImage(mPath);//读取图片、缓存到一个局部变量ipl中;
if (!SrcImg)// 判断是否成功载入图片;
return;
}
/*
picture control显示图片,picture control的ID为IDC_ShowSrcImg
*/
//获取IDC_STATIC控件的设备环境,以便对其进行图像操作
CDC* pDCSrc = GetDlgItem(IDC_ShowSrcImg)->GetDC();//获得显示空间的DC,MFC类一般都是以C开头
HDC hDCSrc = pDCSrc->GetSafeHdc();//得到hDC句柄进行绘图操作
CvvImage cimgsrc;
cimgsrc.CopyOf(SrcImg);
//将图像显示到IDC_ShowImgSrc控件上
CRect rectsrc;
GetDlgItem(IDC_ShowSrcImg)->GetClientRect(&rectsrc);
cimgsrc.DrawToHDC(hDCSrc, &rectsrc);
// 释放
ReleaseDC(pDCSrc);
}