📄 dlgclusterpatternrecog.cpp
字号:
// DlgClusterPatternRecog.cpp : implementation file
//
#include "stdafx.h"
#include "ImageSysZLF01.h"
#include "DlgClusterPatternRecog.h"
//for CScrollBar
#include <afxwin.h>
#include <stdlib.h>
#include <vfw.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgClusterPatternRecog dialog
CDlgClusterPatternRecog::CDlgClusterPatternRecog(CWnd* pParent /*=NULL*/)
: CDialog(CDlgClusterPatternRecog::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgClusterPatternRecog)
m_nClassNumber = 10; //10
m_nThreshold = 10;
m_nIterativeNumber = 20;//10
m_nCurrentIterate = 0;
m_bFirst=true;
//}}AFX_DATA_INIT
}
void CDlgClusterPatternRecog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgClusterPatternRecog)
DDX_Control(pDX, IDC_TAB_PR_COORDINATE, m_tabctlPRCoordinate);
DDX_Text(pDX, IDC_EDIT1, m_nClassNumber);
DDX_Text(pDX, IDC_EDIT2, m_nThreshold);
DDX_Text(pDX, IDC_EDIT3, m_nIterativeNumber);
DDX_Text(pDX, IDC_EDIT4, m_nCurrentIterate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgClusterPatternRecog, CDialog)
//{{AFX_MSG_MAP(CDlgClusterPatternRecog)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_BUTTON_PR_EXIT, OnButtonPrExit)
ON_BN_CLICKED(IDC_RADIO_COORDINATEB, OnRadioCoordinateB)
ON_BN_CLICKED(IDC_RADIO_COORDINATEG, OnRadioCoordinateG)
ON_BN_CLICKED(IDC_RADIO_COORDINATER, OnRadioCoordinateR)
ON_BN_CLICKED(IDC_BUTTON_PR_UPDATE, OnButtonPrUpdate)
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDR_MENU_PR3_KMEAN_BEGINSAMPLE, OnMenuPr3KmeanBeginsample)
ON_COMMAND(IDR_MENU_PR3_KMEAN_ENDSAMPLE, OnMenuPr3KmeanEndsample)
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(IDC_BUTTON_PR_ACCEPT, OnButtonPrAccept)
ON_BN_CLICKED(IDC_BUTTON_PR_RECOGNIZE, OnButtonPrRecognize)
ON_BN_CLICKED(IDC_BUTTON_PR_RESTORE, OnButtonPrRestore)
ON_BN_CLICKED(IDC_RADIO_RANDOM, OnRadioRandom)
ON_BN_CLICKED(IDC_RADIO_SEQUENT, OnRadioSequent)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgClusterPatternRecog message handlers
BOOL CDlgClusterPatternRecog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// 初试化设置
CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
ASSERT_VALID(pDoc);
// 获取DIB
HDIB hDIB = pDoc->GetHDIB();
LPSTR lpImage=pDoc->GetDIBPtr(hDIB);
m_lImageData=FindDIBBits(lpImage);
// m_nImageShowWidth =350;
// m_nImageShowHeight=300;
// 判断DIB是否为空
if (hDIB != NULL)
{
//获取: DIB宽度,高度
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
m_lImagePixelNumber=cxDIB*cyDIB;
m_nImageShowWidth =cxDIB;
m_nImageShowHeight=cyDIB;
::GlobalUnlock((HGLOBAL) hDIB);
m_rectImage=CRect(20,0,20+m_nImageShowWidth,m_nImageShowHeight);
}
//
// 初始化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;
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;
m_lClusterSampleStatus=KMEANSAMPLE_CLOSED;
//初始参数的显示
UpdateData(FALSE);
//设定分类矩阵的初始大小
m_matrixClassTag.Init(m_lImagePixelNumber,m_nClassNumber);
((CButton*)GetDlgItem(IDC_BUTTON_PR_RECOGNIZE))->EnableWindow(FALSE);
m_lCenterInitialMethod=CLUSTERING_INITIAL_CENTER_SEQUENT;
((CButton*)GetDlgItem(IDC_RADIO_SEQUENT))->SetCheck(1);//取消选中
return TRUE;
}
void CDlgClusterPatternRecog::DrawImage()
{
/*
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)
{
//获取: DIB宽度,高度
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB=CRect(0,0,cxDIB,cyDIB);
::PaintDIB((HDC)dc.m_hDC, &m_rectImage, pDoc->GetHDIB(),&rcDIB, pDoc->GetDocPalette());
}
this->GetActiveWindow()->InvalidateRect(&m_rectImage,TRUE);
*/
}
void CDlgClusterPatternRecog::OnPaint()
{
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)
{
//获取: DIB宽度,高度
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB=CRect(0,0,cxDIB,cyDIB);
::PaintDIB((HDC)dc.m_hDC, &m_rectImage, pDoc->GetHDIB(),&rcDIB, pDoc->GetDocPalette());
}
// //绘制坐标轴
// Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
// GetDlgItem(IDC_TAB_PR_COORDINATE)->SendMessage(WM_PAINT);
}
void CDlgClusterPatternRecog::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// BYTE R,G,B;
// CString pos;
//
// 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;
// }
//
CDialog::OnMouseMove(nFlags, point);
}
void CDlgClusterPatternRecog::OnButtonPrExit()
{
// TODO: Add your control notification handler code here
CDialog::OnOK();
}
void CDlgClusterPatternRecog::OnRadioCoordinateB()
{
// 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);//取消选中
Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
}
void CDlgClusterPatternRecog::OnRadioCoordinateG()
{
// 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);;//取消选中
Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
}
void CDlgClusterPatternRecog::OnRadioCoordinateR()
{
// 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);;//取消选中
Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
}
void CDlgClusterPatternRecog::Draw2DimetionAxis(CDC *pDC, 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);
// 绘制坐标轴
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);
}
}
//绘制数据点列
DrawDataPoint(pDC,nWhichNoUse);
// 绘制坐标区域的矩形边线(上、右)
// 更改成蓝色画笔
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);
// 恢复以前的画笔
pDC->SelectObject(pOldPen);
// 恢复正常光标
EndWaitCursor();
// 删除新的画笔
delete pPenRed;
delete pPenRed1;
delete pPenBlue;
delete pPenBlue1;
delete pPenBlack;
delete pBrush_bk;
}
void CDlgClusterPatternRecog::OnButtonPrUpdate()
{
// TODO: Add your control notification handler code here
//绘制坐标轴
Draw2DimetionAxis(m_lpTabDC,m_nWhichColorNoUse);
}
void CDlgClusterPatternRecog::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//手工识别样本采样
m_ptCurRButtonDown=point;
if(m_rectImage.PtInRect(point))
{
CMenu mu;
CRect WndRect;
mu.LoadMenu(IDR_MENU_PATTERN_0302);
if(m_lClusterSampleStatus==KMEANSAMPLE_CLOSED)
{
mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_ENDSAMPLE ,MF_CHECKED);
mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_BEGINSAMPLE ,MF_UNCHECKED);
}
else
{
mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_ENDSAMPLE ,MF_UNCHECKED);
mu.CheckMenuItem(IDR_MENU_PR3_KMEAN_BEGINSAMPLE ,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 ;
}
CDialog::OnRButtonDown(nFlags, point);
}
void CDlgClusterPatternRecog::OnMenuPr3KmeanBeginsample()
{
// TODO: Add your command handler code here
m_lClusterSampleStatus=KMEANSAMPLE_OPEN;
}
void CDlgClusterPatternRecog::OnMenuPr3KmeanEndsample()
{
// TODO: Add your command handler code here
m_lClusterSampleStatus=KMEANSAMPLE_CLOSED;
}
void CDlgClusterPatternRecog::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// tagRGBVal rgb;
// BYTE R,G,B;
//
// if( m_lClusterSampleStatus==KMEANSAMPLE_OPEN)
// {
// ::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;
//
// DrawCurSamplePoint(rgb);
//
// m_arrClusterSampleData.Add(rgb);
//
// return;
//
// }
CDialog::OnLButtonDown(nFlags, point);
}
//绘制当前采样点
void CDlgClusterPatternRecog::DrawCurSamplePoint(tagRGBVal rgb)
{
BYTE btXColVal,btYColVal;
switch (m_nWhichColorNoUse)
{
case COLOR_RED:
btXColVal=rgb.B;
btYColVal=rgb.G;
break;
case COLOR_GREEN:
btXColVal=rgb.R;
btYColVal=rgb.B;
break;
case COLOR_BLUE:
btXColVal=rgb.R;
btYColVal=rgb.G;
}
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 CDlgClusterPatternRecog::OnButtonPrAccept()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -