基于VC++手寫數(shù)字識別程序設(shè)計_第1頁
基于VC++手寫數(shù)字識別程序設(shè)計_第2頁
基于VC++手寫數(shù)字識別程序設(shè)計_第3頁
基于VC++手寫數(shù)字識別程序設(shè)計_第4頁
基于VC++手寫數(shù)字識別程序設(shè)計_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

目錄TOC\o"1-2"\h\z\u1、摘要12、原理22.1、圖像的二值化處理22.2、模板匹配法22.3、圖像的特征提取33、系統(tǒng)設(shè)計43.1、主界面43.2、圖像繪制63.3、特征提取63.4、學(xué)習(xí)73.5、識別83.6、去除94、系統(tǒng)調(diào)試95、心得體會116、參考文獻12附錄:131、摘要自上世紀(jì)六十年代以來,計算機視覺與圖像處理越來越受到人們的關(guān)注,并逐漸成為一門重要的學(xué)科領(lǐng)域。而作為它們的研究對象的數(shù)字圖像,也因為它含有研究目標(biāo)的豐富信息而成為越來越重要的研究對象。圖像識別的目標(biāo)是用計算機自動完成某些信息的處理,用來替代人工去處理圖像分類及識別的任務(wù)。手寫數(shù)字識別是圖像識別學(xué)科下的一個分支,是圖像處理和模式識別領(lǐng)域研究的課題之一,由于其具有很強的實用性一直是多年來的研究熱點。由于手寫體數(shù)字的隨意性很大,例如,筆畫的粗細,字體的大小,傾斜等等都直接影響到字符的正確識別,所以手寫體數(shù)字識別是一個很有挑戰(zhàn)性的課題。在過去的數(shù)十年中,研究者們提出了許多的識別方法,取得了較大的成果。手寫體數(shù)字識別實用性很強,在大規(guī)模數(shù)據(jù)統(tǒng)計(如例行年檢,人口普查),財務(wù),稅務(wù),郵件分揀等等應(yīng)用領(lǐng)域中都有廣闊的應(yīng)用前景。本課題擬研究手寫體數(shù)字識別的理論和方法,開發(fā)一個小型的手寫體數(shù)字識別系統(tǒng)。本次設(shè)計主要完成以下幾個工作:手寫數(shù)字繪制問題、數(shù)字的預(yù)處理問題、特征提取問題、特征庫的建立問題、數(shù)字識別問題。關(guān)鍵詞:繪制數(shù)字;預(yù)處理;特征提取;特征庫;數(shù)字識別2、原理本次設(shè)計主要用到圖像的二值化處理、圖像特征提取和模板匹配法三個知識點,下面將對這三個知識點進行簡單介紹:2.1、圖像的二值化處理圖像的二值化處理就是將圖像上的像素點的灰度值設(shè)置為0或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果。在手寫數(shù)字識別系統(tǒng)中,我們在VC可視化編程界面中在一個固定大小的控件中手寫了一個數(shù)字,在程序中獲得的只是以這個控件左上角為原點的一系列坐標(biāo)。在內(nèi)存中我們開辟一個大小跟這個控件區(qū)域大小相同的二維數(shù)組(以像素為單位,即生成一張圖片的長跟寬跟這個矩形區(qū)域相等),這樣內(nèi)存中圖像的數(shù)據(jù)區(qū)域的二維數(shù)組就跟手寫區(qū)域的坐標(biāo)相同,我們再取出手寫區(qū)域的坐標(biāo)值,將這些坐標(biāo)值對應(yīng)到圖像圖像數(shù)據(jù)區(qū)域中,并且將它的灰度值置為255(白色),將圖像數(shù)據(jù)區(qū)域的其它坐標(biāo)值下的灰度值置為0(黑色),這樣我們就得到了一張手寫數(shù)字的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化有利于圖像的進一步處理,使圖像變得簡單,而且數(shù)據(jù)量減小,能凸顯出感興趣的目標(biāo)的輪廓。2.2、模板匹配法模板匹配法是圖像識別中最具有代表性的方法之一。它是將從待識別的圖像提取的假設(shè)干特征量與模板對應(yīng)的特征量進行比擬,計算圖像和模板特征量之間的距離,用最小距離法判定所屬類。模板匹配通常事先建立標(biāo)準(zhǔn)模板庫。這里,模板庫中的標(biāo)準(zhǔn)模板是數(shù)字樣本的特征向量。具體過程是:對于一個待測試的樣本X,計算X和訓(xùn)練集中的某樣本Xj〔0<j<m,m為訓(xùn)練集中的樣本數(shù)〕之間的距離。循環(huán)計算待測樣本和訓(xùn)練集中各樣本之間的距離,比擬所有的距離值,找出距離待測樣本最近的樣本,其中所對應(yīng)的樣本所屬的類別就是待測樣本X所屬的類別。2.3、圖像的特征提取假設(shè)直接把預(yù)處理后的數(shù)據(jù)作為輸入量,進行分類計算時數(shù)據(jù)時數(shù)據(jù)量大,同時由于手寫字體的多樣化及圖像本身和預(yù)處理過程中附帶的某些干擾的影響,對系統(tǒng)的容錯能力要求較高。特征提取的目的就是從分析數(shù)字的拓撲結(jié)構(gòu)入手,把它的某些結(jié)構(gòu)特征提取出來,使數(shù)字的位移、大小變化、字形畸形等干擾相對較小,也就是把那些反映數(shù)字特征的關(guān)鍵信息提供應(yīng)系統(tǒng),這樣就等于間接地增加了系統(tǒng)的容錯能力,而且經(jīng)過特征提取后數(shù)據(jù)量也大大減少了,這樣就提高了識別的效率。手寫數(shù)字識別的特征提取極大程度地影響著分類器的設(shè)計和性能,以及識別的效果和效率。為了保證所要求的分類識別的正確率和節(jié)省資源,希望依據(jù)最少的特征到達所要求的分類識別的正確率。在進行手寫數(shù)字識別的過程中,特征提取應(yīng)遵循以下原那么:特征應(yīng)能盡量包含字符的有用信息。特征的提取方法應(yīng)簡單而且提取快速。各個特征之間的相關(guān)性應(yīng)盡可能小。特征數(shù)量盡可能少。特征應(yīng)有較好的抗干擾能力。3、系統(tǒng)設(shè)計本系統(tǒng)主要包括了主界面、圖像繪制、特征提取、學(xué)習(xí)、識別、去除六個模塊,其總框圖如圖3.0所示:主界面去除識別學(xué)習(xí)特征提取圖像繪制主界面去除識別學(xué)習(xí)特征提取圖像繪制圖3.0系統(tǒng)總框圖以下是各模塊詳細設(shè)計:3.1、主界面主界面主要由繪圖區(qū),學(xué)習(xí)、識別和去除三個按鈕構(gòu)成,通過調(diào)用VC++庫里的CBrush、CRect、CBitmap來進行相關(guān)操作,學(xué)習(xí)、識別和去除三個按鈕首先通過建立三個CBitmap類,通過位圖將其畫出來,如圖、、所示;再建立一個SPLASH類,最后通過程序來設(shè)計總界面,如下圖:圖3.1.1學(xué)習(xí)按鈕圖3.1.2識別按鈕圖3.1.3去除按鈕圖3.1.4總界面3.2、圖像繪制圖像的繪制主要是按下鼠標(biāo)左鍵、拖動鼠標(biāo)、放開鼠標(biāo)左鍵這樣一個過程,本次設(shè)計通過OnLButtonDown()〔鼠標(biāo)左鍵按下函數(shù)〕、OnMouseMove()〔鼠標(biāo)移動函數(shù)〕、OnLButtonUp()〔鼠標(biāo)左鍵放開函數(shù)〕來實現(xiàn)圖像的繪制,流程圖如圖3.2所示:結(jié)束放開鼠標(biāo)左鍵,執(zhí)行OnLButtonUp()拖動鼠標(biāo),執(zhí)行OnMouseMove()按下鼠標(biāo)左鍵,執(zhí)行OnLButtonDown結(jié)束放開鼠標(biāo)左鍵,執(zhí)行OnLButtonUp()拖動鼠標(biāo),執(zhí)行OnMouseMove()按下鼠標(biāo)左鍵,執(zhí)行OnLButtonDown()將鼠標(biāo)放在繪圖區(qū)域圖3.2圖像繪制流程圖3.3、特征提取本模塊首先要創(chuàng)立一個結(jié)構(gòu)體變量來表示所繪圖形的各種特征,比方value〔手寫數(shù)字值〕、VHDerection〔水平垂直特征〕、length1〔第一個筆畫長度〕等等,具體情況看附錄->程序清單里的特征提取函數(shù),每個特征的提取如圖3.3流程圖所示:開始求lenth的值求lenend的值求lenfirst的值通過switch語句選出不同水平垂直特征值執(zhí)行相對應(yīng)case語句,mytezheng->lenth++1開始求lenth的值求lenend的值求lenfirst的值通過switch語句選出不同水平垂直特征值執(zhí)行相對應(yīng)case語句,mytezheng->lenth++1mytezheng->lenth=1求出兩個相鄰點p求出兩個相鄰點p和q的距離mytezheng->decon=1,mytezheng->decon=1,判斷相鄰兩點x、y的大小,分別給出不同的水平垂直特征值0(p>1)||(q>1)0(p>1)||(q>1)判斷1、判斷1、0兩點x、y的大小,分別給出不同的水平垂直特征值mytezheng->lenth=110j==010j==0結(jié)束結(jié)束圖3.3特征提取流程圖3.4、學(xué)習(xí)首先點擊學(xué)習(xí)按鈕,判斷當(dāng)前寫入數(shù)值是否已在模板中,隨后出現(xiàn)輸入學(xué)習(xí)值對話框,提取特征值,最后存入模板,如圖3.4所示:存在不存在結(jié)束點擊學(xué)習(xí)按鈕判斷當(dāng)前值是否存在模板中顯示模板中已存有該值存入模板提取特征值存在不存在結(jié)束點擊學(xué)習(xí)按鈕判斷當(dāng)前值是否存在模板中顯示模板中已存有該值存入模板提取特征值圖3.4學(xué)習(xí)流程圖3.5、識別識別過程就相當(dāng)于一個查詢過程,首先點擊識別按鈕,然后提取特征值,將特征值與模板一一比照,假設(shè)有那么顯示其值,假設(shè)無那么顯示無法識別,如圖3.5所示:無有顯示識別出的值結(jié)束顯示無法識別逐一比照提取特征值點擊識別按鈕無有顯示識別出的值結(jié)束顯示無法識別逐一比照提取特征值點擊識別按鈕圖3.5識別流程圖3.6、去除去除最為簡單,把繪圖區(qū)域的每個點設(shè)置為白點,即二值圖像中灰度值都變?yōu)?55,流程如圖3.6所示:結(jié)束繪圖區(qū)每個點設(shè)置為白色點擊去除按鈕結(jié)束繪圖區(qū)每個點設(shè)置為白色點擊去除按鈕圖3.6去除流程圖4、系統(tǒng)調(diào)試運行程序后,會出現(xiàn)如下圖的圖樣,然后往繪圖區(qū)寫一個2,然后點擊學(xué)習(xí)按鈕,出現(xiàn)如圖4.1所示圖樣,說明所寫數(shù)字已存在模板中。圖4.1學(xué)習(xí)調(diào)試點擊確定后點擊去除按鈕,再輸入一個8,如圖4.2所示,這次就跟之前不一樣了,說明模板庫里沒有剛剛寫入的數(shù)字,然后往兩個編輯框里都輸入8以后點擊OK,這樣就完成了學(xué)習(xí)的功能。圖4.2學(xué)習(xí)調(diào)試點擊去除之后,往繪圖區(qū)寫入一個4,如圖4.3所示說明識別成功。圖4.3識別調(diào)試去除調(diào)試只要點擊去除按鈕,它就會彈出圖的樣子。識別率如表4.1:數(shù)字測試次數(shù)正確次數(shù)識別率0201680%1201995%2201890%3201890%4201785%5201365%6201680%7201995%820945%9201785%表4.1識別率統(tǒng)計分析:從表中可以看出8和5較難識別,因為其特征不太好提取,特征比擬多樣化,所以需要大量的學(xué)習(xí),豐富模板庫,這樣可以提高識別率。5、心得體會本文對基于VC++6.0的手寫數(shù)字識別系統(tǒng)的根本原理及方法進行了介紹。手寫體數(shù)字識別是一個極具研究價值的課題,手寫數(shù)字的樣品類別總共只有0一9十類,與其它的大字符集的識別(漢字識別)相比要相對容易。本文所采用的模板匹配分類器既節(jié)省時間,簡便易行,也可以到達較高地識別效果。但是在系統(tǒng)的設(shè)計上由于時間的限制導(dǎo)致系統(tǒng)界面的設(shè)計不夠美觀,特征訓(xùn)練不夠?qū)е伦R別率不夠高。手寫體數(shù)字的特征提取是一個非常復(fù)雜的問題,可以考慮在識別的時候使用有監(jiān)督的識別方法,這樣在識別的同時可以更新特征庫,這里所說的更新是把導(dǎo)致識別錯誤的模板替換掉這樣出錯的幾率就會越來越小從而使特征庫越來越完善,進一步提高識別的準(zhǔn)確度。6、參考文獻〔1〕張立凡等著.手寫數(shù)字識別系統(tǒng)設(shè)計.北京:印刷學(xué)院學(xué)報,2023年04期.〔2〕馮偉興著.VisualC++數(shù)字圖像模式識別技術(shù)詳解.北京:機械工業(yè)出版社,2023年9月.〔3〕張宏林著.精通VisualC++數(shù)字圖像模式識別技術(shù)及工程實踐.北京:人民郵電出版社,2023年8月.〔4〕章毓晉著.圖像工程〔中冊〕圖像分析〔第二版〕.北京:清華大學(xué)出版社,2023年7月.〔5〕謝鳳英著.VisualC++數(shù)字圖像處理.北京:電子工業(yè)出版社,2023年5月.附錄:程序清單:1、初始化程序CPatternView::CPatternView(){//TODO:addconstructioncodehere mouseDown=0;//初始化,使得每個點皆為白點 for(inti=0;i<16;i++) for(intj=0;j<16;j++) bitgraph[i][j]=0;//初始化,使得坐標(biāo)序列中的點皆為空點 mytime=0; for(i=0;i<100;i++){ mypoint[i].x=-1; mypoint[i].y=-1; }mytime=0; curvalue=-1; mytezheng=(TEZHENG*)malloc(sizeof(TEZHENG)); mytezheng->value=-1; mytezheng->lenth=0; mytezheng->lenth1=0; for(i=0;i<15;i++) mytezheng->VHDerection[i]=-1; mytezheng->decon=0;//翻開保存模板特征量的文件 if(cf.Open("mydata.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)==NULL){ AfxMessageBox("翻開文件失敗,\n您最好退出程序"); }}2、創(chuàng)立主界面程序voidCPatternView::OnDraw(CDC*pDC){CPatternDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);/*ASSERT_VALID是一個斷定宏,如果pDoc為NULL就不繼續(xù)運行*///TODO:adddrawcodefornativedatahere//Erasethebackground//創(chuàng)立一個面色刷 CBrushBrush(RGB(128,0,0));/*CBrush是封裝了Windows圖形設(shè)備接口〔GDI〕中畫刷的MFC類,用于構(gòu)造CBrush對象,然后傳給需要畫刷的CDC成員函數(shù)*/CBrush*pOldBrush=pDC->SelectObject(&Brush);//選擇刷到設(shè)備上下文//Gettheareathatneedstobeerased(擦除〕. CRectrcClip;//CRect從tagRECT結(jié)構(gòu)派生而來 pDC->GetClipBox(&rcClip);/*該函數(shù)得到一個能夠完整包含當(dāng)前可見區(qū)域的最小矩形的大小*/ //Paintthearea. pDC->PatBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),PATCOPY);//使用當(dāng)前選入指定設(shè)備環(huán)境中的刷子繪制給定的矩形區(qū)域pDC->SelectObject(pOldBrush);//取消選擇刷出設(shè)備上下文//三個模擬位圖按鈕 CBitmapbitmapstudy,bitmaprecognize,bitmapclear;/*類CBitmap封裝了Windows圖形設(shè)備接口〔GDI〕中的位圖*/CDCdcMemory1,dcMemory2,dcMemory3;/*通過CDC對象的成員函數(shù)進行所有的繪圖*/bitmapstudy.LoadBitmap(IDB_BITMAP_STUDY);/*從模塊的可執(zhí)行文件中加載IDB_BITMAP_STUDY位圖資源*/dcMemory1.CreateCompatibleDC(pDC);/*創(chuàng)立一個與PDC兼容的內(nèi)存設(shè)備上下文環(huán)境〔DC〕*/dcMemory1.SelectObject(&bitmapstudy);/*選擇bitmapstudy到dcMemory1的上下文環(huán)境中*/pDC->BitBlt(220,20,50,20,&dcMemory1,0,0,SRCCOPY);/*對&dcMemory1中的像素進行位塊轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境*/bitmaprecognize.LoadBitmap(IDB_BITMAP_RECOGNIZE);dcMemory2.CreateCompatibleDC(pDC);dcMemory2.SelectObject(&bitmaprecognize);pDC->BitBlt(220,80,50,20,&dcMemory2,0,0,SRCCOPY);bitmapclear.LoadBitmap(IDB_BITMAP_CLEAR);dcMemory3.CreateCompatibleDC(pDC);dcMemory3.SelectObject(&bitmapclear);pDC->BitBlt(220,140,50,20,&dcMemory3,0,0,SRCCOPY);//畫板 CBrushBrushBoard(RGB(255,255,255)); //Selectthebrushintothedevicecontext. pOldBrush=pDC->SelectObject(&BrushBoard); //Paintthearea. pDC->PatBlt(8,8,176,240,PATCOPY); //UnselectbrushoutofdevicecontextpDC->SelectObject(pOldBrush);pDC->SetTextColor(RGB(255,255,255));//設(shè)置當(dāng)前環(huán)境(HDC)的字體顏色pDC->SetTextAlign(TA_CENTER|TA_TOP);//指定設(shè)備環(huán)境設(shè)置文字對齊標(biāo)志pDC->SetBkMode(TRANSPARENT);/*TRANSPARENT是使用透明的輸出,也就是文字的背景是不改變的*/}3、學(xué)習(xí)程序voidCPatternView::OnStudy(void){//輸入數(shù)字值的對話框 InputDialoginputdlg; cf.SeekToBegin();//定位當(dāng)前文件指針到文件開頭 intnFileSize=cf.GetLength();//獲取文件長度 inti=nFileSize/sizeof(TEZHENG); TEZHENG*temp; temp=(TEZHENG*)malloc(sizeof(TEZHENG));//計算當(dāng)前畫板中數(shù)字的特征值 GetTeZheng();//首先判斷當(dāng)前的數(shù)字類型是否已經(jīng)在模板中 for(intj=0;j<i;j++){ cf.Read((void*)temp,sizeof(TEZHENG));//從文件cf的當(dāng)前位置讀數(shù)據(jù) for(intk=0;k<15;k++){if(temp->VHDerection[k]!=mytezheng->VHDerection[k])//判斷水平特征 break; } if((k==15)&&(temp->decon==mytezheng->decon)&&(temp->lenfirst==mytezheng->lenfirst)&&(temp->lenth1==mytezheng->lenth1)&&(temp->lenth==mytezheng->lenth)&&(temp->lenend==mytezheng->lenend)){ chars[20]; sprintf(s,"您輸入的是:%d,數(shù)據(jù)已有",temp->value); AfxMessageBox(s); break; } } //說明該數(shù)字類型不在模板中 if(j==i){ if(inputdlg.DoModal()==IDOK){ //判斷數(shù)字輸入對話框中的兩個數(shù)字是否相同 if(inputdlg.m_value1!=inputdlg.m_value2){ AfxMessageBox("您的輸入有誤,\n請重新輸入"); } //相同,那么將新的數(shù)字類型寫入模板文件中 else{ GetTeZheng(); try{mytezheng->value=inputdlg.m_value1;cf.SeekToEnd();//定位當(dāng)前文件指針到文件尾cf.Write(&mytezheng->value,sizeof(signedchar));//將文件數(shù)據(jù)寫入當(dāng)前文件位置cf.Write(mytezheng->VHDerection,sizeof(signedchar)*15);cf.Write(&mytezheng->lenth1,sizeof(signedchar));cf.Write(&mytezheng->lenth,sizeof(signedchar));cf.Write(&mytezheng->decon,sizeof(signedchar));cf.Write(&mytezheng->lenfirst,sizeof(signedchar));cf.Write(&mytezheng->lenend,sizeof(signedchar)); } catch(CFileException*e){ //Alertusertoerror e->Delete(); }//endtry-catch }//endif-else }//endif }//endifreturn;}4、識別程序voidCPatternView::OnRecognize(void){cf.SeekToBegin(); intnFileSize=cf.GetLength(); inti=nFileSize/sizeof(TEZHENG); TEZHENG*temp; temp=(TEZHENG*)malloc(sizeof(TEZHENG)); //計算特征值 GetTeZheng();//在模板文件中尋找,是否有與當(dāng)前特征值相同的 for(intj=0;j<i;j++){ cf.Read((void*)temp,sizeof(TEZHENG)); for(intk=0;k<15;k++){ if(temp->VHDerection[k]!=mytezheng->VHDerection[k]) break; } //找到識別結(jié)果if((k==15)&&(temp->decon==mytezheng->decon)&&(temp->lenfirst==mytezheng->lenfirst)&&(temp->lenth1==mytezheng->lenth1)&&(temp->lenth==mytezheng->lenth)&&(temp->lenend==mytezheng->lenend)){ chars[20]; sprintf(s,"您輸入的是:%d",temp->value); AfxMessageBox(s); break;//搜索結(jié)束 } } if(j==i){ AfxMessageBox("抱歉,無法識別"); }return;}5、去除程序voidCPatternView::OnClear(void){CDC*pDC=GetDC();/*檢索一指定窗口的客戶區(qū)域或整個屏幕的顯示設(shè)備上下文環(huán)境的句柄,以后可以在GDI函數(shù)中使用該句柄來在設(shè)備上下文環(huán)境中繪圖*/CBrushBrushBoard(RGB(255,255,255)); CBrushpOldBrush; pDC->PatBlt(8,8,176,240,PATCOPY);for(inti=0;i<16;i++) for(intj=0;j<16;j++) bitgraph[i][j]=0;mouseDown=0; mytime=0; for(i=0;i<100;i++){ mypoint[i].x=-1; mypoint[i].y=-1; } curvalue=-1; mytezheng->value=-1; mytezheng->lenth=0; mytezheng->lenth1=0; for(i=0;i<15;i++) mytezheng->VHDerection[i]=-1; mytezheng->decon=0;return;}6、特征提取程序voidCPatternView::GetTeZheng(){intp,q; inti=0; //從第一個點到最后一個點 for(intj=0;j<mytime-1;j++){ if(i==0){mytezheng->lenth1++;} if(i>=13){AfxMessageBox("內(nèi)存溢出,呵呵",NULL,NULL); return;}//判斷兩個相鄰點的距離 p=(mypoint[j+1].x-mypoint[j].x)*(mypoint[j+1].x-mypoint[j].x); q=(mypoint[j+1].y-mypoint[j].y)*(mypoint[j+1].y-mypoint[j].y); //如果不是8連接,那么為斷裂點或者是寫的太快 if((p>1)||(q>1)){mytezheng->decon=1; j++;i++;if(j+1>mytime-1){AfxMessageBox("您可能寫得太快了,呵呵",NULL,NULL); return;} if(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elseif(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elseif(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elsemytezheng->VHDerection[i]=4; mytezheng->lenth=1;}//盡量保持目前的方向 else{if(j==0){if(mypoint[1].x>mypoint[0].x) mytezheng->VHDerection[0]=1; elseif(mypoint[1].y>mypoint[0].y) mytezheng->VHDerection[0]=2; elseif(mypoint[1].x<mypoint[0].x) mytezheng->VHDerection[0]=3; elsemytezheng->VHDerection[0]=4; mytezheng->lenth=1;}//endif else{switch(mytezheng->VHDerection[i]){ case1:if(mypoint[j+1].x<=mypoint[j].x){ i++; mytezheng->lenth=1; if(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elseif(mypoint[j+1].y<mypoint[j].y) mytezheng->VHDerection[i]=4; elsemytezheng->VHDerection[i]=3;} elsemytezheng->lenth++; break; case2:if(mypoint[j+1].y<=mypoint[j].y){ i++; mytezheng->lenth=1; if(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elseif(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elsemytezheng->VHDerection[i]=4;} elsemytezheng->lenth++; break; case3:if(mypoint[j+1].x>=mypoint[j].x){ i++; mytezheng->lenth=1; if(mypoint[j+1].y<mypoint[j].y) mytezheng->VHDerection[i]=4; elseif(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elsemytezheng->VHDerection[i]=1;} elsemytezheng->lenth++; break; case4:if(mypoint[j+1].y>=mypoint[j].y){ i++; mytezheng->lenth=1; if(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elseif(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elsemytezheng->VHDerection[i]=2;} elsemytezheng->lenth++; break; default: break; }//endswitch }//endelse }//endelse }//endfor for(p=0;p<4;p++){ for(q=p+1;q<mytime;q++){ if(mypoint[p]==mypoint[q]) break;} if(q<mytime) break;} if(p>=4) mytezheng->lenfirst=2; else mytezheng->lenfirst=1;for(p=mytime-1;p>mytime-6;p--){ for(q=p-1;q>=0;q--){ if(mypoint[p]==mypoint[q]) break;} if(q>=0) break;} if(p<=mytime-6) mytezheng->lenend=2; elsemytezheng->lenend=1;if((mytezheng->lenth)>0&&(mytezheng->lenth)<=4) mytezheng->lenth=1; elsemytezheng->lenth=2;if(mytezheng->lenth1>=4) mytezheng->lenth1=2; elsemytezheng->lenth1=1;}7、鼠標(biāo)左鍵按下程序voidCPatternView::OnLButtonDown(UINTnFlags,CPointpoint){mouseDown=1; if((point.x>=220)&&(point.x<270)&&(point.y>=20)&&(point.y<40)){ OnStudy();}if((point.x>=220)&&(point.x<270)&&(point.y>=80)&&(point.y<100)){ OnRecognize();}if((point.x>=220)&&(point.x<270)&&(point.y>=140)&&(point.y<160)){ OnClear();}CView::OnLButtonDown(nFlags,point);}8、鼠標(biāo)移動程序voidCPatternView::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();/*檢索一指定窗口的客戶區(qū)域或整個屏幕的顯示設(shè)備上下文環(huán)境的句柄,以后可以在GDI函數(shù)中使用該句柄來在設(shè)備上下文環(huán)境中繪圖*/ CRgnRgn;//CRgn類封裝了一個Windows圖形設(shè)備接口〔GDI〕區(qū)域//限制在輸入?yún)^(qū)域的范圍內(nèi) Rgn.CreateRectRgn(startX,startY,startX+stepX*16-1,s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論