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

本博将讲述利用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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值