⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 对话框显示iplimagedlg.cpp

📁 用OpenCV编写的人脸识别代码
💻 CPP
字号:
// 对话框显示iplImageDlg.cpp : implementation file
//

#include "stdafx.h"
#include "对话框显示iplImage.h"
#include "对话框显示iplImageDlg.h"
#include "ADDERDLG.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

		CString filename;

		CvvImage m_CvvImage;
		CvvImage m_CvvImage1;
		IplImage* m_IplImage;
		
		CvvImage img;

		IplImage* imgtemp=0;
		char* name = 0;
		IplImage* imgtemp1=0;
		IplImage* imgnull=0;

	
static CvHidHaarClassifierCascade* hid_cascade = 0;



class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
//	boolbtn = false;
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIplImageDlg dialog

CIplImageDlg::CIplImageDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CIplImageDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CIplImageDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	boolbtn = false;


}

void CIplImageDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CIplImageDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CIplImageDlg, CDialog)
	//{{AFX_MSG_MAP(CIplImageDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDGRAY, OnGray)
	ON_BN_CLICKED(IDC_CANNY, OnCanny)
	ON_BN_CLICKED(IDC_LAPLACE, OnLaplace)
	ON_BN_CLICKED(IDC_NOISE, OnNoise)
	ON_BN_CLICKED(IDC_OPEN, OnOpenImage)
	ON_BN_CLICKED(IDC_DETECT, OnDetect)
	ON_BN_CLICKED(IDC_HOUGH, OnHough)
	ON_BN_CLICKED(IDC_TRANSE, OnTranse)
	ON_BN_CLICKED(IDC_SMOOTH, OnSmooth)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIplImageDlg message handlers

BOOL CIplImageDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CIplImageDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CIplImageDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();


		CClientDC dc(this); 
		

		if(name)
		{
			m_IplImage=cvLoadImage(name);
			m_CvvImage.CopyOf(m_IplImage,1);

			CRect cvRect(0,0, 300, 300 );
			m_CvvImage.DrawToHDC(dc.GetSafeHdc(),cvRect);
			if(boolbtn)
			{	
				CRect rect(310,0,610, 300 );
				m_CvvImage1.DrawToHDC(dc.GetSafeHdc(),rect);
			}
		}
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CIplImageDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}




void CIplImageDlg::OnGray()			//BGR-GRAY(8U1C)
{
	// TODO: Add your control notification handler code here
	imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);

	cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY);	//rgb转换为灰度
	m_CvvImage1.CopyOf(imgtemp,1);

	boolbtn = true;
	Invalidate();


}



void CIplImageDlg::OnCanny()		//BGR-GRAY(8U1C)-cvCanny
{
	// TODO: Add your control notification handler code here
	IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
	imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);

	cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY);	//rgb转换为灰度
	cvCanny(imgtemp,dst, 100, 200, 3);

		IplImage* rgbImage = cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,3);
	cvCvtColor(dst,rgbImage,CV_GRAY2BGR);

//	m_CvvImage1.CopyOf(dst,1);
	m_CvvImage1.CopyOf(rgbImage,1);
	boolbtn = true;
	Invalidate();
}
void CIplImageDlg::Laplace(int m)	
{
	imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
		IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_16S,1);
		IplImage* temp2=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);

		cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY);	//rgb转换为灰度
		cvLaplace(imgtemp,dst,m);
		cvConvertScale( dst, temp2);
		TRACE1("拉普拉斯的输出图像深度为 %d\n",temp2->depth);
		m_CvvImage1.CopyOf(temp2,1);
	//	delete dlgPara;	
		boolbtn = true;
		Invalidate();
}
void CIplImageDlg::OnLaplace()		//BGR-GRAY(16S1C)-cvLaplace()
{
	// TODO: Add your control notification handler code here
//	DLGLAPLACE *dlgPara = new DLGLAPLACE(this);
/*
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	*/
/*
	if (dlgPara == NULL)
	{
		dlgPara = new DLGLAPLACE(this);
		dlgPara->Create(DLGLAPLACE::IDD) ;
		dlgPara->ShowWindow(SW_SHOW);
	}
		else
		dlgPara->SetActiveWindow();
*/	
	
	
	DLGLAPLACE* dlgPara = new DLGLAPLACE(this);
		dlgPara->Create(DLGLAPLACE::IDD) ;
		dlgPara->ShowWindow(SW_SHOW);
		

}

void CIplImageDlg::OnNoise()		//BGR-GRAY-BGR(8U3C)-加噪声
{
	// TODO: Add your control notification handler code here
	IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,3);
	imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);

	cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY);	//rgb转换为灰度
	cvCvtColor(imgtemp,dst,CV_GRAY2BGR);
		DWORD i,j;
	srand((unsigned)time(NULL));//生成伪随机种子
	for (j = 0;j < dst->height;j++)
	{
		for(i = 0;i < dst->width ;i++)
		{
			if(rand()>30000)
			{
				//图像中当前点置为黑
				((uchar*)(dst->imageData + dst->widthStep*j))[i*3] = 0;
				((uchar*)(dst->imageData + dst->widthStep*j))[i*3+1] = 0;
				((uchar*)(dst->imageData + dst->widthStep*j))[i*3+2] = 0;
			}
		}
	}
		ShowIplImage(dst);
}

void CIplImageDlg::OnOpenImage() 
{

	// TODO: Add your control notification handler code here
	CFileDialog dlg(TRUE,"bmp","*.bmp");
	if(dlg.DoModal() == IDOK)
	{
		boolbtn = false;
		Invalidate();
		filename = dlg.GetPathName();
		name = filename.GetBuffer(filename.GetLength());
		Invalidate();

	//	OnPaint();
	//	UpdateData(false);	错误
	}

}


void CIplImageDlg::OnDetect() 
{
	// TODO: Add your control notification handler code here
	CvHaarClassifierCascade* cascade;

	CvMemStorage* storage = cvCreateMemStorage(0);
	CvSeq* faces;
//	int optlen = strlen("--cascade=");
	int i;

	//load classifier cascade from XML file
	cascade = (CvHaarClassifierCascade*)cvLoad("D:\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_default.xml");
	
	faces = cvHaarDetectObjects(
		m_IplImage,
		cascade,
		storage,
		1.2,		//scale the cascade by 20% after each pass
		2,			//groups of 3 (2+1) or more neighbor face rectangles are joined into 
					//a single "face", smaller groups are rejected
		CV_HAAR_DO_CANNY_PRUNING,
					//use Canny edge detector to reduce number of false alarms
		cvSize(0,0)	//start from the minimum face size allowed by the particular classifier
		);
	for(i=0;i<(faces?faces->total:0);i++)
	{
		CvRect* r = (CvRect*)cvGetSeqElem(faces,i);
		CvPoint pt1 = {r->x, r->y};
		CvPoint pt2 = {r->x + r->width, r->y + r->height};

		cvRectangle(m_IplImage,pt1,pt2,CV_RGB(255,0,0),3,8,0);

	}
	
	cvNamedWindow("faces",1);
	cvShowImage("faces",m_IplImage);
	cvWaitKey();

	cvReleaseImage(&m_IplImage);
	cvReleaseHaarClassifierCascade(&cascade);
	cvReleaseMemStorage(&storage);
	

/*
	m_CvvImage1.CopyOf(image,1);
	boolbtn = true;
	Invalidate();
*/
}



void CIplImageDlg::OnHough() 
{
	// TODO: Add your control notification handler code here

        IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 1 );
        IplImage* color_dst = cvCreateImage( cvGetSize(m_IplImage), 8, 3 );
        CvMemStorage* storage = cvCreateMemStorage(0);
        CvSeq* lines = 0;
        int i;
		imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
		cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY);	//rgb转换为灰度
        cvCanny( imgtemp, dst, 100, 200, 3 );
        cvCvtColor( dst, color_dst, CV_GRAY2BGR );

			
lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 150, 0, 0 );

//	cvLine( color_dst, pt1, pt2, CV_RGB(0,0,255), 3, 8 );
	
			
			for( i = 0; i < lines->total; i++ )
			{
				float* line = (float*)cvGetSeqElem(lines,i);
				float rho = line[0];
				float theta = line[1];
				CvPoint pt1, pt2;
				double a = cos(theta), b = sin(theta);
				if( fabs(a) < 0.001 )
				{
					pt1.x = pt2.x = cvRound(rho);
					pt1.y = 0;
					pt2.y = color_dst->height;
				}
				else if( fabs(b) < 0.001 )
				{
					pt1.y = pt2.y = cvRound(rho);
					pt1.x = 0;
					pt2.x = color_dst->width;
				}
				else
				{
					pt1.x = 0;
					pt1.y = cvRound(rho/b);
					pt2.x = cvRound(rho/a);
					pt2.y = 0;
				}
				cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );
			}

/*
lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
        for( i = 0; i < lines->total; i++ )
        {
            CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
            cvLine( color_dst, line[0], line[1], CV_RGB(0,0,255), 3, 8 );
        }
*/

/*
		m_CvvImage1.CopyOf(color_dst,1);
	
		boolbtn = true;
		Invalidate();*/
		ShowIplImage(color_dst);

}

void CIplImageDlg::OnTranse() 
{
	// TODO: Add your control notification handler code here

	IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 1 );
	IplImage* dsttemp = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
		IplImage* dsttemp1 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
				IplImage* dsttemp2 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );

	cvCvtColor(m_IplImage, dst, CV_BGR2GRAY);	//rgb转换为灰度


	double width = dst->width;
	double heigh = dst->height;


	cvConvert(dst,dsttemp);

/*
	for(int i=0;i<width;i++)
		for(int j=0;j<heigh;j++)
			((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]=
				((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]*pow((-1),(i+j));
//				((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]*3;

*/


cvDFT(dsttemp,dsttemp1,CV_DXT_FORWARD|CV_DXT_SCALE);

/*
for(int i=0;i<width;i++)
		for(int j=0;j<heigh;j++)
			((uchar*)(dsttemp1->imageData + dsttemp1->widthStep*j))[i*3]=
				log10(1+(double)((uchar*)(dsttemp1->imageData + dsttemp1->widthStep*j))[i*3]);
*/
//	cvDFT(dsttemp1,dsttemp2,CV_DXT_INVERSE);

	ShowIplImage(dsttemp1);


	cvNamedWindow("源图",1);
	cvShowImage("源图",m_IplImage);
	cvNamedWindow("变换",1);
	cvShowImage("变换",dsttemp1);
	cvWaitKey();
	cvReleaseImage(&m_IplImage);
	cvReleaseImage(&dsttemp1);
}

void CIplImageDlg::ShowIplImage(IplImage *out)
{
	m_CvvImage1.CopyOf(out,1);

	boolbtn = true;
	Invalidate();
}


void CIplImageDlg::OnSmooth() 
{
	// TODO: Add your control notification handler code here
		IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 3 );
	IplImage* dsttemp = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
		IplImage* dsttemp1 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
				IplImage* dsttemp2 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );

//	cvCvtColor(m_IplImage, m_IplImage, CV_BGR2GRAY);	//rgb转换为灰度
	double width = m_IplImage->width;
	double heigh = m_IplImage->height;
	for(int i=0;i<width;i++)
	{
		for(int j=0;j<heigh;j++)
		{
			if(((uchar*)(m_IplImage->imageData + m_IplImage->widthStep*i))[j]!=0)
				TRACE1("%d ",((uchar*)(m_IplImage->imageData + m_IplImage->widthStep*i))[j]);
			
		}

	}
//	cvSmooth(m_IplImage,dst);
//	ShowIplImage(dst);
}

void CIplImageDlg::OnSave() 
{
	// TODO: Add your control notification handler code here
	cvSaveImage("C:\\save.bmp",m_CvvImage1.GetImage());
}





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -