www.pudn.com > segmentaion.rar > testDlg.cpp


// testDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "test.h" 
#include "testDlg.h" 
#include "cv.h" 
#include "highgui.h" 
#include "cxcore.h" 
#include "WaterSeg.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
CString l_strFileName; 
int addBoundary=0; 
int showMidterm=0; 
int showResult=1; 
long t1,t2; 
int SegNum=-1; 
IplImage* src = 0; 
IplImage* msk = 0; 
IplImage* segmented = 0; 
IplImage* Lrgb = 0; 
CvMat* Boundary = 0; 
CvMat* initial = 0; 
 
CString msgStr; 
int* Label; 
 
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 
} 
 
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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTestDlg dialog 
 
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CTestDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CTestDlg) 
		// 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); 
} 
 
void CTestDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CTestDlg) 
	// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
	DDX_Control(pDX, IDC_EDIT1, m_Edit); 
	DDX_Control(pDX, IDC_EDIT2, m_edit2); 
} 
 
BEGIN_MESSAGE_MAP(CTestDlg, CDialog) 
	//{{AFX_MSG_MAP(CTestDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_OPENFILE, OnOpenfile) 
	//}}AFX_MSG_MAP 
	ON_BN_CLICKED(IDC_BUTSeg, &CTestDlg::OnBnClickedButseg) 
	ON_BN_CLICKED(IDC_OPENFILE2, &CTestDlg::OnBnClickedOpenfile2) 
 
	ON_BN_CLICKED(IDC_RADIO4, &CTestDlg::OnBnClickedRadio4) 
	ON_BN_CLICKED(IDC_RADIO5, &CTestDlg::OnBnClickedRadio5) 
	ON_BN_CLICKED(IDC_RADIO6, &CTestDlg::OnBnClickedRadio6) 
	ON_BN_CLICKED(IDC_CHECK1, &CTestDlg::OnBnClickedCheck1) 
	ON_BN_CLICKED(IDC_RADIO1, &CTestDlg::OnBnClickedRadio1) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTestDlg message handlers 
 
BOOL CTestDlg::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); 
		} 
	} 
 
	 
	UpdateData(FALSE); 
 
	// 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 
	 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CTestDlg::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 CTestDlg::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(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CTestDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CTestDlg::OnOpenfile()  
{ 
	CFileDialog l_SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"(*.bmp),(*.jpg),(*.ppm)|*.bmp;*.jpg;*.ppm||"); 
    int iRet = l_SampleDlg.DoModal(); 
     
    l_strFileName = l_SampleDlg.GetPathName(); 
	if (l_strFileName.IsEmpty()) 
		return; 
	 
	cvReleaseImage(&src); 
	cvReleaseImage(&msk); 
	cvReleaseImage(&segmented); 
	cvReleaseImage(&Lrgb); 
	cvReleaseMat(&Boundary); 
	cvReleaseMat(&initial); 
	src = 0; 
	msk = 0; 
	segmented = 0; 
	Lrgb = 0; 
	Boundary=0; 
	initial=0; 
 
	if( (src = cvLoadImage(l_strFileName,1)) == 0 )    
		return ; 
	cvDestroyAllWindows(); 
	msk=0; 
 
	cvNamedWindow("Original Image",1); 
	cvShowImage("Original Image",src); 
 
	delete [] Label; 
	Label=new int [src->width*src->height]; 
	SegNum=-1; 
} 
 
void CTestDlg::OnBnClickedOpenfile2() 
{ 
	if (src==0) 
	{ 
		AfxMessageBox("Open Original Image First"); 
		return; 
	} 
 
	CFileDialog l_SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"(*.bmp),(*.jpg),(*.ppm)|*.bmp;*.jpg;*.ppm||"); 
	int iRet = l_SampleDlg.DoModal(); 
 
	l_strFileName = l_SampleDlg.GetPathName(); 
	if (l_strFileName.IsEmpty()) 
		return; 
 
	cvReleaseImage(&msk); 
	if( (msk = cvLoadImage(l_strFileName,-1)) == 0 )    
		return ; 
 
	if (msk->width!=src->width || msk->height!=src->height) 
	{ 
		AfxMessageBox("Mask Image Should Have Same Size As Original Image"); 
		cvReleaseImage(&msk);	 
		msk=0; 
		return; 
	} 
 
	cvNamedWindow("Mask Image",1); 
	cvShowImage("Mask Image",msk); 
 
	SegNum=-1; 
} 
 
 
 
void CTestDlg::OnBnClickedButseg() 
{ 
	if (l_strFileName.IsEmpty()) 
		return; 
 
	CvSize imageSize =cvGetSize(src); 
	int width=imageSize.width; 
	int height=imageSize.height; 
	int nChannels=src->nChannels; 
 
	// Get Original Image 
	CvMat* ChannelImage[3] ={0,0,0}; 
	for (int n=0; nnChannels; n++)  
		ChannelImage[n]=cvCreateMat(height, width, CV_8UC1 ); 
	cvSplit(src, ChannelImage[0],ChannelImage[1],ChannelImage[2],NULL ); 
 
	unsigned char* originalImage[3]={0,0,0}; 
	for (int i=0; idata.ptr; 
 
	// Get Background Image 
	unsigned char* maskImage[3]={0,0,0}; 
	if (msk!=0 && height==msk->height && width==msk->width) 
	{ 
		CvMat* cvMskImage[3] ={0,0,0}; 
		for (int n=0; nnChannels; n++)  
			cvMskImage[n]=cvCreateMat(height, width, CV_8UC1 ); 
		if (msk->nChannels>1) 
			cvSplit(msk, cvMskImage[0],cvMskImage[1],cvMskImage[2],NULL ); 
		else  
			for (int i=0; idata.ptr)[j*width+i]=msk->imageData[j*(msk->widthStep)+i]; 
 
		for (int i=0; inChannels; i++) 
			maskImage[i]=cvMskImage[i]->data.ptr; 
 
	} 
 
 
	Boundary=cvCreateMat(height, width, CV_8UC1 ); 
	initial=cvCreateMat(height, width, CV_8UC1 ); 
	Lrgb=cvCreateImage(imageSize, IPL_DEPTH_8S, 3); 
	Lrgb->widthStep=Lrgb->width*3; 
 
	CString num; 
	int minSegNum=0; 
	m_Edit.GetWindowText(num); 
	minSegNum=atoi(num); 
	int filterSize; 
	m_edit2.GetWindowText(num); 
	filterSize=atoi(num); 
	if (filterSize==0) 
		filterSize=3; 
 
 
	t1=GetTickCount(); 
 
	SegNum=WaterSeg(originalImage,maskImage,width,height,nChannels,filterSize,1,Label); 
	t2=GetTickCount(); 
 
 
	getBoundary(Label,initial->data.ptr,width, height); 
 
 
	SegNum=regionMerge(Label,SegNum,width, height,originalImage,minSegNum,0); 
	t2=GetTickCount(); 
 
	getBoundary(Label,Boundary->data.ptr,width, height); 
 
	segmented=cvCloneImage(src); 
	if (nChannels>1) 
	{	 
		cvMerge( ChannelImage[0], ChannelImage[1], ChannelImage[2], NULL, segmented); 
	} 
	else 
	{ 
		segmented=cvGetImage( ChannelImage[0], segmented ); 
	} 
	cvDestroyAllWindows(); 
	if (showResult==0) 
		CTestDlg::OnBnClickedRadio4(); 
	if (showResult==1) 
		CTestDlg::OnBnClickedRadio5(); 
	if (showResult==2) 
		CTestDlg::OnBnClickedRadio6(); 
	if (showResult==3) 
		CTestDlg::OnBnClickedRadio1(); 
 
 
	 
	 
 
	msgStr.Format("After merge,%d regions, processing time: %dms", SegNum,t2-t1); 
	AfxMessageBox (msgStr); 
 
	for (int n=0; nnChannels; n++)  
		cvReleaseMat(&ChannelImage[n]); 
 
} 
 
void CTestDlg::OnBnClickedRadio4() 
{ 
	showResult=0; 
	if (src!=0) 
	{ 
		cvDestroyAllWindows(); 
 
		if (addBoundary==1) 
		{ 
			IplImage* dst=cvCloneImage(src); 
			CvMat* ChannelImage[3] ={0,0,0}; 
			for (int n=0; nnChannels; n++)  
				ChannelImage[n]=cvCreateMat(src->height, src->width, CV_8UC1 ); 
 
			if (src->nChannels>1) 
			{	 
				cvSplit(src, ChannelImage[0],ChannelImage[1],ChannelImage[2],NULL ); 
				cvMax(Boundary,ChannelImage[2],ChannelImage[2]); 
				cvNot(Boundary,Boundary); 
				cvMin(Boundary,ChannelImage[0],ChannelImage[0]); 
				cvMin(Boundary,ChannelImage[1],ChannelImage[1]); 
				cvMerge( ChannelImage[0], ChannelImage[1], ChannelImage[2], NULL, dst); 
				cvNamedWindow("Original Image with Boundary of Segments",1); 
				cvShowImage("Original Image with Boundary of Segments",dst); 
				cvNot(Boundary,Boundary); 
 
			} 
			else 
			{ 
				cvMax(Boundary,dst,dst); 
				cvNamedWindow("Original Image with Boundary of Segments",1); 
				cvShowImage("Original Image with Boundary of Segments",dst); 
 
			} 
			cvReleaseImage(&dst); 
			for (int n=0; nnChannels; n++)  
			{ 
				cvReleaseMat(&ChannelImage[n]); 
			} 
		} 
		else 
		{ 
			cvNamedWindow("Original Image",1); 
			cvShowImage("Original Image",src); 
		} 
 
	} 
} 
 
 
void CTestDlg::OnBnClickedRadio5() 
{ 
	 
	showResult=1; 
	if (segmented!=0) 
	{ 
		cvDestroyAllWindows(); 
 
		if (addBoundary==1) 
		{ 
			IplImage* dst=cvCloneImage(segmented); 
			CvMat* ChannelImage[3] ={0,0,0}; 
			for (int n=0; nnChannels; n++)  
				ChannelImage[n]=cvCreateMat(src->height, src->width, CV_8UC1 ); 
 
			if (src->nChannels>1) 
			{	 
				cvSplit(segmented, ChannelImage[0],ChannelImage[1],ChannelImage[2],NULL ); 
				cvMax(Boundary,ChannelImage[2],ChannelImage[2]); 
				cvMax(Boundary,ChannelImage[0],ChannelImage[0]); 
				cvMax(Boundary,ChannelImage[1],ChannelImage[1]); 
				cvMerge( ChannelImage[0], ChannelImage[1], ChannelImage[2], NULL, dst); 
				cvNamedWindow("Segmented Image with Boundary",1); 
				cvShowImage("Segmented Image with Boundary",dst); 
 
			} 
			else 
			{ 
				cvMax(Boundary,dst,dst); 
				cvNamedWindow("Segmented Image with Boundary",1); 
				cvShowImage("Segmented Image with Boundary",dst); 
 
			} 
			cvReleaseImage(&dst); 
			for (int n=0; nnChannels; n++)  
			{ 
				cvReleaseMat(&ChannelImage[n]); 
			} 
		} 
		else 
		{ 
			cvNamedWindow("Segmented Image",1); 
			cvShowImage("Segmented Image",segmented); 
		} 
	} 
	 
 
} 
 
void CTestDlg::OnBnClickedRadio6() 
{ 
	showResult=2; 
	if (segmented!=0) 
	{ 
		cvDestroyAllWindows(); 
		LabelToRgb(Label,SegNum,Lrgb->imageData, src->width, src->height); 
		cvNamedWindow("Pseudo Color Image After Merging",1); 
		cvShowImage("Pseudo Color Image After Merging",Lrgb); 
 
	} 
} 
 
void CTestDlg::OnBnClickedRadio1() 
{ 
	showResult=3; 
	if (initial!=0) 
	{ 
		cvDestroyAllWindows(); 
		cvNamedWindow("Boundary of Segments Before Merging",1); 
		cvShowImage("Boundary of Segments Before Merging",initial); 
 
	} 
} 
 
void CTestDlg::OnBnClickedCheck1() 
{ 
	addBoundary=1-addBoundary; 
	if (showResult==0) 
		CTestDlg::OnBnClickedRadio4(); 
	if (showResult==1) 
		CTestDlg::OnBnClickedRadio5(); 
 
}