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

📄 dynsplitview2.cpp

📁 描述了关于OCR的各种模式识别方法
💻 CPP
字号:
// DynSplitView2.cpp : implementation file
// 2005.1.13-16:02 By Superman 

#include "stdafx.h"
#include "DSPLIT.h"

#include "DynSplitView2.h"
#include "dlgNumber.h"
#include "DlgClassify.h"
#include "Dlgdisplay.h"
#include "DlgWeight.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BpNet bpnet1;	
/////////////////////////////////////////////////////////////////////////////
// CDynSplitView2

IMPLEMENT_DYNCREATE(CDynSplitView2, CView)

CDynSplitView2::CDynSplitView2():number(-1),no(0)
{
		
}

CDynSplitView2::~CDynSplitView2()
{
}


BEGIN_MESSAGE_MAP(CDynSplitView2, CView)
	//{{AFX_MSG_MAP(CDynSplitView2)
	ON_COMMAND(ID_BUTTON_SAVE, OnButtonSave)
	ON_COMMAND(ID_BUTTON_LMSEifClassified, OnBUTTONLMSEifClassified)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_MENU_IFCLASSIFICATION, OnMenuIfclassification)
	ON_COMMAND(ID_MENU_LEASTDISTANCE, OnMenuLeastdistance)
	ON_COMMAND(ID_MENU_FISHER, OnMenuFisher)
	ON_COMMAND(ID_MENU_BAYES_ERZHI, OnMenuBayesErzhi)
	ON_COMMAND(ID_MENU_BAYES_LEASTERROR, OnMenuBayesLeasterror)
	ON_COMMAND(ID_MENU_BAYES_LEASTRISK, OnMenuBayesLeastrisk)
	ON_COMMAND(ID_MENU_JIANGCHENG, OnMenuJiangcheng)
	ON_COMMAND(ID_MENU_LMSE, OnMenuLMSE)
	ON_COMMAND(ID_MENU_ZENGLIANGJIAOZHENG, OnMenuZengliangjiaozheng)
	ON_COMMAND(ID_BP_TRAIN, OnBpTrain)
	ON_COMMAND(ID_BP_TEST, OnBpTest)
	ON_COMMAND(ID_BP_CLASSIFY, OnBpClassify)
	ON_COMMAND(ID_MENU_BPQUANZHI, OnMenuBpquanzhi)
	ON_COMMAND(ID_MENU_SHIHANSHU, OnMenuShihanshu)
	ON_WM_CANCELMODE()
	ON_WM_CAPTURECHANGED()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDynSplitView2 drawing

void CDynSplitView2::OnDraw(CDC* pDC)
{
	clearmem();
	CDocument* pDoc = GetDocument();
	int i,j;
	pDC->SetTextColor(RGB(255,0,0));
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			if(classify->testsample[5*i+j]>0.1)
				pDC->TextOut(j*15,i*15,"■");
	pDC->TextOut(10,80,"待定样品");
	pDC->SetTextColor(RGB(0,255,0));
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			if(number!=-1)
				if(classify->pattern[number].feature[no][i*5+j]>0.1)
					pDC->TextOut(150+j*15,i*15,"■");
	pDC->TextOut(160,80,"最接近样品");

}

/////////////////////////////////////////////////////////////////////////////
// CDynSplitView2 diagnostics

#ifdef _DEBUG
void CDynSplitView2::AssertValid() const
{
	CView::AssertValid();
}

void CDynSplitView2::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDSPLITDoc* CDynSplitView2::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSPLITDoc)));
	return (CDSPLITDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDynSplitView2 message handlers

void CDynSplitView2::OnButtonSave() 
{
	CDlgNumber dlg;
	if(IDOK==dlg.DoModal())
	{
		if(classify->pattern[dlg.m_num].number>200)
			MessageBox("模板个数不能超过200个!",NULL,MB_OK);
		else
		{
			if (classify->Saveable(dlg.m_num))
			{
				classify->Save(dlg.m_num);
			}
			else
				MessageBox("此样品已存在于样品库中,请改变样品的特征。",NULL,MB_OK);
		}


		CFile TheFile(curDir+"\\template.dat",CFile::modeCreate|CFile::modeReadWrite);//
		CArchive ar(&TheFile,CArchive::store,40960);
		TheFile.SeekToBegin();
		for(int n=0;n<10;n++)
		{
			ar<<classify->pattern[n].number;
			for(int i=0;i<classify->pattern[n].number;i++)
			for(int j=0;j<25;j++)
			{
				ar<<classify->pattern[n].feature[i][j];
			}
		}
		ar.Close();
		TheFile.Close();
	}
	
}

void CDynSplitView2::OnBUTTONLMSEifClassified() 
{
	DlgClassify dlg;
	dlg.m_num2=1;
	if(IDOK==dlg.DoModal())
	{
		CDlgdisplay dlg1;
		BeginWaitCursor();
		dlg1.m_str=classify->ifClassified(dlg.m_num1,dlg.m_num2);
		EndWaitCursor();
		dlg1.DoModal();
	}
}

void CDynSplitView2::clearmem()
{
	CDSPLITDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    classify=&pDoc->classify;
	bpnet=&bpnet1;
	curDir=pDoc->curDir;
}

void CDynSplitView2::OnLButtonDown(UINT nFlags, CPoint point) 
{
	clearmem();
	classify->GetPosition();
	classify->SetFeature();
	Invalidate();	
	CView::OnLButtonDown(nFlags, point);
}

void CDynSplitView2::OnMenuIfclassification() 
{
	OnBUTTONLMSEifClassified();	
}

void CDynSplitView2::OnMenuLeastdistance() 
{
	number_no number_no;
	number_no=classify->LeastDistance();
	number=number_no.number;
	no=number_no.no;
	CString str;
	str.Format("应用最小距离法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);
	Invalidate();	
}

void CDynSplitView2::OnMenuFisher() 
{
	BeginWaitCursor();
	number=classify->Fisher();
	EndWaitCursor();
	CString str;
	str.Format("应用Fisher算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();
	
}

void CDynSplitView2::OnMenuBayesErzhi() 
{
	BeginWaitCursor();
	number=classify->BayesErzhishuju();
	EndWaitCursor();
	CString str;
	str.Format("应用二值数据的Bayes算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();
}

void CDynSplitView2::OnMenuBayesLeasterror() 
{
	BeginWaitCursor();
	number=classify->BayesLeasterror();
	EndWaitCursor();
	CString str;
	str.Format("应用最小错误概率的Bayes算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();	
}

void CDynSplitView2::OnMenuBayesLeastrisk() 
{
	CDlgWeight dlg;
	if(dlg.DoModal()==IDOK)
	{
		BeginWaitCursor();
		double *hx;
		hx=classify->BayesLeastRisk(dlg.loss);
		//判别函数的最小值
		double minval=hx[0];
		int number=0;
		for(int i=1;i<10;i++)
		{
			if(hx[i]<minval)
			{
				minval=hx[i];
				number=i;
			}
		}
		EndWaitCursor();
		CString str;
		str.Format("应用最小风险的Bayes算法,\n自动分类识别结果为:%d",number);
		AfxMessageBox(str,MB_OK,NULL);
		Invalidate();
		dlg.b=true;
		dlg.m_risk0=hx[0];
		dlg.m_risk1=hx[1];
		dlg.m_risk2=hx[2];
		dlg.m_risk3=hx[3];
		dlg.m_risk4=hx[4];
		dlg.m_risk5=hx[5];
		dlg.m_risk6=hx[6];
		dlg.m_risk7=hx[7];
		dlg.m_risk8=hx[8];
		dlg.m_risk9=hx[9];
		dlg.DoModal();
	}
}

void CDynSplitView2::OnMenuJiangcheng() 
{
	BeginWaitCursor();
	number=classify->Jiangcheng();
	EndWaitCursor();
	CString str;
	str.Format("应用感知器奖惩算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();	
}

void CDynSplitView2::OnMenuLMSE() 
{
	BeginWaitCursor();
	number=classify->LMSE();
	EndWaitCursor();
	CString str;
	str.Format("应用LMSE算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();	
}

void CDynSplitView2::OnMenuZengliangjiaozheng() 
{
	BeginWaitCursor();
	number=classify->Zengliangjiaozheng();
	EndWaitCursor();
	CString str;
	str.Format("应用增量校正算法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();	
}



void CDynSplitView2::OnBpTrain() 
{
	double p[500][5];
	double t[500][4];
	int samplenum=500;
	int innum=bpnet->inNum;
	int outnum=bpnet->outNum;
	int i,j;

	for(i=0;i<10;i++)
	for(j=0;j<50;j++)		
	{
		t[i+j*10][0]=i%2;
		t[i+j*10][1]=i/2%2;	
		t[i+j*10][2]=i/4%2;
		t[i+j*10][3]=i/8%2;
	}

	for(i=0;i<10;i++)
		for(j=0;j<50;j++)
		{
			int k1,k2;
			for(k1=0;k1<5;k1++)
			{
				double num=0.0;	
				for(k2=0;k2<5;k2++)
					num+=classify->pattern[i].feature[j][k1*5+k2];
				p[i+j*10][k1]=num;
			}
		}

	BeginWaitCursor();
	for(i=0;i<20000;i++)
		bpnet->train(p,t,samplenum);
	CString str,s;
	CStdioFile cf;
	str.Insert(-1,"隐含结点权值:\n");
	for(i=0;i<5;i++)
	{
		for(j=0;j<10;j++)
		{
			s.Format("w[%d][%d]:%f\n",i,j,bpnet->w[i][j]);
			str.Insert(str.GetLength(),s);
		}
		str.Insert(str.GetLength(),"\n");
	}
	str.Insert(str.GetLength(),"输出结点权值:\n");
	for(i=0;i<10;i++)
	{
		for(j=0;j<4;j++)
		{
			s.Format("w1[%d][%d]:%f\n",i,j,bpnet->w1[i][j]);
			str.Insert(str.GetLength(),s);
		}
		str.Insert(str.GetLength(),"\n");
	}
	if(cf.Open("quanzhi.txt",CFile::modeCreate|CFile::modeWrite))
	{
		cf.WriteString(str);
		cf.Close();
	}
	EndWaitCursor();

}

void CDynSplitView2::OnBpTest() 
{
	double p[500][5],data[5];
	int i,j;
	int samplenum=500;
	int innum=bpnet->inNum;
	int outnum=bpnet->outNum;

	for(i=0;i<10;i++)
		for(j=0;j<50;j++)
		{
			int k1,k2;
			for(k1=0;k1<5;k1++)
			{
				double num=0.0;	
				for(k2=0;k2<5;k2++)
					num+=classify->pattern[i].feature[j][k1*5+k2];
				p[i+j*10][k1]=num;
			}
		}
	CString s,str;

	for(i=0;i<samplenum;i++)
	{
		for(j=0;j<5;j++)
			data[j]=p[i][j];
		bpnet->sim(data);
		int d;
		d=(int)(bpnet->shuchu[0]+bpnet->shuchu[1]*2+bpnet->shuchu[2]*4+bpnet->shuchu[3]*8+0.5);
		str.Format("%d\t%d           %d\n",i,i%10,d);
		s.Insert(s.GetLength(),str);
	}
	s.Insert(-1,"序号   已知样品    验证结果\n");
	s.Insert(-1,"****************************************\n");
	s.Insert(-1,"*样品库训练集,神经网络自动分类输出结果*\n");
	s.Insert(-1,"****************************************\n");
	CStdioFile cf;
	if(cf.Open("bpnet.txt",CFile::modeCreate|CFile::modeWrite))
	{
		cf.WriteString(s);
		cf.Close();
	}
	WinExec("notepad.exe bpnet.txt",SW_SHOW);
}

void CDynSplitView2::OnBpClassify() 
{
	double data[5];
	int innum=bpnet->inNum;
	int i,j;

	for(i=0;i<5;i++)
	{
		double num=0.0;	
		for(j=0;j<5;j++)
			num+=classify->testsample[i*5+j];
		data[i]=num;
	}

	bpnet->sim(data);
	number=(int)(bpnet->shuchu[0]+bpnet->shuchu[1]*2+bpnet->shuchu[2]*4+bpnet->shuchu[3]*8+0.5);
	CString str;
	str.Format("应用神经网络算法,将25维特征垂直投影降维至5维,\n分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);
	Invalidate();
}

void CDynSplitView2::OnMenuBpquanzhi() 
{
	WinExec("notepad.exe quanzhi.txt",SW_SHOW);
	
}

void CDynSplitView2::OnMenuShihanshu() 
{
	BeginWaitCursor();
	number=classify->Shihanshu();
	EndWaitCursor();
	CString str;
	str.Format("应用势函数法,\n自动分类识别结果为:%d",number);
	AfxMessageBox(str,MB_OK,NULL);	
	Invalidate();
}





void CDynSplitView2::OnCancelMode() 
{
	CView::OnCancelMode();
	
	// TODO: Add your message handler code here
	
}


void CDynSplitView2::OnCaptureChanged(CWnd *pWnd) 
{
	// TODO: Add your message handler code here
	
	CView::OnCaptureChanged(pWnd);
}

⌨️ 快捷键说明

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