OpenCV学习笔记(三):将图像显示在MFC控件上并做直方图均衡化处理

来源:互联网 发布:大连pm2.5历年数据 编辑:程序博客网 时间:2024/05/19 21:42

本博将讲述利用OpenCV将图片显示在VS的控件上,并给出将图像进行直方图均衡化的方法:

首先,建立一个基于对话框的工程,删除上面已有三个控件,然后在上满拉出一个Button和Picture Control,分别用于打开和显示图片:

然后在工程对话框类中添加一个成员变量,用于存储打开的图片:

//共有成员变量,用以保存打开的图片

IplImage* firstImage;

接着在对话框添加成员函数  showImagetoWnd(IplImage* img, UINT ID)  用以将图片显示到Picture Control上,函数源代码如下

void CshowImgVideoDlg::showImagetoWnd(IplImage* img, UINT ID)
{
CDC *pDC=GetDlgItem(ID)->GetDC();
HDC hDC=pDC->GetSafeHdc();


CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);//得到控件区域大小rect
int rectw=rect.right-rect.left;//控件宽度
int recth=rect.bottom-rect.top;//控件高度
IplImage *outImg=cvCreateImage(cvSize(rectw,recth),img->depth,img->nChannels);//重建一张与控件大小一样大的图片

cvResize(img,outImg,CV_INTER_CUBIC);//将原始图片缩放到控件大小
CvvImage outimage;
outimage.CopyOf(outImg);
outimage.DrawToHDC(hDC,&rect);//将图片拷贝到控件上

ReleaseDC(pDC);

}

最后,在Button控件上添加响应函数,打开图像。

void CshowImgVideoDlg::OnBnClickedopenimage()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE,//TRUE表示显示打开对话框 FALSE表示显示表寸对话框
"jpg Files (*jpg)",//指定默认的文件扩展名
NULL, //指定默认文件名
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,//指定一些风格
_T("image Files (*.TIFF;*.BMP;*.JPG)|*.TIFF;*.BMP;*.JPG;)|All Files(*.*)|*.*||"),//指定过滤器  注意书写
NULL); //指定父窗口
if (IDOK != dlg.DoModal())
{
return;
}
CString strpath=dlg.GetPathName();
IplImage *pImage=cvLoadImage(strpath,CV_LOAD_IMAGE_ANYCOLOR);
if (!pImage)
{
return;
}
if (firstImage)
{
cvZero(firstImage);//图像数据清0
}
firstImage=pImage;    //一定要缩放  以为图片大小不统一
showImagetoWnd(firstImage,IDC_showImg);//调用showImagetoWnd()将图片显示在控件上
// cvReleaseImage(&pImage);
}


接下来给出一个将图像进行直方图均衡化处理的函数:

IplImage* CshowImgVideoDlg::EqualizeHistColorImage(IplImage* pImage)
{
IplImage *pEqualImage = cvCreateImage(cvGetSize(pImage),pImage->depth,pImage->nChannels);

const int MAX_CHANNEL=4;
IplImage *pImageChannel[MAX_CHANNEL]={NULL};
int i;
for (i=0;i<pImage->nChannels;++i)
{
pImageChannel[i]=cvCreateImage(cvGetSize(pImage),pImage->depth,1);
}
cvSplit(pImage,pImageChannel[0],pImageChannel[1],pImageChannel[2],pImageChannel[3]);
for (i=0;i<pImage->nChannels;++i)
{
cvEqualizeHist(pImageChannel[i],pImageChannel[i]);
}
cvMerge(pImageChannel[0],pImageChannel[1],pImageChannel[2],pImageChannel[3],pEqualImage);
for(i=0;i<pImage->nChannels;++i)
{
cvReleaseImage(&pImageChannel[i]);
}
return pEqualImage;
}

这样,灵活应用这个函数就可以对图像进行直方图均衡化处理,上面显示的图片的处理结果如下:



本节完,谢谢观众。








0 0
原创粉丝点击