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();
}