3.3 模板特征库的建立
点击系统界面上的训练按钮即可实现特征库的建立,训练的次数越多特征库越丰富,识别结果就越准确。在此系统的特征库是存储在Access数据库中,如图3.4所示。在此利用MFC ADO技术连接数据库,并且建立记录集对象并通过函数OnButtonInitialize()来实现特征库的训练。
图3.4 特征库
具体实现代码为: 1.连接数据库 CString strSql; strSql = \ m_rsetPtr.CreateInstance(__uuidof(Recordset)); m_rsetPtr->Open(_bstr_t(strSql),m_connPtr.GetInterfacePtr(), adLockOptimistic ,adCmdText);
2.训练特征库
void CNumShiBieDlg::OnButtonInitialize() //先显示图片再按此按钮 训练 { // TODO: Add your control notification handler code here UpdateData(true); int num = m_nNum; _ConnectionPtr connPtr ; _RecordsetPtr rsetPtr; int w = 0, h = 0; BYTE *pdata = this->GetNumData(&w , &h); if(w < 8)
18
adOpenStatic ,
{ AfxMessageBox(\图片过小\ return ; } double *pFeature = this->Get64Feature(pdata , w ,h); connPtr.CreateInstance(__uuidof(Connection)); try { connPtr->Open(\Source=Feature.mdb\
} catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); } CString strSql; strSql = \ rsetPtr.CreateInstance(__uuidof(Recordset)); rsetPtr->Open(_bstr_t(strSql),connPtr.GetInterfacePtr(), adLockOptimistic ,adCmdText);
int count = 0; if(!rsetPtr->BOF) { while(!rsetPtr->adoEOF) { count++; rsetPtr->MoveNext(); } } else count = 0; try { rsetPtr->MoveLast(); rsetPtr->AddNew(); rsetPtr->PutCollect(\ rsetPtr->PutCollect(\ for(int x = 0 ; x < 64 ;x++) { CString temp, strdata; temp.Format(\ strdata.Format(\ rsetPtr->PutCollect(_bstr_t(temp) , _bstr_t(strdata)); }
19
adOpenStatic ,
}
rsetPtr->Update(); }
catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); }
rsetPtr->Close(); rsetPtr = NULL; connPtr->Close(); connPtr = NULL;
AfxMessageBox(\初始化成功!\
3.4 数字的识别
点击系统界面上的特征识别按钮即可实现手写数字的识别,此系统主要是通过函数OnButton64shibie() 来实现手写数字的识别,识别过程即和Access数据库连接后把所绘制数字的64个特征值与模板库里面的每个特征值进行比较,得出它们之间的距离,哪一个距离最短则相对应的模板库里面的数字即为识别的结果,识别结果会通过弹出对话框来显示,如图3.5所示。
图3.5 识别结果
具体实现代码为:
void CNumShiBieDlg::OnButton64shibie() { // TODO: Add your control notification handler code here int w = 0 , h = 0; BYTE *pdata = this->GetNumData(&w , &h); double *pfeature = this->Get64Feature(pdata , w ,h); //取得64个特征值 m_connPtr.CreateInstance(__uuidof(Connection)); try { m_connPtr->Open(\Source=Feature.mdb\
}
20
catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); } CString strSql; strSql = \ m_rsetPtr.CreateInstance(__uuidof(Recordset)); m_rsetPtr->Open(_bstr_t(strSql),m_connPtr.GetInterfacePtr(), adLockOptimistic ,adCmdText);
//利用MFCADO技术连接数据库,并且建立记录集对象。 int count = 0;
// double *df = new double[64]; _variant_t va; if(!m_rsetPtr->BOF) { while(!m_rsetPtr->adoEOF) { count++; m_rsetPtr->MoveNext(); } } else count = 0; if(count>0) { _variant_t var; FNUM *pN = new FNUM[count]; m_rsetPtr->MoveFirst(); count = 0; while(!m_rsetPtr->adoEOF) { var = m_rsetPtr->GetCollect(\ pN[count].num = var.lVal; double d[64]; for(int i = 0 ;i < 64 ;i++) { CString temp; temp.Format(\ var = m_rsetPtr->GetCollect(_bstr_t(temp)); temp = (LPCSTR)(_bstr_t)var; d[i] = ::atof(temp); } double sum = 0.0; for(i = 0 ; i < 64 ;i++)
21
adOpenStatic ,
}
22
{ sum += (pfeature[i]-d[i])*(pfeature[i]-d[i]); }//求待识别数字与模板库数字特征值之间的最短距离 pN[count].feature = sum; count++; m_rsetPtr->MoveNext(); }
double min = pN[0].feature; int index = 0;
for(int k = 1 ; k < count; k++) { if(min > pN[k].feature) { min = pN[k].feature; index = k; } }
m_rsetPtr->Close(); //要先关闭记录集对象再关闭数据库连接对象才不会出错 m_rsetPtr = NULL; m_connPtr->Close(); m_connPtr = NULL; CString str;
str.Format(\识别结果为:%d\AfxMessageBox(str); delete []pN; }
总结
本文对基于VC++6.0的手写数字识别系统的基本原理及方法进行了介绍。手写体数字识别是一个极具研究价值的课题,手写数字的样品类别总共只有0一9十类,与其它的大字符集的识别(汉字识别)相比要相对容易。本文所采用的模板匹配分类器既节省时间,简便易行,也可以达到较高地识别效果。但是在系统的设计上由于时间的限制导致系统界面的设计不够美观,特征训练不够导致识别率不够高。
今后工作展望:手写体数字的特征提取是一个非常复杂的问题,可以考虑在识别的时候使用有监督的识别方法,这样在识别的同时可以更新特征库,这里所说的更新是把导致识别错误的模板替换掉这样出错的几率就会越来越小从而使特征库越来越完善,进一步提高识别的准确度。
参考文献
[1]张立凡,游福成,张勇斌.手写数字识别系统设计.北京:印刷学院学报,2009年04期. [2]冯伟兴.Visual C++数字图像模式识别技术详解.机械工业出版社,2010-09.
[3]张宏林.精通Visual C++数字图像模式识别技术及工程实践.人民邮电出版社,2008-8. [4]章毓晋.图像工程(中册)图像分析(第二版).北京:清华大学出版社.
[5]刘金春,蒋先刚.均值聚类在三维重构图像预处理中的应用.微计算机信息,2007. [6]谢凤英.Visual C++ 数字图像处理.电子工业出版社,2008年.
[7]蒋先刚.数字图像模式识别工程软件设计.中国水利水电出版社,2008年. [8]陈兵旗,孙明.实用数字图像处理与分析.清华大学出版社,2008年.
[9]唐立群,郭庆昌.数字图像模式识别方法分析[M].哈尔滨:哈尔滨工业大学出版社,2008.06.
[10]求是科技.VC++在数字图象处理中的应用.北京:电子工业出版社,2006.
[11]张 莉,周传达焦李成.核聚类算法.计算机学报.2002 , 25 (6) : 5872590. [12]李珺.手写体数字识别方法研究.甘肃科技, no.8, 2003.
[13]柳回春,马树元,吴平东,杨峰,曾兴生,毕路拯.基于结构特征的手写体数字识别算法.计算机工程, no.11, 2002.
[14]邹伟.高精度手写体数字识别的算法研究及应用[D].北京:北京邮电大学, 2001.
[15]He Bin.Visual C++ Digital Image Processing. Beijing: Posts and Telecommunications Press, 2001.
[16]章毓晋.图象处理和分析.北京:清华大学出版社,2003.
[17]边肇祺,张学工等.模式识别( 第二版).北京.清华大学出版社,2000:273-283.
[18] J.P.Marques de Sa著,吴逸飞译.模式识别原理、方法及应用.北京:清华大学出版社,2002.
23