📄 dlgpatternrecog.cpp
字号:
}
//加载弹出菜单--<手工选择>
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 + -