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

📄 dlgpatternrecog.cpp

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

#include "stdafx.h"
#include "ImageSysZLF01.h"
#include "DlgPatternRecog.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlgPatternRecog dialog


CDlgPatternRecog::CDlgPatternRecog(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgPatternRecog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgPatternRecog)
//	m_lColorValR = 0;
//	m_lColorValG = 0;
//	m_lColorValB = 0;
	m_nWhichColorNoUse = -1;
	m_btObjectColR = 0;
	m_btObjectColG = 0;
	m_btObjectColB = 0;
	m_btBackroundColR = 0;
	m_btBackroundColG = 0;
	m_rectImage=CRect(0,0,0,0);
	m_lCoordinateDim=DIMETION_2;
	m_lpTabDC=NULL;
	m_nDIBHeight=0;
	m_nDIBWidth=0;
	m_TabRect=NULL;
	m_fA = 0.0f;
	m_fB = 0.0f;
    m_blIsUpdated=true;
	m_btBackroundColB = 0;
	m_lMultiModeEnabled=false;
	
	m_b3ClassRecogEnabled=false;
	m_nCountNumOfLines=0;
	m_arr3ClassLineArray.RemoveAll();
	//}}AFX_DATA_INIT
}


void CDlgPatternRecog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgPatternRecog)
	DDX_Control(pDX, IDC_TAB_PR_COORDINATE, m_tabctlPRCoordinate);
	DDX_Text(pDX, IDC_EDIT_OBJECT_R, m_btObjectColR);
	DDX_Text(pDX, IDC_EDIT_OBJECT_G, m_btObjectColG);
	DDX_Text(pDX, IDC_EDIT_OBJECT_B, m_btObjectColB);
	DDX_Text(pDX, IDC_EDIT_BACKROUND_R, m_btBackroundColR);
	DDX_Text(pDX, IDC_EDIT_BACKROUND_G, m_btBackroundColG);
	DDX_Text(pDX, IDC_EDIT_BACKROUND_B, m_btBackroundColB);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgPatternRecog, CDialog)
	//{{AFX_MSG_MAP(CDlgPatternRecog)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_RADIO_COORDINATER, OnRadioNoUseR)
	ON_BN_CLICKED(IDC_RADIO_COORDINATEG, OnRadioNoUseG)
	ON_BN_CLICKED(IDC_RADIO_COORDINATEB, OnRadioNoUseB)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_PR_COORDINATE, OnSelchangeTabPR)
	ON_BN_CLICKED(IDC_BUTTON_PR_UPDATE, OnButtonPrUpdate)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(IDR_MENU_PR2_MANU, OnMenuPr2Manu)
	ON_COMMAND(IDR_MENU_PR2_AUTO, OnMenuPr2Auto)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(IDR_MENU_PATTERN_0202_OBJ, OnMenuPatternSampleObjManu)
	ON_COMMAND(IDR_MENU_PATTERN_0202_BAK, OnMenuPatternSampleBakManu)
	ON_COMMAND(IDR_MENU_PATTERN_0203_ADDOBJ, OnMenuPatternAutoSampleAddObj)
	ON_COMMAND(IDR_MENU_PATTERN_0203_ADDBAK, OnMenuPatternAutoSampleAddBak)
	ON_COMMAND(IDR_MENU_PATTERN_0203_DELBAK, OnMenuPatternAutoSampleDelBak)
	ON_COMMAND(IDR_MENU_PATTERN_0203_DELOBJ, OnMenuPatternAutoSampleDelObj)
	ON_COMMAND(IDR_MENU_PATTERN_0203_END, OnMenuPattern0AutoSampleEnd)
	ON_BN_CLICKED(IDC_BUTTON_PR_EXIT, OnButtonPrExit)
	ON_BN_CLICKED(IDC_BUTTON_PR_RECOGNIZE, OnButtonPrRecognize)
	ON_COMMAND(IDR_MENU_PR2_RESTORE, OnMenuPr2Restore)
	ON_BN_CLICKED(IDC_BUTTON_PR_RESTORE, OnButtonPrRestore)
	ON_COMMAND(IDR_MENU_PATTERN_ENABLE_REAL, OnMenuPatternEnableReal)
	ON_COMMAND(IDR_MENU_PATTERN_DISENABLE_REAL, OnMenuPatternDisenableReal)
	ON_COMMAND(IDR_MENU_PATTERN_0203_ADDTHIRD, OnMenuPatternMultiModeAddthird)
	ON_COMMAND(IDR_MENU_PR2_3CLASSLINEAR, OnMenuPr23ClassLinear)
	ON_COMMAND(IDR_MENU_PR2_UNENABLE3CLASSLINEAR, OnMenuPr2Unenable3ClassLinear)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgPatternRecog message handlers

void CDlgPatternRecog::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	// 获取文档
    
	// 以下这5句花费了整整一个晚上的时间!!!
	// 对文档的检索从模板处得到当然是最简单的了!!!
    CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();

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

		::GlobalUnlock((HGLOBAL) hDIB);
		
		CRect rcDIB;
		rcDIB.top = 0;
		rcDIB.left = 20;
		rcDIB.right = cxDIB;
		rcDIB.bottom = cyDIB;
		
		CRect rcDest;
		
		rcDest = rcDIB;
		m_rectImage=rcDIB;

		::PaintDIB((HDC)dc.m_hDC, &rcDest, pDoc->GetHDIB(),&rcDIB, pDoc->GetDocPalette());
			
	}
}

void CDlgPatternRecog::OnMouseMove(UINT nFlags, CPoint point) 
{
	BYTE R,G,B;
    CString pos;
	
	if (m_TabRect.PtInRect(point))  //处于坐标区域
	{
		::SetCursor(::LoadCursor(NULL, IDC_CROSS));
			
			// 判断是否正在拖动
		if (m_bIsDraging)
		{
			if(m_b3ClassRecogEnabled)  //3类线性识别,特殊处理
			{
				CDC* pDC=m_lpTabDC;
				
				// 设置绘制方式为异或模式
				int nOldDrawMode = pDC->SetROP2(R2_XORPEN);
				
				// 创建新的画笔,选中新画笔
				CPen* pPen = new CPen;
				pPen->CreatePen(PS_SOLID,2,RGB(0,255,0));
				CGdiObject* pOldPen = pDC->SelectObject(pPen);
				
				// 判断是否已经画过橡皮筋线
				if (m_bDrawed)
				{
					// 擦去以前的橡皮筋线				
					pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
					pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
				}
				
				// 保存当前的坐标
				m_p2 = point;
				
				
				// 绘制一条新橡皮筋线
				pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
				pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
				
				// 设置m_bDrawed为TRUE
				m_bDrawed = TRUE;
				// 恢复成以前的绘制模式
				pDC->SetROP2(nOldDrawMode);
				
				// 选回以前的画笔
				pDC->SelectObject(pOldPen);
				
				delete pPen;
				
				return;
			
			}
			
		}
		

	}

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

	if (m_TabRect.PtInRect(point))  //处于坐标区域
	{
		::SetCursor(::LoadCursor(NULL, IDC_CROSS));

		// 判断是否正在拖动
		if (m_bIsDraging)
		{
			CDC* pDC=m_lpTabDC;

			// 设置绘制方式为异或模式
			int nOldDrawMode = pDC->SetROP2(R2_XORPEN);

			// 创建新的画笔,选中新画笔
			CPen* pPen = new CPen;
			pPen->CreatePen(PS_SOLID,2,RGB(0,255,0));
			CGdiObject* pOldPen = pDC->SelectObject(pPen);
			
			// 判断是否已经画过橡皮筋线
			if (m_bDrawed)
			{
				// 擦去以前的橡皮筋线				
				pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
				pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
			}
			
			// 保存当前的坐标
			m_p2 = point;

					
			// 绘制一条新橡皮筋线
			pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
			pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
			
			// 设置m_bDrawed为TRUE
			m_bDrawed = TRUE;
			// 恢复成以前的绘制模式
			pDC->SetROP2(nOldDrawMode);
			
			// 选回以前的画笔
			pDC->SelectObject(pOldPen);
			
			delete pPen;

			//是否进行实时处理
			if(m_bIsEnabledRealTimeProcess)
			{
				CPoint logP1,logP2;

				// 保存当前鼠标位置
				m_p2 = point;
							
				if ((m_p1 != m_p2) && (m_p1.x != m_p2.x))  
				{
					// 计算斜率和截距
					GetFigureLogicXY(m_p1,&logP1);
					GetFigureLogicXY(m_p2,&logP2);
					
					m_fA = (float) (logP2.y - logP1.y) / (logP2.x - logP1.x); 
					m_fB = (float) logP1.y - m_fA * logP1.x;

					//实时判别
					TwoModeClassifyTrans(m_fA,m_fB);
        
					//绘制识别后的图像
					DrawRecognizedImage();

				}
			}			

		}

	}

	CDialog::OnMouseMove(nFlags, point);
}



BOOL CDlgPatternRecog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	// this->GetDC()->SetBkMode(TRANSPARENT);
	// this->GetDC()->SetBkColor(OPAQUE);

	// 初始化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;

    //((CWnd*)GetDlgItem(IDC_TAB_PR_COORDINATE))->GetWindowRect(lpWnRect);
    //((CWnd*)GetDlgItem(IDC_TAB_PR_COORDINATE))->GetClientRect(lpTabClientRect);
	
	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;
	

	// 隐藏手工识别样本显示元素
	((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->ShowWindow(SW_SHOW);

	//((CButton*)GetDlgItem(IDC_BUTTON_PR_RECOGNIZE))->EnableWindow(FALSE);

	// 初始化拖动状态
	m_bIsDraging   =FALSE;
	m_lRButtonDown =RBUTTONDOWN_MANU_MODE;
	m_lAuotSampleMode=AUTOSAMPLE_ENDING;
    m_bIsParallelWithXYAxis=PARALLEL_WITH_NO_AXIS;
    
	//实时处理禁止
	m_bIsEnabledRealTimeProcess=FALSE;

	//return TRUE;  // return TRUE unless you set the focus to a control
	return TRUE; // EXCEPTION: OCX Property Pages should return FALSE
}


void CDlgPatternRecog::OnRadioNoUseR()  //使用绿色、蓝色
{
	// 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);;//取消选中

}

void CDlgPatternRecog::OnRadioNoUseG() 
{
	// 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);;//取消选中

}



void CDlgPatternRecog::OnRadioNoUseB() 
{
	// 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);//取消选中

}


//Tab控件选项更改的消息处理函数
void CDlgPatternRecog::OnSelchangeTabPR(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
//	TCITEM* pTabCtrlItem;

	if (m_tabctlPRCoordinate.GetCurSel()==0)  //2-维坐标绘制
	{
		m_lCoordinateDim=DIMETION_2;

		//得到用于绘制的CDC*  
		//m_tabctlPRCoordinate.GetItem(0,pTabCtrlItem);
        m_lpTabDC=m_tabctlPRCoordinate.GetDC();

		((CButton*)GetDlgItem(IDC_BUTTON_PR_UPDATE))->EnableWindow(TRUE);

	}
	else  //3-维坐标绘制
	{
		m_lCoordinateDim=DIMETION_3;
		((CButton*)GetDlgItem(IDC_BUTTON_PR_UPDATE))->EnableWindow(FALSE);

		//得到用于绘制的CDC*  
		//m_tabctlPRCoordinate.GetItem(1,pTabCtrlItem);
        m_lpTabDC=m_tabctlPRCoordinate.GetDC();

		Draw3DimetionAxis(m_lpTabDC, NULL);
	}

	//
	*pResult = 0;
}

void CDlgPatternRecog::OnButtonPrUpdate() 
{
	// TODO: Add your control notification handler code here
	if(m_b3ClassRecogEnabled)  //3类线性识别,特殊处理
	{
		m_arr3ClassLineArray.RemoveAll();
		m_nCountNumOfLines=0;
	}
				
	if (m_lCoordinateDim==DIMETION_3)
	{
		AfxMessageBox("暂时无法绘制3维坐标!");
		return;
	}
	else
	{
		//调用绘图
		 CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    
         CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();

		 LPSTR lpBitsData=::FindDIBBits(pDoc->GetDIBPtr(pDoc->GetHDIB()));
			
		 m_nDIBWidth =DIBWidth (pDoc->GetDIBPtr(pDoc->GetHDIB()));
		 m_nDIBHeight=DIBHeight(pDoc->GetDIBPtr(pDoc->GetHDIB()));

		 Draw2DimetionAxis(m_lpTabDC,lpBitsData,m_nWhichColorNoUse);

		 //重置斜率和截距
		 m_fA=0.0;
		 m_fB=0.0;
	}

	 m_blIsUpdated=true;
}



//2-维坐标值绘制
void CDlgPatternRecog::Draw2DimetionAxis(CDC* pDC,LPSTR lpBitsData,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);
	

⌨️ 快捷键说明

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