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

📄 dlgclusterpatternrecog.cpp

📁 模式识别的作业代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DlgClusterPatternRecog.cpp : implementation file
//

#include "stdafx.h"
#include "ImageSysZLF01.h"
#include "DlgClusterPatternRecog.h"

//for CScrollBar
#include <afxwin.h>
#include <stdlib.h>
#include <vfw.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgClusterPatternRecog dialog


CDlgClusterPatternRecog::CDlgClusterPatternRecog(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgClusterPatternRecog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgClusterPatternRecog)
	m_nClassNumber = 10; //10
	m_nThreshold = 10;
	m_nIterativeNumber = 20;//10
	m_nCurrentIterate = 0;

	m_bFirst=true;
	//}}AFX_DATA_INIT
}


void CDlgClusterPatternRecog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgClusterPatternRecog)
	DDX_Control(pDX, IDC_TAB_PR_COORDINATE, m_tabctlPRCoordinate);
	DDX_Text(pDX, IDC_EDIT1, m_nClassNumber);
	DDX_Text(pDX, IDC_EDIT2, m_nThreshold);
	DDX_Text(pDX, IDC_EDIT3, m_nIterativeNumber);
	DDX_Text(pDX, IDC_EDIT4, m_nCurrentIterate);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgClusterPatternRecog, CDialog)
	//{{AFX_MSG_MAP(CDlgClusterPatternRecog)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_BUTTON_PR_EXIT, OnButtonPrExit)
	ON_BN_CLICKED(IDC_RADIO_COORDINATEB, OnRadioCoordinateB)
	ON_BN_CLICKED(IDC_RADIO_COORDINATEG, OnRadioCoordinateG)
	ON_BN_CLICKED(IDC_RADIO_COORDINATER, OnRadioCoordinateR)
	ON_BN_CLICKED(IDC_BUTTON_PR_UPDATE, OnButtonPrUpdate)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(IDR_MENU_PR3_KMEAN_BEGINSAMPLE, OnMenuPr3KmeanBeginsample)
	ON_COMMAND(IDR_MENU_PR3_KMEAN_ENDSAMPLE, OnMenuPr3KmeanEndsample)
	ON_WM_LBUTTONDOWN()
	ON_BN_CLICKED(IDC_BUTTON_PR_ACCEPT, OnButtonPrAccept)
	ON_BN_CLICKED(IDC_BUTTON_PR_RECOGNIZE, OnButtonPrRecognize)
	ON_BN_CLICKED(IDC_BUTTON_PR_RESTORE, OnButtonPrRestore)
	ON_BN_CLICKED(IDC_RADIO_RANDOM, OnRadioRandom)
	ON_BN_CLICKED(IDC_RADIO_SEQUENT, OnRadioSequent)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgClusterPatternRecog message handlers

BOOL CDlgClusterPatternRecog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	// 初试化设置	
	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
	ASSERT_VALID(pDoc);
    
	// 获取DIB
	HDIB hDIB = pDoc->GetHDIB();
	
	LPSTR lpImage=pDoc->GetDIBPtr(hDIB);
	m_lImageData=FindDIBBits(lpImage);
	

//    m_nImageShowWidth =350;
//	m_nImageShowHeight=300;

	// 判断DIB是否为空
	if (hDIB != NULL)
	{
		//获取: DIB宽度,高度
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
		int cxDIB = (int) ::DIBWidth(lpDIB);
		int cyDIB = (int) ::DIBHeight(lpDIB);

		m_lImagePixelNumber=cxDIB*cyDIB;
		
	    m_nImageShowWidth =cxDIB;
		m_nImageShowHeight=cyDIB;

		::GlobalUnlock((HGLOBAL) hDIB);
		
		m_rectImage=CRect(20,0,20+m_nImageShowWidth,m_nImageShowHeight);
	}
	
	//
	// 初始化TAB控件
	m_tabctlPRCoordinate.InsertItem( 0, "2维-坐标轴");
	m_tabctlPRCoordinate.InsertItem( 1, "3维-坐标轴");
	
	// 得到用于绘制的CDC*  
	m_tabctlPRCoordinate.SetCurSel(0);
    m_lpTabDC=m_tabctlPRCoordinate.GetDC();
	
	CRect* lpWnRect=new CRect;
	CRect* lpTabClientRect=new CRect;
	
	WINDOWPLACEMENT* lpwndpl=new WINDOWPLACEMENT;
    ((CWnd*)GetDlgItem(IDC_TAB_PR_COORDINATE))->GetWindowPlacement(lpwndpl);
	
	m_nTabPosX=lpwndpl->rcNormalPosition.left;
	m_nTabPosY=lpwndpl->rcNormalPosition.top;
    
	m_nWhichColorNoUse=COLOR_RED;
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATER))->SetCheck(1);//取消选中
	
    m_TabRect.left  =m_nTabPosX+5*nXOffset;
	m_TabRect.top   =m_nTabPosY+5*nYOffset;
	m_TabRect.right =m_nTabPosX+AXIS_MAXIMIZE+15*nXOffset;
	m_TabRect.bottom=m_nTabPosY+AXIS_MAXIMIZE+10*nYOffset;
	
	m_lClusterSampleStatus=KMEANSAMPLE_CLOSED;

	//初始参数的显示
	UpdateData(FALSE);


	//设定分类矩阵的初始大小
	m_matrixClassTag.Init(m_lImagePixelNumber,m_nClassNumber);
	
	((CButton*)GetDlgItem(IDC_BUTTON_PR_RECOGNIZE))->EnableWindow(FALSE);

	m_lCenterInitialMethod=CLUSTERING_INITIAL_CENTER_SEQUENT;
	((CButton*)GetDlgItem(IDC_RADIO_SEQUENT))->SetCheck(1);//取消选中


	return TRUE;  
}


void CDlgClusterPatternRecog::DrawImage()
{
/*
    CPaintDC dc(this); // device context for painting
	
	// 获取文档
    CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
	ASSERT_VALID(pDoc);
    
	// 获取DIB
	HDIB hDIB = pDoc->GetHDIB();
	
	// 判断DIB是否为空
	if (hDIB != NULL)
	{
		//获取: DIB宽度,高度
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
		int cxDIB = (int) ::DIBWidth(lpDIB);
		int cyDIB = (int) ::DIBHeight(lpDIB);
		::GlobalUnlock((HGLOBAL) hDIB);
		
		CRect rcDIB=CRect(0,0,cxDIB,cyDIB);
						
		::PaintDIB((HDC)dc.m_hDC, &m_rectImage, pDoc->GetHDIB(),&rcDIB, pDoc->GetDocPalette());
	}

	this->GetActiveWindow()->InvalidateRect(&m_rectImage,TRUE);
*/
}


void CDlgClusterPatternRecog::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// 获取文档
    CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
	ASSERT_VALID(pDoc);
    
	// 获取DIB
	HDIB hDIB = pDoc->GetHDIB();
	
	// 判断DIB是否为空
	if (hDIB != NULL)
	{
		//获取: DIB宽度,高度
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
		int cxDIB = (int) ::DIBWidth(lpDIB);
		int cyDIB = (int) ::DIBHeight(lpDIB);
		::GlobalUnlock((HGLOBAL) hDIB);
		
		CRect rcDIB=CRect(0,0,cxDIB,cyDIB);
		
		::PaintDIB((HDC)dc.m_hDC, &m_rectImage, pDoc->GetHDIB(),&rcDIB, pDoc->GetDocPalette());
	}

//	//绘制坐标轴
//	Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
//	GetDlgItem(IDC_TAB_PR_COORDINATE)->SendMessage(WM_PAINT);

}

void CDlgClusterPatternRecog::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//	BYTE R,G,B;
//    CString pos;
//	
//	if (m_rectImage.PtInRect(point))  //处于图像区域
//	{
//		::SetCursor(::LoadCursor(NULL, IDC_CROSS));
//		
//		//
//		//this->GetActiveWindow()->Invalidate();
//		//
//		//
//		CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
//		
//        CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
//		
//		HDIB hDIB=pDoc->GetHDIB();
//        
//        GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);
//		
////		m_lColorValR=R;
////		m_lColorValG=G;
////		m_lColorValB=B;
//        
//		UpdateData(FALSE);
//		
//		//显示样本颜色
//		CBrush* pBrush=new CBrush;
//		pBrush->CreateSolidBrush(RGB(R,G,B));
//		
//		CRect rct;
//		WINDOWPLACEMENT* lpwndpl=new WINDOWPLACEMENT;
//		((CWnd*)GetDlgItem(IDC_STATIC_SAMPLE))->GetWindowPlacement(lpwndpl);
//		
//		rct=lpwndpl->rcNormalPosition;
//		this->GetDC()->FillRect(&rct,pBrush);
//		
//		delete pBrush;
//		return;
//	}
//	


	CDialog::OnMouseMove(nFlags, point);
}


void CDlgClusterPatternRecog::OnButtonPrExit() 
{
	// TODO: Add your control notification handler code here
	CDialog::OnOK();
}

void CDlgClusterPatternRecog::OnRadioCoordinateB() 
{
	// TODO: Add your control notification handler code here
	m_nWhichColorNoUse=COLOR_BLUE;
	
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATER))->SetCheck(0);//取消选中
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATEG))->SetCheck(0);//取消选中

	Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
	
}

void CDlgClusterPatternRecog::OnRadioCoordinateG() 
{
	// TODO: Add your control notification handler code here
	m_nWhichColorNoUse=COLOR_GREEN;
	
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATER))->SetCheck(0);;//取消选中
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATEB))->SetCheck(0);;//取消选中

	Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
	
}

void CDlgClusterPatternRecog::OnRadioCoordinateR() 
{
	// TODO: Add your control notification handler code here
	m_nWhichColorNoUse=COLOR_RED;
	
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATEG))->SetCheck(0);;//取消选中
	((CButton*)GetDlgItem(IDC_RADIO_COORDINATEB))->SetCheck(0);;//取消选中

	Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
		
}


void CDlgClusterPatternRecog::Draw2DimetionAxis(CDC *pDC, int nWhichNoUse)
{
	//注意这里lpBitsData指向的是图像数据,不包括颜色表!
	int X0,Y0;
	
	// 字符串
	CString str,strXLabel,strYLabel;
		
	// 显示等待光标
	BeginWaitCursor();

	// 创建画笔对象_红色
	CPen* pPenRed  = new CPen;
	CPen* pPenRed1 = new CPen;
	pPenRed->CreatePen(PS_SOLID,2,RGB(255,0,0));
	pPenRed1->CreatePen(PS_SOLID,1,RGB(255,0,0));
	
	// 创建画笔对象_蓝色
	CPen* pPenBlue = new CPen;
	CPen* pPenBlue1= new CPen;
	pPenBlue->CreatePen(PS_SOLID,2,RGB(0,0, 255));
	pPenBlue1->CreatePen(PS_DOT,1,RGB(0,0, 255));
	
	// 创建画笔对象_黑色
	CPen* pPenBlack = new CPen;
	pPenBlack->CreatePen(PS_SOLID,2,RGB(0,0, 0));

    //首先覆盖上次的绘图
	CBrush* pBrush_bk=new CBrush;
	pBrush_bk->CreateSolidBrush(pDC->GetBkColor());
    //pBrush_bk->CreateSolidBrush(RGB(255,0,0));

	CBrush* pOldBrush=pDC->SelectObject(pBrush_bk);

	//这里不可以使用Tab控件的指针!!!
	this->GetDC()->Rectangle(m_TabRect + CPoint(1,2));
    this->GetDC()->SelectObject(pOldBrush);

	// 选中当前红色画笔,并保存以前的画笔
	CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
	
	// 绘制坐标轴
	pDC->MoveTo(5*nXOffset,5*nYOffset);
	
	// 垂直轴
	pDC->LineTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
	
	// 水平轴
	pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
	
	switch (nWhichNoUse)
	{
		case COLOR_RED:
			strXLabel="G";
			strYLabel="B";
			break;
		case COLOR_GREEN:
			strXLabel="R";
			strYLabel="B";
			break;
		case COLOR_BLUE:
			strXLabel="R";
			strYLabel="G";
	}
	//显示坐标轴的标签
	pDC->TextOut(AXIS_MAXIMIZE+15*nXOffset  ,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, strXLabel);
	pDC->TextOut(5*nXOffset-12*nLittleOffset,5*nYOffset, strYLabel);


	//得到原点
	X0=5*nXOffset;
	Y0=AXIS_MAXIMIZE+10*nYOffset;
	m_ptFigureXY0.x=X0;
	m_ptFigureXY0.y=Y0;

	// 写坐标
	str.Format("0");
	pDC->TextOut(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, str);
	
	str.Format("255");
	pDC->TextOut(5*nXOffset-13*nLittleOffset,10*nYOffset, str);
	pDC->TextOut(AXIS_MAXIMIZE+5*nXOffset,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, str);
	

	// 绘制X轴箭头
	pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset - nXOffset,AXIS_MAXIMIZE+10*nYOffset +nXOffset);
	pDC->MoveTo(AXIS_MAXIMIZE+15*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
	pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset - nXOffset,AXIS_MAXIMIZE+10*nYOffset -nXOffset);
	
	// 绘制X轴箭头
	pDC->MoveTo(5*nXOffset,5*nYOffset);
	pDC->LineTo(5*nXOffset - nXOffset,5*nYOffset + nXOffset);
	pDC->MoveTo(5*nXOffset,5*nYOffset);
	pDC->LineTo(5*nXOffset + nXOffset,5*nYOffset + nXOffset);
	

	// 绘制X轴刻度
   	pDC->SelectObject(pPenRed1);

	int i;
	pDC->MoveTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
	for (i = 4; i < 256; i += 5)
	{
		if ((i & 1) == 0)
		{
			// 10的倍数
			pDC->MoveTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset);
			pDC->LineTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset +4);
		}
		else
		{
			// 5的倍数
			pDC->MoveTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset);
			pDC->LineTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset +2);
		}
	}


	// 绘制Y轴刻度
	pDC->MoveTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
	for (i = 4; i < 256; i += 5)
	{
		if ((i & 1) == 0)
		{
			// 10的倍数
			pDC->MoveTo(5*nXOffset    , AXIS_MAXIMIZE+10*nYOffset - i);
			pDC->LineTo(5*nXOffset - 4, AXIS_MAXIMIZE+10*nYOffset - i);
		}
		else
		{
			// 5的倍数
			pDC->MoveTo(5*nXOffset    , AXIS_MAXIMIZE+10*nYOffset - i);
			pDC->LineTo(5*nXOffset - 2, AXIS_MAXIMIZE+10*nYOffset - i);
		}
	}


	//绘制数据点列
	DrawDataPoint(pDC,nWhichNoUse);
	
	// 绘制坐标区域的矩形边线(上、右)
	// 更改成蓝色画笔
	pDC->SelectObject(pPenBlue1);

	pDC->MoveTo(5*nXOffset,10*nYOffset);
	pDC->LineTo(5*nXOffset + AXIS_MAXIMIZE,10*nYOffset);
	pDC->LineTo(5*nXOffset + AXIS_MAXIMIZE,10*nYOffset+AXIS_MAXIMIZE);

	// 恢复以前的画笔
	pDC->SelectObject(pOldPen);	
	
   	// 恢复正常光标
	EndWaitCursor();
	
	// 删除新的画笔
	delete pPenRed;
	delete pPenRed1;
	delete pPenBlue;
	delete pPenBlue1;
	delete pPenBlack;
	delete pBrush_bk;

}

void CDlgClusterPatternRecog::OnButtonPrUpdate() 
{
	// TODO: Add your control notification handler code here
	//绘制坐标轴
	Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);	
}


void CDlgClusterPatternRecog::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//手工识别样本采样
	m_ptCurRButtonDown=point;
	
	if(m_rectImage.PtInRect(point))
	{   
		CMenu mu;
		CRect WndRect;
		
		mu.LoadMenu(IDR_MENU_PATTERN_0302);
        
		if(m_lClusterSampleStatus==KMEANSAMPLE_CLOSED)
		{
			mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_ENDSAMPLE   ,MF_CHECKED);
			mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_BEGINSAMPLE ,MF_UNCHECKED);
		}
		else
		{
			mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_ENDSAMPLE   ,MF_UNCHECKED);
			mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_BEGINSAMPLE ,MF_CHECKED);
		}
		
		//这种方法是不是太麻烦了?
		CWnd* pWnd=this->GetDC()->GetWindow();
		pWnd->GetWindowRect(&WndRect);
		mu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON ,point.x+WndRect.left,point.y+WndRect.top,pWnd);
		
		return ;				
	}
	
	CDialog::OnRButtonDown(nFlags, point);
}

void CDlgClusterPatternRecog::OnMenuPr3KmeanBeginsample() 
{
	// TODO: Add your command handler code here
	m_lClusterSampleStatus=KMEANSAMPLE_OPEN;
}

void CDlgClusterPatternRecog::OnMenuPr3KmeanEndsample() 
{
	// TODO: Add your command handler code here
	m_lClusterSampleStatus=KMEANSAMPLE_CLOSED;
	
}

void CDlgClusterPatternRecog::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//	tagRGBVal rgb;
//	BYTE R,G,B;
//	
//	if(	m_lClusterSampleStatus==KMEANSAMPLE_OPEN)
//	{
//		::SetCursor(::LoadCursor(NULL, IDC_UPARROW));
//		
//		CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
//		
//		CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
//		
//		HDIB hDIB=pDoc->GetHDIB();
//		
//		GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);        
//		
//		rgb.R=R;
//		rgb.G=G;
//		rgb.B=B;
//		
//		DrawCurSamplePoint(rgb);
//		
//		m_arrClusterSampleData.Add(rgb);	
//
//		return;
//		
//	}

	CDialog::OnLButtonDown(nFlags, point);
}

//绘制当前采样点
void CDlgClusterPatternRecog::DrawCurSamplePoint(tagRGBVal rgb)
{
	BYTE btXColVal,btYColVal;

	switch (m_nWhichColorNoUse)
	{
	case COLOR_RED:
		btXColVal=rgb.B;
		btYColVal=rgb.G;
		break;
	case COLOR_GREEN:
		btXColVal=rgb.R;
		btYColVal=rgb.B;
		break;
	case COLOR_BLUE:
		btXColVal=rgb.R;
		btYColVal=rgb.G;
	}


	CDC* pDC=m_lpTabDC;
	
	CPen* pPenRed = new CPen;
	pPenRed->CreatePen(PS_SOLID,2,RGB(255,0, 0));
	
	CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
	
    
	int CurX=m_ptFigureXY0.x + btXColVal;
	int CurY=m_ptFigureXY0.y - btYColVal;
	int dx,dy;
	dx=dy=2;
	
	pDC->MoveTo(CurX-dx,CurY-dy);
	pDC->LineTo(CurX+dx,CurY+dy);
	
	pDC->MoveTo(CurX-dx,CurY+dy);
	pDC->LineTo(CurX+dx,CurY-dy);
	
	pDC->SelectObject(pOldPen);
	
	delete pPenRed;
		
}




void CDlgClusterPatternRecog::OnButtonPrAccept() 
{

⌨️ 快捷键说明

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