📄 dlgpatternrecog.cpp
字号:
// 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 + -