MFC中步骤如下
1 单文档 MFC标准 在共享DLL中使用MFC
2 CTestMFCView CScrollView
3 添加附加依赖项
4 往debug中加dll
5 往工程中加CvvImgage.h CvvImgage.cpp 并在头文件和源文件中添加进入
6 在stdafx.h中加
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include "CvvImage.h"
/*
opencv_highgui243d.lib;
opencv_core243d.lib;
opencv_ml243d.lib;
opencv_imgproc243d.lib;
*/
7 类视图C。。。CDoc-双击
第一个pulic 中
CvvImage m_image;
8 类视图中对C。。。CDoc 右击-属性 -重写
onopendocument 下拉-添加
添加了一段函数
BOOL COpencv_Task1Doc::OnOpenDocument(LPCTSTR lpszPathName)
在里面继续修改
添加到头文件和源文件,类视图doc.h中,添加
m_image.Load(lpszPathName);
8步骤完成的是打开图片 但是还是看不到图片的,需要在view 写代码让图片显示出来
9 类视图中C。。。View 单击 下面ondraw(CDC *pDC) 双击
在里面添加
if(pDoc->m_image.GetImage())
{
RECT rect,rectDC;
GetClientRect(&rect);
rectDC=rect;
long rcWidth=rect.right-rect.left;
long rcHeight=rect.bottom-rect.top;
CSize szImg=CSize(pDoc->m_image.GetImage()->width,pDoc->m_image.GetImage()->height);
if(szImg.cy<rcHeight)
{
rectDC.bottom=rectDC.top+szImg.cy;
}
if(szImg.cx>rcWidth||szImg.cy>rcHeight)
{
SetScrollSizes(MM_TEXT,szImg);
}
rectDC.right=rectDC.left+szImg.cx;
rectDC.bottom=rectDC.top+szImg.cy;
//pDoc->m_image.DrawToHDC(pDC->GetSafeHdc(),&rectDC);
pDoc->m_image.DrawToHDC(pDC->GetSafeHdc(), &rectDC);
}
添加完后,此函数名 有个形参被屏蔽了记得修改过来void COpencv_Task1View::OnDraw(CDC* /*pDC*/)去掉/**/
9步骤就完成了图片的显示工作
10 资源视图 menu-IDR_MAINFRAME双击
单击某处 写入“图像处理”它的下拉菜单写入“直方图均衡化” 再对其右键单击 -属性-写ID号ID_IMG_PROC_EQUA
在对直方图均衡化 右键-添加事件处理程序
左侧不变 右侧选择C。。。CDoc 添加编辑
出现了一个函数 往此函数写代码--也就是怎么处理图像的代码
IplImage * src = m_image.GetImage();
if (src)
{
IplImage* imgChannel[4] = { 0, 0, 0, 0 };
IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 );
for( int i = 0; i < src -> nChannels; i++ )
{
imgChannel[i] = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); //****要求单通道图像才能直方图均衡化 ****//
}
//****通道分离 ****//
cvSplit( src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3] );//BGRA
for( int i = 0; i < dst -> nChannels; i++ )
{
//****直方图均衡化,原始图像和目标图像必须是单通道 ****//
cvEqualizeHist( imgChannel[i], imgChannel[i] );
}
//****通道组合 ****//
cvMerge( imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst );
/*cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
cvNamedWindow( "Equalize", 1 );
cvShowImage( "Equalize", dst ); */
m_image.CopyOf(dst);
UpdateAllViews(NULL);
//****释放资源 ****//
for( int i = 0; i < src -> nChannels; i++ )
{
if( imgChannel[i] )
{
cvReleaseImage( &imgChannel[i] );
//imgChannel[i] = 0;
}
}
cvReleaseImage( &dst );
1 单文档 MFC标准 在共享DLL中使用MFC
2 CTestMFCView CScrollView
3 添加附加依赖项
4 往debug中加dll
5 往工程中加CvvImgage.h CvvImgage.cpp 并在头文件和源文件中添加进入
6 在stdafx.h中加
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include "CvvImage.h"
/*
opencv_highgui243d.lib;
opencv_core243d.lib;
opencv_ml243d.lib;
opencv_imgproc243d.lib;
*/
7 类视图C。。。CDoc-双击
第一个pulic 中
CvvImage m_image;
8 类视图中对C。。。CDoc 右击-属性 -重写
onopendocument 下拉-添加
添加了一段函数
BOOL COpencv_Task1Doc::OnOpenDocument(LPCTSTR lpszPathName)
在里面继续修改
添加到头文件和源文件,类视图doc.h中,添加
m_image.Load(lpszPathName);
8步骤完成的是打开图片 但是还是看不到图片的,需要在view 写代码让图片显示出来
9 类视图中C。。。View 单击 下面ondraw(CDC *pDC) 双击
在里面添加
if(pDoc->m_image.GetImage())
{
RECT rect,rectDC;
GetClientRect(&rect);
rectDC=rect;
long rcWidth=rect.right-rect.left;
long rcHeight=rect.bottom-rect.top;
CSize szImg=CSize(pDoc->m_image.GetImage()->width,pDoc->m_image.GetImage()->height);
if(szImg.cy<rcHeight)
{
rectDC.bottom=rectDC.top+szImg.cy;
}
if(szImg.cx>rcWidth||szImg.cy>rcHeight)
{
SetScrollSizes(MM_TEXT,szImg);
}
rectDC.right=rectDC.left+szImg.cx;
rectDC.bottom=rectDC.top+szImg.cy;
//pDoc->m_image.DrawToHDC(pDC->GetSafeHdc(),&rectDC);
pDoc->m_image.DrawToHDC(pDC->GetSafeHdc(), &rectDC);
}
添加完后,此函数名 有个形参被屏蔽了记得修改过来void COpencv_Task1View::OnDraw(CDC* /*pDC*/)去掉/**/
9步骤就完成了图片的显示工作
10 资源视图 menu-IDR_MAINFRAME双击
单击某处 写入“图像处理”它的下拉菜单写入“直方图均衡化” 再对其右键单击 -属性-写ID号ID_IMG_PROC_EQUA
在对直方图均衡化 右键-添加事件处理程序
左侧不变 右侧选择C。。。CDoc 添加编辑
出现了一个函数 往此函数写代码--也就是怎么处理图像的代码
IplImage * src = m_image.GetImage();
if (src)
{
IplImage* imgChannel[4] = { 0, 0, 0, 0 };
IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 );
for( int i = 0; i < src -> nChannels; i++ )
{
imgChannel[i] = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); //****要求单通道图像才能直方图均衡化 ****//
}
//****通道分离 ****//
cvSplit( src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3] );//BGRA
for( int i = 0; i < dst -> nChannels; i++ )
{
//****直方图均衡化,原始图像和目标图像必须是单通道 ****//
cvEqualizeHist( imgChannel[i], imgChannel[i] );
}
//****通道组合 ****//
cvMerge( imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst );
/*cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
cvNamedWindow( "Equalize", 1 );
cvShowImage( "Equalize", dst ); */
m_image.CopyOf(dst);
UpdateAllViews(NULL);
//****释放资源 ****//
for( int i = 0; i < src -> nChannels; i++ )
{
if( imgChannel[i] )
{
cvReleaseImage( &imgChannel[i] );
//imgChannel[i] = 0;
}
}
cvReleaseImage( &dst );
}
以上完成的是图片的均衡化处理,后续将在这上面继续修改学习。