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

📄 dlgpatternrecog.cpp

📁 模式识别的作业代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}

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

			mu.LoadMenu(IDR_MENU_PATTERN_0203);

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

		//加载弹出菜单--<多模式自动选择>
		if(m_lRButtonDown==RBUTTONDOWN_MUTI_MODE)
		{
			CMenu mu;
			CRect WndRect;

			mu.LoadMenu(IDR_MENU_PATTERN_0203);

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

		}

	}
	

	CDialog::OnRButtonDown(nFlags, point);
}


//手动采样--目标
void CDlgPatternRecog::OnMenuPatternSampleObjManu() 
{
	// TODO: Add your command handler code here
	BYTE R,G,B;
	tagRGBVal rgb;

	CPoint point=m_ptCurRButtonDown;
	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
	HDIB hDIB=pDoc->GetHDIB();
    
    GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);        

	m_btObjectColR=R;
	m_btObjectColG=G;
	m_btObjectColB=B;

	UpdateData(FALSE);

	//显示样本颜色
	CBrush* pBrush=new CBrush;
	pBrush->CreateSolidBrush(RGB(R,G,B));

	CRect rct;
	WINDOWPLACEMENT* lpwndpl=new WINDOWPLACEMENT;
    ((CWnd*)GetDlgItem(IDC_STATIC_OBJECT_COL))->GetWindowPlacement(lpwndpl);

	rct=lpwndpl->rcNormalPosition;
	this->GetDC()->FillRect(&rct,pBrush);

	rgb.R=R;
	rgb.G=G;
	rgb.B=B;
	
	DrawCurSamplePoint(rgb);
	
    delete pBrush;

}

//手动采样--背景
void CDlgPatternRecog::OnMenuPatternSampleBakManu() 
{
	// TODO: Add your command handler code here
	BYTE R,G,B;
	tagRGBVal rgb;

	CPoint point=m_ptCurRButtonDown;

	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
	HDIB hDIB=pDoc->GetHDIB();
    
    GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);        

	m_btBackroundColR=R;
	m_btBackroundColG=G;
	m_btBackroundColB=B;

	UpdateData(FALSE);

	//显示样本颜色
	CBrush* pBrush=new CBrush;
	pBrush->CreateSolidBrush(RGB(R,G,B));

	CRect rct;
	WINDOWPLACEMENT* lpwndpl=new WINDOWPLACEMENT;
    ((CWnd*)GetDlgItem(IDC_STATIC_BACKRD_COL))->GetWindowPlacement(lpwndpl);

	rct=lpwndpl->rcNormalPosition;
	this->GetDC()->FillRect(&rct,pBrush);

	rgb.R=R;
	rgb.G=G;
	rgb.B=B;
		
	DrawCurSamplePoint(rgb);
	

	delete pBrush;
}


////////////////////////////////////////////////////////////////////
// 处理自动识别的采样
// 自动识别--添加目标采样点
void CDlgPatternRecog::OnMenuPatternAutoSampleAddObj() 
{
	// TODO: Add your command handler code here
	m_lAuotSampleMode=AUTOSAMPLE_ADDOBJ;

	
}

// 自动识别--添加背景采样点
void CDlgPatternRecog::OnMenuPatternAutoSampleAddBak() 
{
	// TODO: Add your command handler code here
	m_lAuotSampleMode=AUTOSAMPLE_ADDBAK;
	
}

// 结束自动采样
void CDlgPatternRecog::OnMenuPattern0AutoSampleEnd() 
{
	// TODO: Add your command handler code here
	m_lAuotSampleMode=AUTOSAMPLE_ENDING;

}

// 删除自动目标采样点
void CDlgPatternRecog::OnMenuPatternAutoSampleDelObj() 
{
	// TODO: Add your command handler code here
	m_arrAutoSampleObjData.RemoveAll();

	m_arrAutoSampleThirdData.RemoveAll();
}

// 删除自动背景采样点
void CDlgPatternRecog::OnMenuPatternAutoSampleDelBak() 
{
	// TODO: Add your command handler code here
	m_arrAutoSampleBakData.RemoveAll();
}

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


// 对当前图像进行识别
void CDlgPatternRecog::OnButtonPrRecognize() 
{
	// TODO: Add your control notification handler code here
	if(m_lRButtonDown==RBUTTONDOWN_MANU_MODE)  //手工判别
	{
		if(fabs(m_fA)<MINIMIZE_VAL && fabs(m_fB)<MINIMIZE_VAL)
		{
			AfxMessageBox("请先绘出分类线!");
			return;
		}

		//这里先不考虑斜率为无穷大的情形
		TwoModeClassifyTrans(m_fA,m_fB);
        
		//绘制识别后的图像
		DrawRecognizedImage();
	}

	if(m_lRButtonDown==RBUTTONDOWN_AUTO_MODE)  //自动判别
	{

		//这里先不考虑斜率为无穷大的情形
		//分类线的最优计算
		BYTE XMeanVal,YMeanVal;
		XMeanVal=YMeanVal=0;

		GetOptimizationClassifyLine(&XMeanVal,&YMeanVal);

		if(fabs(m_fA)<MINIMIZE_VAL && fabs(m_fB)<MINIMIZE_VAL)
		{
			AfxMessageBox("样本选择不正确!");
			return;
		}

		//绘制分类线
		DrawOptimizationClassifyLine(XMeanVal,YMeanVal);

		//变换
		TwoModeClassifyTransWhenAutoRecog(m_fA,m_fB,XMeanVal,YMeanVal);
        
		//绘制识别后的图像
		DrawRecognizedImage();

		return;
	}

	if(m_lMultiModeEnabled)  //自动判别--多模式
	{

		//这里先不考虑斜率为无穷大的情形
		//分类线的最优计算
		tagStatics Obj,Bak,Third; 
		
		// 显示等待光标
		BeginWaitCursor();

		//得到各类模式的统计信息
		GetMutilModeStaticsInfo(&Obj,&Bak,&Third);

		//变换
        MultiModeClassifyTransWhenAutoRecog(Obj, Bak, Third);

		//绘制识别后的图像
		DrawRecognizedImage();

	   	// 恢复正常光标
		EndWaitCursor();

		return;
	}


}


// 绘制采样点坐标
void CDlgPatternRecog::DrawSamplePoint(BYTE btXColVal, BYTE btYColVal)
{
	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 CDlgPatternRecog::TwoModeClassifyTrans(float fA, float fB)
{
	BYTE X,Y;
	BYTE R,G,B;

	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();

    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();

	HDIB hDIB=pDoc->GetHDIB();
	LPSTR lpImage=pDoc->GetDIBPtr(hDIB);
	LPSTR lpPriImage=pDoc->m_pPrimitiveImage;

	long lBitCount=((LPBITMAPINFOHEADER)lpImage)->biBitCount;
    long lWidth =DIBWidth (lpImage);
    long lHeight=DIBHeight(lpImage);

	LPSTR lpDBitsData=FindDIBBits(lpImage);       //得到实时数据
	LPSTR lpPriDBitsData=FindDIBBits(lpPriImage); //得到原始数据
	
	int i,j;
	for (i=0;i<lHeight;i++)
	{
		for(j=0;j<lWidth;j++)
		{
			LPSTR lpPriSrc=lpPriDBitsData+((lHeight-1-i)*lWidth+j)*(lBitCount/8);
			LPSTR lpSrc   =lpDBitsData+((lHeight-1-i)*lWidth+j)*(lBitCount/8);

			B=(BYTE)*lpPriSrc;
			G=(BYTE)*(lpPriSrc+1);
			R=(BYTE)*(lpPriSrc+2);

			//注意读取得顺序!  zlf  050329
			switch (m_nWhichColorNoUse)
			{
				case COLOR_RED:
					X=G;
					Y=B;
					break;
				case COLOR_GREEN:
					X=R;
					Y=B;
					break;
				case COLOR_BLUE:
					X=R;
					Y=G;
			}

			//进行判别
			if((int)(m_fA*X - Y +m_fB)>=0) //目标
			{
				*lpSrc    =(BYTE)MODE_OBJECT_COLOR_B;
				*(lpSrc+1)=(BYTE)MODE_OBJECT_COLOR_G;
				*(lpSrc+2)=(BYTE)MODE_OBJECT_COLOR_R;
			}
		    else
			{
				*lpSrc    =(BYTE)MODE_BACKRD_COLOR_B;
				*(lpSrc+1)=(BYTE)MODE_BACKRD_COLOR_G;
				*(lpSrc+2)=(BYTE)MODE_BACKRD_COLOR_R;
			}

		}//for j
	}//for i

	return;
}

void CDlgPatternRecog::TwoModeClassifyTransWhenAutoRecog(float m_fA, float m_fB, BYTE XMean, BYTE YMean)
{
	BYTE X,Y;
	BYTE R,G,B;

	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();

    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();

	HDIB hDIB=pDoc->GetHDIB();
	LPSTR lpImage=pDoc->GetDIBPtr(hDIB);

	long lBitCount=((LPBITMAPINFOHEADER)lpImage)->biBitCount;
    long lWidth =DIBWidth (lpImage);
    long lHeight=DIBHeight(lpImage);

	LPSTR lpDBitsData=FindDIBBits(lpImage);
	
	int i,j;
	for (i=0;i<lHeight;i++)
	{
		for(j=0;j<lWidth;j++)
		{
			LPSTR lpSrc=lpDBitsData+((lHeight-1-i)*lWidth+j)*(lBitCount/8);

			B=(BYTE)*lpSrc;
			G=(BYTE)*(lpSrc+1);
			R=(BYTE)*(lpSrc+2);

			//注意读取得顺序!  zlf  050329
			switch (m_nWhichColorNoUse)
			{
				case COLOR_RED:
					X=G;
					Y=B;
					break;
				case COLOR_GREEN:
					X=R;
					Y=B;
					break;
				case COLOR_BLUE:
					X=R;
					Y=G;
			}

			//进行判别
			switch(m_bIsParallelWithXYAxis)
			{
				case PARALLEL_WITH_X_AXIS:
					if(Y>=YMean)  //取上侧为目标
					{
						*lpSrc    =(BYTE)MODE_OBJECT_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_OBJECT_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_OBJECT_COLOR_R;
					}
					else
					{
						*lpSrc    =(BYTE)MODE_BACKRD_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_BACKRD_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_BACKRD_COLOR_R;
					}
					break;
				case PARALLEL_WITH_Y_AXIS:
					if(X<=XMean)  //取左侧为目标
					{
						*lpSrc    =(BYTE)MODE_OBJECT_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_OBJECT_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_OBJECT_COLOR_R;
					}
					else
					{
						*lpSrc    =(BYTE)MODE_BACKRD_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_BACKRD_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_BACKRD_COLOR_R;
					}

					break;
				case PARALLEL_WITH_NO_AXIS:
					if((int)(m_fA*X - Y +m_fB)>=0) //目标
					{
						*lpSrc    =(BYTE)MODE_OBJECT_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_OBJECT_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_OBJECT_COLOR_R;
					}
					else
					{
						*lpSrc    =(BYTE)MODE_BACKRD_COLOR_B;
						*(lpSrc+1)=(BYTE)MODE_BACKRD_COLOR_G;
						*(lpSrc+2)=(BYTE)MODE_BACKRD_COLOR_R;
					}

			}

		}//for j
	}//for i

	return;

}


void CDlgPatternRecog::OnMenuPr2Restore() 
{
	// TODO: Add your command handler code here
	CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();

    CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();

	pDoc->RestorePrimitiveImage();

	//绘制原图像
	DrawRecognizedImage();

}

void CDlgPatternRecog::DrawRecognizedImage()
{
	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)
	{
		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());
			
	}
	
	this->GetActiveWindow()->InvalidateRect(&m_rectImage,TRUE);
}

void CDlgPatternRecog::OnButtonPrRestore() 
{
	// TODO: Add your control notification handler code here
	OnMenuPr2Restore();
}


//自动判别时最优分类线的求取
void CDlgPatternRecog::GetOptimizationClassifyLine(BYTE* pXMeanVal,BYTE* pYMeanVal)
{
	//XMeanVal,YMeanVal 目标样本均值和背景样本均值的均值 
	
	BYTE btBestObjXMean,btBestObjYMean;
	BYTE btBestBakXMean,btBestBakYMean;
    float tmpf;

	long sumx,sumy;
    int i;
	

	sumx=sumy=0;
	for(i=0;i<m_arrAutoSampleObjData.GetSize();i++) 
	{

⌨️ 快捷键说明

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