www.pudn.com > TrackEye_SourceCode.zip > PCASettings.cpp, change:2007-06-04,size:10710b


// PCASettings.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "TrackEye.h" 
#include "PCASettings.h" 
#include "cv.h" 
#include "highgui.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// PCASettings dialog 
 
 
PCASettings::PCASettings(CWnd* pParent /*=NULL*/) 
	: CDialog(PCASettings::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(PCASettings) 
	CString Path(*__argv); 
	int i = Path.ReverseFind('\\')+1; 
	if(i)  
		Path=Path.Left(i); 
	Path += "EyeDatabase"; 
	m_DBdirectory = Path; 
	m_rectangleHeight = 25; 
	m_rectangleWidth = 40; 
	m_DBdirectory2 = _T("C:\\EyeDatabase\\Blinkdatabase"); 
	//}}AFX_DATA_INIT 
 
	//	**	My initializations 
	control = 0; 
	fileCounter = 0; 
	cameraFrame = NULL; 
	tempFrame = NULL; 
	DBaseType = 0; 
} 
 
 
void PCASettings::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(PCASettings) 
	DDX_Control(pDX, IDC_DONE, m_done); 
	DDX_Control(pDX, IDUpdateRectangle, m_UpdateRectangle); 
	DDX_Control(pDX, IDSave2DB, m_Save2DB); 
	DDX_Control(pDX, IDC_CHOOSEDIRECTORY2, m_CD2); 
	DDX_Control(pDX, IDC_CHOOSEDIRECTORY1, m_CD1); 
	DDX_Text(pDX, IDC_DBdirectory, m_DBdirectory); 
	DDV_MaxChars(pDX, m_DBdirectory, 80); 
	DDX_Text(pDX, IDC_imgHeight2, m_rectangleHeight); 
	DDV_MinMaxInt(pDX, m_rectangleHeight, 5, 1000); 
	DDX_Text(pDX, IDC_imgWidth2, m_rectangleWidth); 
	DDV_MinMaxInt(pDX, m_rectangleWidth, 10, 1000); 
	DDX_Text(pDX, IDC_DBdirectory2, m_DBdirectory2); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(PCASettings, CDialog) 
	//{{AFX_MSG_MAP(PCASettings) 
	ON_BN_CLICKED(IDSave2DB, OnSave2DB) 
	ON_BN_CLICKED(IDUpdateRectangle, OnUpdateRectangle) 
	ON_COMMAND(ID_DATABASEOPERATIONS_UPDATEBLINKDATABASE, OnDatabaseoperationsUpdateblinkdatabase) 
	ON_COMMAND(ID_DATABASEOPERATIONS_UPLOADEYEDATABASE, OnDatabaseoperationsUploadeyedatabase) 
	ON_BN_CLICKED(IDEXITDB, OnExitdb) 
	ON_BN_CLICKED(IDC_CHOOSEDIRECTORY1, OnChoosedirectory1) 
	ON_BN_CLICKED(IDC_CHOOSEDIRECTORY2, OnChoosedirectory2) 
	ON_BN_CLICKED(IDC_DONE, OnDone) 
	ON_COMMAND(ID_DATABASEOPERATIONS_EXIT, OnDatabaseoperationsExit) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// PCASettings message handlers 
 
BOOL PCASettings::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	m_CD1.SetIconID(IDI_EXPLORE); 
	m_CD2.SetIconID(IDI_EXPLORE); 
	m_Save2DB.SetIconID(IDI_SAVE); 
	m_UpdateRectangle.SetIconID(IDI_UR); 
	m_done.SetIconID(IDI_OK); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void PCASettings::OnDatabaseoperationsUploadeyedatabase()  
{ 
	// TODO: Add your command handler code here 
	//	**	Operator wants to update the Eye Database 
	capture =  cvCaptureFromCAM(-1); 
	if (capture == NULL) 
	{ 
		AfxMessageBox("Can not initialize capture device", MB_OK|MB_ICONSTOP); 
		exit(1); 
	} 
	else  
	{ 
		//	**	Enable&Disable stuff 
		GetDlgItem(IDC_imgWT)->EnableWindow(true); 
		GetDlgItem(IDC_IMGHT)->EnableWindow(true); 
		GetDlgItem(IDC_imgWidth)->EnableWindow(true); 
		GetDlgItem(IDC_imgHeight)->EnableWindow(true); 
		GetDlgItem(IDC_RECWT)->EnableWindow(true); 
		GetDlgItem(IDC_RECHT)->EnableWindow(true); 
		GetDlgItem(IDC_imgWidth2)->EnableWindow(true); 
		GetDlgItem(IDC_imgHeight2)->EnableWindow(true); 
 
		GetDlgItem(IDUpdateRectangle)->EnableWindow(true); 
		GetDlgItem(IDSave2DB)->EnableWindow(true); 
		GetDlgItem(IDC_DONE)->EnableWindow(true); 
		GetDlgItem(IDEXITDB)->EnableWindow(false); 
 
		DBaseType = 0; 
		control = 0; 
		cameraFrame = cvQueryFrame(capture); cvWaitKey(10); 
		tempFrame = cvCloneImage(cameraFrame); 
			 
		CString tempStr1, tempStr2; 
		tempStr1.Format("%d", cameraFrame->width); 
		tempStr2.Format("%d", cameraFrame->height); 
		GetDlgItem(IDC_imgWidth)->SetWindowText(tempStr1); 
		GetDlgItem(IDC_imgHeight)->SetWindowText(tempStr2); 
		 
		UpdateData(true);		//	**	Display window size 
		OnUpdateRectangle();	//	**	First Update 
		 
		HWND hWnd; 
		HWND hParent; 
 
		cvNamedWindow("Database", CV_WINDOW_AUTOSIZE); 
		hWnd = (HWND) cvGetWindowHandle("Database"); 
		hParent = ::GetParent(hWnd); 
		::SetParent(hWnd, GetDlgItem(IDC_DBwindow)->m_hWnd); 
		::ShowWindow(hParent, SW_HIDE); 
 
		while (control == 0) 
		{ 
			cvRectangle( tempFrame, point1, point2, CV_RGB(255,0,0), 2); 
			cvShowImage("Database", tempFrame); 
			cameraFrame = cvQueryFrame(capture); cvWaitKey(10); 
			cvCopy(cameraFrame, tempFrame); 
		} 
 
		//	**	Operator clicked "DONE!" 
		cvReleaseCapture(&capture); 
		cvReleaseImage(&tempFrame); 
		cvDestroyWindow("Database"); 
		 
		//	**	Enable&Disasble Stuff again 
		GetDlgItem(IDC_imgWT)->EnableWindow(false); 
		GetDlgItem(IDC_IMGHT)->EnableWindow(false); 
		GetDlgItem(IDC_imgWidth)->EnableWindow(false); 
		GetDlgItem(IDC_imgHeight)->EnableWindow(false); 
		GetDlgItem(IDC_RECWT)->EnableWindow(false); 
		GetDlgItem(IDC_RECHT)->EnableWindow(false); 
		GetDlgItem(IDC_imgWidth2)->EnableWindow(false); 
		GetDlgItem(IDC_imgHeight2)->EnableWindow(false); 
 
		GetDlgItem(IDUpdateRectangle)->EnableWindow(false); 
		GetDlgItem(IDSave2DB)->EnableWindow(false); 
		GetDlgItem(IDC_DONE)->EnableWindow(false); 
		GetDlgItem(IDEXITDB)->EnableWindow(true); 
	} 
} 
 
void PCASettings::OnDatabaseoperationsUpdateblinkdatabase()  
{ 
	// TODO: Add your command handler code here 
	//	**	Operator wants to update the Eye Database 
	capture =  cvCaptureFromCAM(-1); 
	if (capture == NULL) 
	{ 
		AfxMessageBox("Can not initialize capture device", MB_OK|MB_ICONSTOP); 
		exit(1); 
	} 
	else  
	{ 
		//	**	Enable&Disable stuff 
		GetDlgItem(IDC_imgWT)->EnableWindow(true); 
		GetDlgItem(IDC_IMGHT)->EnableWindow(true); 
		GetDlgItem(IDC_imgWidth)->EnableWindow(true); 
		GetDlgItem(IDC_imgHeight)->EnableWindow(true); 
		GetDlgItem(IDC_RECWT)->EnableWindow(true); 
		GetDlgItem(IDC_RECHT)->EnableWindow(true); 
		GetDlgItem(IDC_imgWidth2)->EnableWindow(true); 
		GetDlgItem(IDC_imgHeight2)->EnableWindow(true); 
 
		GetDlgItem(IDUpdateRectangle)->EnableWindow(true); 
		GetDlgItem(IDSave2DB)->EnableWindow(true); 
		GetDlgItem(IDC_DONE)->EnableWindow(true); 
		GetDlgItem(IDEXITDB)->EnableWindow(false); 
 
		DBaseType = 1; 
		control = 0; 
		cameraFrame = cvQueryFrame(capture); cvWaitKey(10); 
		tempFrame = cvCloneImage(cameraFrame); 
			 
		CString tempStr1, tempStr2; 
		tempStr1.Format("%d", cameraFrame->width); 
		tempStr2.Format("%d", cameraFrame->height); 
		GetDlgItem(IDC_imgWidth)->SetWindowText(tempStr1); 
		GetDlgItem(IDC_imgHeight)->SetWindowText(tempStr2); 
		 
		UpdateData(true);		//	**	Display window size 
		OnUpdateRectangle();	//	**	First Update 
		 
		HWND hWnd; 
		HWND hParent; 
 
		cvNamedWindow("Database", CV_WINDOW_AUTOSIZE); 
		hWnd = (HWND) cvGetWindowHandle("Database"); 
		hParent = ::GetParent(hWnd); 
		::SetParent(hWnd, GetDlgItem(IDC_DBwindow)->m_hWnd); 
		::ShowWindow(hParent, SW_HIDE); 
 
		while (control == 0) 
		{ 
			cvRectangle( tempFrame, point1, point2, CV_RGB(255,0,0), 2); 
			cvShowImage("Database", tempFrame); 
			cameraFrame = cvQueryFrame(capture); cvWaitKey(10); 
			cvCopy(cameraFrame, tempFrame); 
		} 
 
		//	**	Operator clicked "DONE!" 
		cvReleaseCapture(&capture); 
		cvReleaseImage(&tempFrame); 
		cvDestroyWindow("Database"); 
		 
		//	**	Enable&Disasble Stuff again 
		GetDlgItem(IDC_imgWT)->EnableWindow(false); 
		GetDlgItem(IDC_IMGHT)->EnableWindow(false); 
		GetDlgItem(IDC_imgWidth)->EnableWindow(false); 
		GetDlgItem(IDC_imgHeight)->EnableWindow(false); 
		GetDlgItem(IDC_RECWT)->EnableWindow(false); 
		GetDlgItem(IDC_RECHT)->EnableWindow(false); 
		GetDlgItem(IDC_imgWidth2)->EnableWindow(false); 
		GetDlgItem(IDC_imgHeight2)->EnableWindow(false); 
 
		GetDlgItem(IDUpdateRectangle)->EnableWindow(false); 
		GetDlgItem(IDSave2DB)->EnableWindow(false); 
		GetDlgItem(IDC_DONE)->EnableWindow(false); 
		GetDlgItem(IDEXITDB)->EnableWindow(true); 
	} 
} 
 
void PCASettings::OnUpdateRectangle()  
{ 
	CvSize dimOfFrame = cvGetSize(cameraFrame); 
	 
	UpdateData(true); 
	point1.x = dimOfFrame.width/2 - m_rectangleWidth/2; 
	point1.y = dimOfFrame.height/2 - m_rectangleHeight/2;	 
	point2.x = point1.x + m_rectangleWidth; 
	point2.y = point1.y + m_rectangleHeight; 
	 
	CString consoleText = ""; 
	consoleText.Format("(X,Y) of Point1 = (%d,%d) & (X,Y) of Point2 = (%d,%d)\r\n",point1.x, point1.y, point2.x, point2.y); 
	CEdit* console = (CEdit*)GetDlgItem(IDC_STATUS); 
	console->SetSel(-1, false); 
	console->ReplaceSel(LPCTSTR(consoleText)); 
} 
 
void PCASettings::OnSave2DB()  
{ 
	CEdit* console = (CEdit*)GetDlgItem(IDC_STATUS); 
	console->SetSel(-1, false); 
		 
	UpdateData(true); 
	IplImage* ROI = cvCloneImage(cameraFrame); 
	cvSetImageROI(ROI, cvRect(point1.x, point1.y, point2.x-point1.x, point2.y-point1.y)); 
	 
	CString filename; 
	if (DBaseType == 0) 
		filename.Format("%s\\eye%d.jpg", m_DBdirectory, fileCounter);  
	else 
		filename.Format("%s\\eye%d.jpg", m_DBdirectory2, fileCounter);  
	cvSaveImage(filename, ROI); 
 
	//	**	Inform user 
	filename.Empty(); filename.Format("File saved as %s\\eye%d.jpg\r\n", m_DBdirectory, fileCounter); 
	console->ReplaceSel((LPCTSTR)filename); 
	fileCounter++; 
 
	cvResetImageROI(ROI); 
	cvReleaseImage(&ROI);	 
} 
 
void PCASettings::OnDone()  
{ 
	control = 1; 
	fileCounter = 0; 
} 
 
void PCASettings::OnExitdb()  
{ 
	EndDialog(1); 
} 
 
void PCASettings::OnDatabaseoperationsExit()  
{ 
	control = 1; 
	EndDialog(1); 
} 
 
bool PCASettings::ChooseFolder(char* folderName) 
{ 
	BROWSEINFO bi; 
	ITEMIDLIST* pItemIDList; 
	 
	char folder[_MAX_PATH]; 
	memset(&bi, 0, sizeof(bi)); 
	bi.hwndOwner = m_hWnd; 
	bi.pszDisplayName = folder; 
	bi.lpszTitle = "Choose Database Folder"; 
	 
	if((pItemIDList = SHBrowseForFolder(&bi))!=NULL)  
	{ 
		SHGetPathFromIDList(pItemIDList, folderName); 
		return true; 
	} 
	else 
		return false; 
 
} 
 
void PCASettings::OnChoosedirectory1()  
{ 
	char folder[_MAX_PATH]	; 
	if (ChooseFolder(folder) == true) 
	{ 
		m_DBdirectory.Format("%s", folder); 
		UpdateData(false); 
	} 
	 
	CEdit* console = (CEdit*)GetDlgItem(IDC_STATUS); 
	console->SetSel(-1, false); 
	console->ReplaceSel("EyeDatabase directory change.....OK\r\n"); 
} 
 
void PCASettings::OnChoosedirectory2()  
{ 
	char folder[_MAX_PATH]	; 
	if (ChooseFolder(folder) == true) 
	{ 
		m_DBdirectory2.Format("%s", folder); 
		UpdateData(false); 
	} 
	CEdit* console = (CEdit*)GetDlgItem(IDC_STATUS); 
	console->SetSel(-1, false); 
	console->ReplaceSel("BlinkDatabase directory change.....OK\r\n"); 
}