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

📄 dlgpatternrecog.cpp

📁 模式识别的作业代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	// 绘制坐标轴
	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);
		}
	}

	
	// 绘制坐标区域的矩形边线(上、右)
	// 更改成蓝色画笔
	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);


	//绘制坐标点
//	BYTE xv,yv;
//   	pDC->SelectObject(pPenBlue);
//	switch (nWhichNoUse)
//	{
//		case COLOR_RED:
//			for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3)  //这里的3表示当前图像为24位真彩!!!
//			{
//				xv=*(lpBitsData+i +COLOR_GREEN); //Green
//				yv=*(lpBitsData+i +COLOR_BLUE); //Blue
//
//				pDC->MoveTo(X0+xv,Y0-yv);
//				pDC->LineTo(X0+xv,Y0-yv);
//			}
//			break;
//		case COLOR_GREEN:
//			for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3)  
//			{
//				xv=*(lpBitsData+i +COLOR_RED); //Red
//				yv=*(lpBitsData+i +COLOR_BLUE); //Blue
//
//				pDC->MoveTo(X0+xv,Y0-yv);
//				pDC->LineTo(X0+xv,Y0-yv);
//			}
//			break;
//		case COLOR_BLUE:
//			for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3)  
//			{
//				xv=*(lpBitsData+i +COLOR_RED); //Red
//				yv=*(lpBitsData+i +COLOR_GREEN); //Green
//
//				pDC->MoveTo(X0+xv,Y0-yv);
//				pDC->LineTo(X0+xv,Y0-yv);
//			}
//	}


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

}

void CDlgPatternRecog::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// 当用户单击鼠标左键开始拖动
	tagRGBVal rgb;
	BYTE R,G,B;

	if(m_TabRect.PtInRect(point))
	{
		if(m_b3ClassRecogEnabled)  //3类线性识别,特殊处理
		{

			if(m_nCountNumOfLines >= MAXIMIZE_LINES)
			{
				CString str;
				str.Format("最多允许绘%d 条分类线!",MAXIMIZE_LINES);
				AfxMessageBox(str);
				return;
			}
			
			// 保存当前鼠标位置
			m_p1 = point;
			
			// 设置拖动状态
			m_bIsDraging = TRUE;
			
			// 设置m_bDrawed为FALSE
			m_bDrawed = FALSE;
			
			//清除更新标志
			m_blIsUpdated=false;  //此句是否可以去掉?
			
			// 更改光标
			::SetCursor(::LoadCursor(NULL, IDC_CROSS));
			
			// 开始跟踪鼠标事件(保证当鼠标移动到窗体外时也可以接收到鼠标释放事件)
			SetCapture();
			return;
			
		}

	}

	if(m_TabRect.PtInRect(point))
	{
		if (!m_blIsUpdated)
		{
			// 设置绘制方式为异或模式
			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);
			}
			pDC->SelectObject(pOldPen);
			pDC->SetROP2(nOldDrawMode);
			//delete pOldPen;
			//delete pPen;

		}

		// 保存当前鼠标位置
		m_p1 = point;
		
		// 设置拖动状态
		m_bIsDraging = TRUE;
		
		// 设置m_bDrawed为FALSE
		m_bDrawed = FALSE;
			
		//清除更新标志
		m_blIsUpdated=false;

		// 更改光标
		::SetCursor(::LoadCursor(NULL, IDC_CROSS));
		
		// 开始跟踪鼠标事件(保证当鼠标移动到窗体外时也可以接收到鼠标释放事件)
		SetCapture();

		return;
	}

	// 添加自动识别采样点
	if(	m_lAuotSampleMode==AUTOSAMPLE_ENDING)
	{
		return;  //已经结束采样
	}

	//添加目标采样点
	if(m_lAuotSampleMode==AUTOSAMPLE_ADDOBJ)
	{
		::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;

		m_arrAutoSampleObjData.Add(rgb);	
		
		DrawCurSamplePoint(rgb);
		
		return;
	}
	
	//添加背景采样点
	if(m_lAuotSampleMode==AUTOSAMPLE_ADDBAK)
	{
		::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;

		m_arrAutoSampleBakData.Add(rgb);	

		DrawCurSamplePoint(rgb);
		
		return;
	}

	//添加第三模式采样点
	if(m_lAuotSampleMode==AUTOSAMPLE_ADDTHIRD)
	{
		::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;

		m_arrAutoSampleThirdData.Add(rgb);	

		DrawCurSamplePoint(rgb);
		
		return;
	}

	CDialog::OnLButtonDown(nFlags, point);
}



void CDlgPatternRecog::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// 当用户释放鼠标左键停止拖动
    CPoint logP1,logP2;
	tagLineInfo line;

	if (m_bIsDraging)
	{
		// 判断当前光标是否在绘制区域
		if(m_TabRect.PtInRect(point))
			{
			if(m_b3ClassRecogEnabled)  //3类线性识别,特殊处理
			{

				// 保存当前鼠标位置
				m_p2 = point;
				
				if ((m_p1 != m_p2) && (m_p1.x != m_p2.x))
				{
					// 计算斜率和截距
					GetFigureLogicXY(m_p1,&logP1);
					GetFigureLogicXY(m_p2,&logP2);
					
					//此处应考虑容错处理,暂略。(zlf 05/04/25)
					line.fA = (float) (logP2.y - logP1.y) / (logP2.x - logP1.x); 
					line.fB= (float) logP1.y - m_fA * logP1.x;
				}
				
				m_arr3ClassLineArray.Add(line);
				m_nCountNumOfLines++;
			
			
				// 解除对鼠标事件的跟踪
				::ReleaseCapture();
				
				// 重置拖动状态
				m_bIsDraging = FALSE;
			
			
	    		return;
			}
		}
	}

	
	if (m_bIsDraging)
	{
		// 判断当前光标是否在绘制区域
		if(m_TabRect.PtInRect(point))
		{
			// 保存当前鼠标位置
			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;
			}
			
		}
		else
		{
			// 用户在绘制区域外放开鼠标左键
			CDC* pDC = m_lpTabDC;
			
			// 设置绘制方式为异或模式
			int nOldDrawMode = pDC->SetROP2(R2_XORPEN);

			// 创建新的画笔,选中新画笔
			CPen* pPen = new CPen;
			pPen->CreatePen(PS_DOT,1,RGB(0,0,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);
			}
			
			// 选回以前的画笔
			pDC->SelectObject(pOldPen);
			
			// 恢复成以前的绘制模式
			pDC->SetROP2(nOldDrawMode);
			
			delete pPen;
			
		}
		
		// 解除对鼠标事件的跟踪
		::ReleaseCapture();
		
		// 重置拖动状态
		m_bIsDraging = FALSE;
	}
	
	CDialog::OnLButtonUp(nFlags, point);
}

void CDlgPatternRecog::GetFigureLogicXY(CPoint point0, CPoint *lpoint1)
{
	//注意:这里point0为相对于对话框的点位坐标

	//得到相对于Tab控件的坐标
	CPoint tmpPoint;
	tmpPoint=point0-CPoint(m_nTabPosX,m_nTabPosY);

	//得到相对于逻辑坐标原点的坐标(原点为左下角)
	*lpoint1=tmpPoint-m_ptFigureXY0;
	lpoint1->y=-(lpoint1->y); //坐标系反向
}

void CDlgPatternRecog::GetTabXYFromLogicXY(int LogicX, int LogicY, long *TabX, long *TabY)
{
	int tmpX0,tmpY0;
	tmpX0=-m_ptFigureXY0.x;
	tmpY0=m_ptFigureXY0.y;

	*TabX=LogicX-tmpX0;
	*TabY=-(LogicY-tmpY0);
}


//3-维坐标轴绘制
void CDlgPatternRecog::Draw3DimetionAxis(CDC *pDC, LPSTR lpBitsData)
{
	//注意这里lpBitsData指向的是图像数据,不包括颜色表!
	//int X0,Y0;
	
	// 字符串
	CString str,strXLabel,strYLabel,strZLabel;
		
	// 显示等待光标
	BeginWaitCursor();

    //Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight );

	pDC->Draw3dRect(&CRect(40,40,300,300),RGB(155,100,0),RGB(0,255,100));


}


//手工模式识别
void CDlgPatternRecog::OnMenuPr2Manu() 
{
	// 显示手工识别样本显示元素
	((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->ShowWindow(SW_HIDE);
    
	m_lRButtonDown=RBUTTONDOWN_MANU_MODE;
}

void CDlgPatternRecog::OnMenuPr2Auto() 
{
	// 隐藏手工识别样本显示元素
	((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->ShowWindow(SW_SHOW);
	((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->SetWindowText("自动识别数据采样...");
	
	m_lRButtonDown=RBUTTONDOWN_AUTO_MODE;
}

void CDlgPatternRecog::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// 手工样本处理

	//手工识别样本采样
	m_ptCurRButtonDown=point;

	if(m_rectImage.PtInRect(point))
	{   
		//加载弹出菜单--<手工选择>
		if(m_lRButtonDown==RBUTTONDOWN_MANU_MODE)
		{
			CMenu mu;
			CRect WndRect;

			mu.LoadMenu(IDR_MENU_PATTERN_0202);
            
			if(m_bIsEnabledRealTimeProcess)
			{
				mu.CheckMenuItem(IDR_MENU_PATTERN_ENABLE_REAL   ,MF_CHECKED);
				mu.CheckMenuItem(IDR_MENU_PATTERN_DISENABLE_REAL,MF_UNCHECKED);
			}
			else
			{
				mu.CheckMenuItem(IDR_MENU_PATTERN_ENABLE_REAL   ,MF_UNCHECKED);
				mu.CheckMenuItem(IDR_MENU_PATTERN_DISENABLE_REAL,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 ;

⌨️ 快捷键说明

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