畢業(yè)論文_計(jì)算機(jī)應(yīng)用基礎(chǔ)_第1頁
畢業(yè)論文_計(jì)算機(jī)應(yīng)用基礎(chǔ)_第2頁
畢業(yè)論文_計(jì)算機(jī)應(yīng)用基礎(chǔ)_第3頁
畢業(yè)論文_計(jì)算機(jī)應(yīng)用基礎(chǔ)_第4頁
畢業(yè)論文_計(jì)算機(jī)應(yīng)用基礎(chǔ)_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、摘要 本論文主要講述了圖像文件(bmp)文件格式下中簡(jiǎn)單圖形的識(shí)別,主要是直線和圓的識(shí)別,這在工程圖的識(shí)別和其他領(lǐng)域中都有很多的應(yīng)用。 【關(guān)鍵詞】:圖形識(shí)別 、圖像處理、霍夫變換、單義域、多義域、delphi 目 錄第一章 概述4第一節(jié) 引言4第二節(jié) 在工程圖的識(shí)別中常用的方法4第二章 論文的工作基礎(chǔ)和工作環(huán)境6第一節(jié) 數(shù)字圖像處理技術(shù)61. 圖像處理的基本內(nèi)容62. 主要的圖像處理技術(shù)6第二節(jié) 圖像格式BMP格式7第三節(jié) 算法及數(shù)學(xué)基礎(chǔ)81. 霍夫變換(Hough Transform)82. 基于單義域的直線及圓識(shí)別算法113. 主要技術(shù)14第三章 直線和圓的識(shí)別和編輯的實(shí)現(xiàn)15第一節(jié) 系統(tǒng)

2、的層次結(jié)構(gòu)的圖示15第二節(jié) 系統(tǒng)數(shù)據(jù)結(jié)構(gòu)及類的設(shè)計(jì)161. 主要類的層次結(jié)構(gòu)162. 圖形基類(CShape)173. 圖形類(CLine、CCircle)184. 圖形容器類(CShapes)205. 點(diǎn)類(CPoint)216. 單義域類(CSegment)217. 基于單義域識(shí)別類(CSegments)228. 霍夫變換識(shí)別直線類(CHTLine)239. 霍夫變換識(shí)別圓類(CHTCircle)23第三節(jié) 系統(tǒng)功能介紹24第四章 結(jié)束語29參考文獻(xiàn)30第一章 概述第一節(jié) 引言計(jì)算機(jī)技術(shù)的發(fā)展,使人類社會(huì)進(jìn)入了信息化和自動(dòng)化,計(jì)算機(jī)智能識(shí)別也隨著計(jì)算機(jī)的發(fā)展得到了迅速的發(fā)展。特別是圖形圖像

3、的計(jì)算機(jī)處理技術(shù)更是有了前所未有的進(jìn)步和應(yīng)用。計(jì)算機(jī)識(shí)別也逐漸的從圖形圖像處理的大環(huán)境下分離出來作為一門新的高科技研究領(lǐng)域出現(xiàn)。圖形圖像的識(shí)別涉及到的學(xué)科很多,包括數(shù)字信號(hào)處理、工程數(shù)學(xué)、信息論、運(yùn)籌學(xué)、等,它與計(jì)算機(jī)、自動(dòng)化、生物學(xué)、關(guān)學(xué)、視覺心里和生理學(xué)、人工智能、智能信息處理等眾多領(lǐng)域交叉、綜合集成,有廣泛的應(yīng)用。本論文實(shí)現(xiàn)的是基礎(chǔ)的圖形識(shí)別,bmp圖像文件格式中對(duì)圖形的矢量化。識(shí)別基本的圖元直線和圓。直線和圓是二值圖像中最基本的組成元素,也是最常見的圖形元素。在工程圖的數(shù)字化識(shí)別中有很大的應(yīng)用。關(guān)于理想情況的幾點(diǎn)說明:1. 所識(shí)別的bmp圖像文件是經(jīng)過處理的,沒有“噪音”等,在本論文中

4、直接采用的是用Windows中的畫圖軟件畫出的圖像。2. 本論文中圖像中的圖元都是單一的線性,即線寬是一個(gè)象素的情況。第二節(jié) 在工程圖的識(shí)別中常用的方法圖形的識(shí)別最主要的是圖形特征的提取,在這個(gè)階段,常用的方法是全局特征方法(包括:不變距,自回歸模型、傅立葉描述符、霍夫變換等),全局特征的特征提取方法是理論比較完善的,計(jì)算過程比較清楚。針對(duì)不同的特征提取處理,采用相對(duì)應(yīng)的模式匹配方法來將圖形分類,模式識(shí)別迄今已有很多方法,有模板匹配、統(tǒng)計(jì)模式識(shí)別、句法模式識(shí)別、模糊識(shí)別和神經(jīng)網(wǎng)絡(luò)識(shí)別等。在二值圖像的處理中,人們常用的數(shù)據(jù)結(jié)果有游程編碼考慮了掃描行上相鄰象素間的相關(guān)性;行相鄰圖法(Line Ad

5、jeceney Gragh),是由Pavlidis提出的一種二值圖的數(shù)據(jù)結(jié)構(gòu),LAG還考慮了相鄰行黑游程之間的相鄰關(guān)系,遍歷時(shí)很方便;BAG(Bloek Adjeceney Gragh)是由余斌提出的,它是相鄰圖LAG在兩個(gè)方向上的推廣。在本論文中就是利用了LAG的數(shù)據(jù)結(jié)構(gòu)思想與c+ builder的數(shù)據(jù)結(jié)構(gòu)相結(jié)合的方法即:用下一個(gè)象素點(diǎn)是與鏈表頭相鄰還是和尾相鄰來描述其相鄰的關(guān)系。本論文中對(duì)交點(diǎn)的處理。目前對(duì)交點(diǎn)的處理有下面幾類算法:1. 基于網(wǎng)格算法,該算法是通過網(wǎng)格加大搜索步長(zhǎng)來跳過交點(diǎn)。2. 基于圖段合并的算法,是根據(jù)交點(diǎn)處行程段的連通性,以交點(diǎn)為界將圖線分割成圖段,記錄各段之間的連接

6、及從屬關(guān)系,然后連接或延長(zhǎng)各分支圖段,然后得到整條圖線。在本論文中采用了第二種方法,基于圖段合并的算法。當(dāng)然現(xiàn)下有很多更好的算法和數(shù)據(jù)結(jié)構(gòu),但是大部分是針對(duì)具體的結(jié)構(gòu)或者研究方向不具有一般性,所以本論文的實(shí)現(xiàn)用了上述的數(shù)據(jù)結(jié)構(gòu)和方法。第二章 論文的工作基礎(chǔ)和工作環(huán)境第一節(jié) 數(shù)字圖像處理技術(shù)將客觀世界實(shí)體或圖片等通過不同的量化(數(shù)字化)手段送入計(jì)算機(jī),由計(jì)算機(jī)按使用要求進(jìn)行圖像的平滑、增強(qiáng)、復(fù)原、分割、重建、編碼、存儲(chǔ)、傳輸?shù)确N種不同的處理,需要時(shí)把加工處理后的圖像重新輸出,這個(gè)過程稱為圖像處理。因此,圖像處理的含義是用計(jì)算機(jī)對(duì)圖像進(jìn)行加工處理以得到某種預(yù)期的效果,它本質(zhì)上是一種二維數(shù)字信號(hào)處理

7、技術(shù)。1. 圖像處理的基本內(nèi)容圖像處理的基本內(nèi)容可以歸結(jié)為:1. 對(duì)圖像進(jìn)行增強(qiáng)或修改。以改變或強(qiáng)調(diào)圖像信息的某些特點(diǎn)(增強(qiáng)有用信息,無用信息),改善圖像的視覺質(zhì)量;2. 描述圖像的特征并進(jìn)行特征抽取和分析。例如提取圖像的紋理特征、頻譜特征、邊界特征和顏色特征等;對(duì)像素用某個(gè)標(biāo)準(zhǔn)衡量并進(jìn)行分類比較,將抽取的特征歸結(jié)為一定的模式,這屬于模式識(shí)別的范圍;3. 圖像的重建(Reconstruction)。對(duì)圖像的某些部分合并或進(jìn)行重新組織,這種技術(shù)是從N1維的信息用某種算法得到N維的圖像,例如計(jì)算機(jī)視覺就是這樣的一種技術(shù)。2. 主要的圖像處理技術(shù)2.1 圖像的增強(qiáng)和恢復(fù)圖像增強(qiáng)所追求的目標(biāo)是改善圖像

8、的視覺質(zhì)量,符合人們的主觀要求,它不追究圖像客觀質(zhì)量的降低原因。圖像的視覺質(zhì)量是因人而異的,其質(zhì)量的高低和好壞受觀看者的心理、愛好和文化素質(zhì)等因素的影響。圖像的恢復(fù)則致力于探索圖像質(zhì)量降低的原因,并盡可能消除圖像質(zhì)量的降低,恢復(fù)圖像的本來面目。2.2 圖像的壓縮編碼彩色數(shù)字圖像通常是由三個(gè)二維數(shù)組組成的,其信息量相當(dāng)大,這給圖像的傳輸、處理、存儲(chǔ)和顯示等帶來很大的負(fù)擔(dān)。但問題的另一方面是圖像中又往往存在很多冗余信息,在傳輸和存儲(chǔ)時(shí)可以對(duì)數(shù)字圖像進(jìn)行一定方式的編碼,刪除圖像中的冗余信息,以提高圖像傳輸和存儲(chǔ)的效率。2.3 圖像重建在醫(yī)學(xué)和工程應(yīng)用中,利用超聲波、x射線等技術(shù)取得物體的多幅來自不同

9、角度的投影圖,通過計(jì)算可得到物缽內(nèi)部的圖像,這種技術(shù)稱為投影重建,例如CT就是圖像重建的一個(gè)應(yīng)用。2.4 圖像的分割和描述計(jì)算機(jī)按照一定的客觀測(cè)度(例如灰度、顏色和幾何性質(zhì)等)將圖像中包含的物體和區(qū)域從圖像中區(qū)分出來,稱為圖像的分割。用適當(dāng)?shù)臄?shù)學(xué)語言來表示被分割出來的物體或區(qū)域的結(jié)構(gòu)和統(tǒng)計(jì)特性,或用數(shù)學(xué)語言表示區(qū)域問的關(guān)系,稱為描述。圖像經(jīng)分別和描述后,可較為容易地分類和識(shí)別。第二節(jié) 圖像格式BMP格式BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環(huán)境下運(yùn)行的所有圖像處理軟件都支持BMP圖像文件格式。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP

10、為基礎(chǔ)的。Windows 3.0以前的BMP圖文件格式與顯示設(shè)備有關(guān),因此把這種BMP圖像文件格式稱為設(shè)備相關(guān)位圖DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP圖像文件與顯示設(shè)備無關(guān),因此把這種BMP圖像文件格式稱為設(shè)備無關(guān)位圖DIB(device-independent bitmap)格式,目的是為了讓W(xué)indows能夠在任何類型的顯示設(shè)備上顯示所存儲(chǔ)的圖像。BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp(有時(shí)它也會(huì)以.DIB或.RLE作擴(kuò)展名)。l 文件結(jié)構(gòu) 位圖文件可看成由4個(gè)部分組成:位圖文件頭(bitmap-file heade

11、r)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列,它具有如下所示的形式。 位圖文件的組成結(jié)構(gòu)名稱符號(hào)位圖文件頭(bitmap-file header)BITMAPFILEHEADERbmfh位圖信息頭(bitmap-information header)BITMAPINFOHEADERbmih彩色表(color table)RGBQUADaColors圖象數(shù)據(jù)陣列字節(jié)BYTEaBitmapBits第三節(jié) 算法及數(shù)學(xué)基礎(chǔ)1. 霍夫變換(Hough Transform)霍夫變換是圖像處理中從圖像中識(shí)別幾何形狀的基本方法之一

12、。其基本思想就是把圖像平面上的點(diǎn)對(duì)應(yīng)到參數(shù)平面上的曲線,最后通過統(tǒng)計(jì)特性來解決問題。自1962年Hough公布了該算法以來,由于其良好的抗噪聲性能和對(duì)部分遮蓋的不敏感等特性,霍夫變換在模式識(shí)別領(lǐng)域得到廣泛的應(yīng)用,如直線、圓、橢圓、矩形等幾何圖形檢測(cè),任意形狀區(qū)域的邊界提取,二維或三維運(yùn)動(dòng)的參數(shù)估計(jì)等。下面就于本論文相關(guān)的直線和圓的識(shí)別進(jìn)行簡(jiǎn)單的介紹。1.1 霍夫變換識(shí)別直線霍夫變換識(shí)別直線,是將圖像空間中的一點(diǎn)變換為參數(shù)空間中的一條直線。圖像空間中同一直線上的點(diǎn),經(jīng)霍夫變換所形成的直線相交于參數(shù)空間中的一點(diǎn),該點(diǎn)坐標(biāo)代表圖像空間中直線的斜率及截距。利用累加數(shù)組累計(jì)參數(shù)空間中通過該點(diǎn)的直線條數(shù),

13、即代表圖像空間中直線上的點(diǎn)數(shù)。圖1.1 霍夫變換識(shí)別直線(1)設(shè)已知一黑白圖像上畫了一條直線,要求出這條直線所在的位置。我們知道,直線的方程可以用來表示,其中k和b是參數(shù),分別是斜率和截距。過某一點(diǎn)的所有直線的參數(shù)都會(huì)滿足方程。即圖像空間中的一點(diǎn)確定了參數(shù)空間中的一族直線。方程在參數(shù)k-b平面上是一條直線。這樣,圖像x-y平面上的一個(gè)前景像素點(diǎn)就對(duì)應(yīng)到參數(shù)平面上的一條直線?;舴蜃儞Q識(shí)別直線的算法描述如下:Step1. 初始化一塊緩沖區(qū),對(duì)應(yīng)于參數(shù)平面,將其所有數(shù)據(jù)置為0。Step2. 對(duì)于圖像上每一前景點(diǎn),求出參數(shù)平面對(duì)應(yīng)的直線,把這直線上的所有點(diǎn)的值都加。Step3. 找到參數(shù)平面上峰值點(diǎn)的

14、位置,這些位置的坐標(biāo)就是原圖像上直線的參數(shù),每個(gè)位置對(duì)應(yīng)于原圖像上的一條直線。上面是霍夫變換識(shí)別直線的基本思想。在實(shí)際應(yīng)用中,形式的直線方程沒有辦法表示x=c形式的直線(這時(shí)候,直線的斜率為無窮大)。所以實(shí)際應(yīng)用中,是采用參數(shù)方程:這樣,圖像平面(x, y)空間上的一個(gè)點(diǎn)就對(duì)應(yīng)到參數(shù)空間中的一條正弦曲線上。在變換后的空間中這條正弦曲線上的任意一點(diǎn)對(duì)應(yīng)于原始圖像平面(x, y)空間的一條直線,這條直線必通過這個(gè)點(diǎn),而(x, y)空間中所有共線的點(diǎn)經(jīng)過變換后所對(duì)應(yīng)的各正弦曲線都相交于一點(diǎn)。圖1.2 霍夫變換識(shí)別直線(2)1.2 霍夫變換識(shí)別圓1) 半徑已知的圓的識(shí)別利用霍夫變換檢測(cè)出半徑已知的圓形

15、,是將圖像平面上的每一點(diǎn)對(duì)應(yīng)到參數(shù)平面上的一個(gè)以已知半徑為半徑的圓。經(jīng)過霍夫變換,在參數(shù)平面上得到圓相交于一點(diǎn),這個(gè)點(diǎn)的坐標(biāo)即為原圖形坐標(biāo)平面上待識(shí)別的圓心坐標(biāo)。算法可以簡(jiǎn)單描述為:取和圖像平面一樣的參數(shù)平面,以圖像上每一個(gè)前景點(diǎn)為圓心,以已知的半徑在參數(shù)平面上畫圓,并把結(jié)果進(jìn)行累加。最后找出參數(shù)平面上的峰值點(diǎn),這個(gè)位置就對(duì)應(yīng)了圖像上的圓心。2) 未知半徑的圓的識(shí)別在第一個(gè)問題基礎(chǔ)上,把參數(shù)平面擴(kuò)大稱為三維空間,即x-y-R三維,對(duì)應(yīng)圓的圓心和半徑。圖像平面上的每一點(diǎn)就對(duì)應(yīng)于參數(shù)空間中每個(gè)半徑下的一個(gè)圓,在參數(shù)的三維空間中得到一個(gè)圓錐。最后找出參數(shù)空間中的峰值點(diǎn),即得到待識(shí)別的圓的圓心和半徑。

16、由于霍夫變換具有良好的抗噪聲性能和對(duì)部分遮蓋的不敏感等特性,又不受圖像旋轉(zhuǎn)的影響,在很多領(lǐng)域都有廣泛的應(yīng)用,有關(guān)霍夫變換的研究和改進(jìn)也很多。例如廣義霍夫變換、隨機(jī)霍夫變換、快速霍夫變換等等,就是針對(duì)直線的霍夫變換也有很多改進(jìn)算法。由于時(shí)間的原因,在本軟件中,只是使用了標(biāo)準(zhǔn)的霍夫變換算法。2. 基于單義域的直線及圓識(shí)別算法霍夫變換為幾何圖形的識(shí)別的一個(gè)重要算法,但是由于該標(biāo)準(zhǔn)算法的時(shí)間復(fù)雜度和空間復(fù)雜度都是,其中m是參數(shù)坐標(biāo)的維數(shù),雖然有不少針對(duì)具體問題(例如直線識(shí)別)的改進(jìn)算法,其在實(shí)際使用中也存在計(jì)算量大的問題。針對(duì)本論文的工作的實(shí)際情況,參考文獻(xiàn)【1】,并進(jìn)行了適當(dāng)?shù)暮?jiǎn)化,完成了論文的識(shí)別

17、部分。下面就對(duì)這個(gè)基于單義域的識(shí)別算法進(jìn)行簡(jiǎn)單的介紹。2.1 多義域的獲得單義域是指對(duì)待識(shí)別的圖形進(jìn)行分割得到的具有單一的幾何意義(線段或圓?。c(diǎn)的集合。對(duì)圖片進(jìn)行從上往下、從左往右的掃描,根據(jù)交點(diǎn)進(jìn)行分割得到多義域,多義域中的點(diǎn)構(gòu)成一個(gè)連通區(qū)域。對(duì)多義域進(jìn)行識(shí)別并分割得到單義域。多義域由鏈表實(shí)現(xiàn)。算法描述如下:1 對(duì)圖形進(jìn)行從上往下、從左往右的掃描;2 對(duì)每一個(gè)前景點(diǎn),判斷其是否為交點(diǎn);3 將該點(diǎn)與現(xiàn)有的多義域的頭(如果其頭節(jié)點(diǎn)不是交點(diǎn))、尾(如果其尾節(jié)點(diǎn)不是交點(diǎn))節(jié)點(diǎn)進(jìn)行比較,如果與頭節(jié)點(diǎn)相鄰,將其插入到該多義域的頭節(jié)點(diǎn)之前;如果與尾節(jié)點(diǎn)相鄰,將其插入到該多義域的尾節(jié)點(diǎn)之后。4 如果該前景

18、點(diǎn)不屬于任何現(xiàn)有多義域,則以該點(diǎn)為頭節(jié)點(diǎn)生成新的多義域。5 直到圖形掃描完畢。注:交點(diǎn)的判斷。由此得到的多義域?qū)⑹且粋€(gè)線段、一個(gè)圓弧或者線段和圓弧的組合。在后續(xù)的識(shí)別過程中將把不是單義域的進(jìn)行分裂。2.2 最小二乘法擬合直線和圓最小二乘法首先由Karl Gauss為進(jìn)行行星軌道預(yù)測(cè)的研究而提出的?,F(xiàn)在最小二乘法已經(jīng)變成從實(shí)驗(yàn)數(shù)據(jù)來進(jìn)行參數(shù)估計(jì)的主要手段。由最小二乘法獲得的估計(jì)在一定條件下有最佳的統(tǒng)計(jì)特性:一致、無偏、有效。它提供給我們一個(gè)數(shù)學(xué)程式,通過它能獲得一個(gè)在最小方差意義上與實(shí)驗(yàn)數(shù)據(jù)最好擬合助模型。運(yùn)用最小二乘法進(jìn)行圓的擬合公式如下:其中,為樣點(diǎn),為所求圓心,為半徑,為平均徑向誤差, 為

19、最大徑向誤差。2.3 多義域分裂和單義域的識(shí)別對(duì)2.1中得到的多義域,運(yùn)用最小二乘法進(jìn)行擬合,對(duì)于擬合不成功的多義域運(yùn)用首尾相連最大距離法進(jìn)行分裂,得到單義域,并記錄下各單義域的擬合結(jié)果,供全局考慮,識(shí)別直線和圓用。算法描述如下:1 從2.1得到的多義域列表里取第一個(gè)多義域;2 對(duì)選中的多義域運(yùn)用最小二乘法進(jìn)行圓的擬合;如果得到的平均徑向誤差和最大徑向誤差小于指定閾值,則認(rèn)為擬合成功,該多義域?yàn)橐粓A弧的單義域;記錄擬合的結(jié)果,作為總體識(shí)別的種子圓,轉(zhuǎn)向5執(zhí)行,否則執(zhí)行3。3 對(duì)選中的多義域運(yùn)用最小二乘法進(jìn)行直線擬合;如果得到的平均距離誤差和最大距離誤差小于指定閾值,則認(rèn)為擬合成功,該多義域?yàn)橐?/p>

20、線段的單義域;記錄擬合結(jié)果,作為總體識(shí)別的種子直線,轉(zhuǎn)向5執(zhí)行,否則執(zhí)行4。4 該多義域?yàn)槎鄠€(gè)線段或圓弧的組合。將該多義域的頭尾節(jié)點(diǎn)連接,計(jì)算該多義域中各點(diǎn)與頭尾節(jié)點(diǎn)連線的距離,取距離最大的點(diǎn),對(duì)該多義域進(jìn)行分裂,得到兩個(gè)新的多義域,取代原先的多義域;轉(zhuǎn)向2執(zhí)行。5 取多義域列表中的下一個(gè),轉(zhuǎn)向2執(zhí)行。由此,所有的多義域都分裂為單義域,并對(duì)各單義域進(jìn)行了擬合。2.4 總體整合,識(shí)別直線和圓對(duì)2.3得到的單義域列表進(jìn)行總體的整合,得到直線和圓。1 選取單義域列表中的第一個(gè)單義域,將其擬合的圖形(直線或圓)作為種子圖形;2 將列表中其他單義域的識(shí)別結(jié)果與種子圖形進(jìn)行比較,如果誤差小于指定閾值,則屬

21、于同一直線或同一圓,將其與選定單一域進(jìn)行合并,從列表中刪除該單義域;3 計(jì)算選定單義域的幾何數(shù)據(jù),得到圖形;4 選取列表中的下一個(gè)單義域,轉(zhuǎn)動(dòng)2執(zhí)行。3. 主要技術(shù)3.1 Borland C+ Builder本論文的編程環(huán)境之所以選用c+ builder 是因?yàn)樗幸韵碌膬?yōu)點(diǎn):輸出入接口設(shè)計(jì)簡(jiǎn)單提供一流的開發(fā)環(huán)境提供最標(biāo)準(zhǔn)的CC魯開發(fā)工具提供豐富的組件與最強(qiáng)勁的調(diào)試工具VCL類庫(kù)中封裝了Windows的圖形設(shè)備接口(GDI),使得用戶很方便地在應(yīng)用程序添加圖像或處理圖像。圖像類主要有Tbitmap、TBrush、TCanves、TFont、TgraphakControl、Tgraphic、Ti

22、con、TJPEGImage、TPen和Tpictur以Tmatifile類。3.2 虛類及虛方法的使用虛類和虛方法的使用在本論文中主要是Cshapes基類及虛方法的實(shí)現(xiàn)。第三章 直線和圓的識(shí)別和編輯的實(shí)現(xiàn)第一節(jié) 系統(tǒng)的層次結(jié)構(gòu)的圖示第二節(jié) 系統(tǒng)數(shù)據(jù)結(jié)構(gòu)及類的設(shè)計(jì)1. 主要類的層次結(jié)構(gòu)1.1 圖形處理類:1.2 識(shí)別用類:2. 圖形基類(CShape)2.1 描述圖形基類,提供所有圖形的標(biāo)準(zhǔn)屬性和方法。其他圖形類(直線、圓)等都是該類的子類,繼承其所有的public屬性和方法,對(duì)其中的虛方法(virtual)進(jìn)行重定義和實(shí)現(xiàn)。該類為虛類,其成員函數(shù)主要為虛函數(shù),為其所有子類提供統(tǒng)一的接口,但是

23、沒有實(shí)現(xiàn)。其他模塊對(duì)圖形進(jìn)行操作時(shí),除非生成新的實(shí)例(Instance),都無須知道所操作的是哪個(gè)具體的圖形,而統(tǒng)一使用Cshape類型,為程序的實(shí)現(xiàn)、擴(kuò)充和維護(hù)提供很大方便。2.2 實(shí)現(xiàn)class CShape public:/* 屬性定義 */前景色(由于時(shí)間等的限制,本系統(tǒng)暫時(shí)只定義該圖形的屬性,其/ 他如:填充色,線條型,填充型等可擴(kuò)充) TColor color; /* 編輯用屬性 */ /編輯時(shí)標(biāo)志該圖形是否被選擇 bool isSelected; /編輯操作所選中的點(diǎn) TPoint * editP /* 識(shí)別用屬性 */ / 識(shí)別的效果描述,值越小說明識(shí)別效果越好 / 最小二乘法

24、的平均誤差;/ 霍夫變換:1 - 參數(shù)空間中該圖形的值/最大值 double chance; /圖形上點(diǎn)的數(shù)量 int pointCount; /* 成員函數(shù)定義 */ /* 顯示和描述用方法 */ / 顯示圖形:在指定的位圖上顯示圖形 virtual void draw(Graphics:TBitmap * argDest); / 描述圖形:作為TtreeView的節(jié)點(diǎn)(主窗體使用) virtual void discript(int index, TTreeView * tree); / 描述圖形:返回描述圖形的字符串 virtual String discript(); /* 識(shí)別用 *

25、/ / 比較兩個(gè)圖形,如果是同一個(gè)圖形,返回True,否則False。 / 直線上的兩個(gè)線段;圓上面的兩個(gè)圓弧 virtual bool similarWith(CShape * argShape); / 合并兩個(gè)圖形 / 經(jīng)過判斷為相同的圖形進(jìn)行合并,返回True;否則返回False。 virtual bool mergeWith(CShape * argShape); / 判斷圖形存在的可能性(利用具體圖形的幾何規(guī)則) virtual bool checkPossible(); /* 編輯用 */ / 判斷是否點(diǎn)擊該圖形,若選中則當(dāng)前編輯的圖形改為當(dāng)前圖形 virtual bool isC

26、lickOnShape(int x, int y); / 取得鼠標(biāo)形狀:鼠標(biāo)移動(dòng)到選中圖形的可操作點(diǎn)上時(shí),顯示為編輯形狀 virtual TCursor getCursor(int x, int y); / 更新圖形:將編輯點(diǎn)移動(dòng)到(x, y)點(diǎn)。更新成功返回True,否則False。 virtual bool update(int x, int y);3. 圖形類(CLine、CCircle)3.1 描述圖形類是幾何圖形的具體實(shí)現(xiàn),實(shí)現(xiàn)對(duì)應(yīng)幾何圖形的描述和相關(guān)操作。圖形類有共同的父類CShape,對(duì)父類中定義的虛方法根據(jù)本幾何圖形的特征進(jìn)行實(shí)現(xiàn)。根據(jù)要求,本系統(tǒng)中實(shí)現(xiàn)了直線(CLine)和圓

27、(CCircle)兩個(gè)圖形類。其他簡(jiǎn)單的幾何圖形如橢圓、矩形等也可以類似的方法實(shí)現(xiàn),作為本系統(tǒng)的一個(gè)擴(kuò)充。本系統(tǒng)中,直線類采用直觀的的形式來描述直線(既避免點(diǎn)斜式不能描述豎直直線,也避免極坐標(biāo)方程轉(zhuǎn)換的問題)。因?yàn)槌杀壤膬山M和表示同一條直線,所以規(guī)定,如果B參數(shù)不為0,則。由于要識(shí)別圖像中的線段,所以增加兩個(gè)端點(diǎn)進(jìn)行限制。直線類有三個(gè)點(diǎn)可以編輯:1)兩個(gè)端點(diǎn),選中一個(gè)端點(diǎn)并移動(dòng),是以另一端點(diǎn)為軸進(jìn)行旋轉(zhuǎn);2)線段的中點(diǎn),選中中點(diǎn)并移動(dòng),是平移整個(gè)直線。圓類采用的形式描述(其中為圓心,R為半徑),直觀方便。圓上有兩個(gè)點(diǎn)支持編輯操作:1)圓心,選中圓心并移動(dòng),是平移整個(gè)圓;2)圓上的一個(gè)點(diǎn),選中

28、該點(diǎn)并移動(dòng),是改變圓的半徑,圓心不變。3.2 實(shí)現(xiàn)l 直線類(CLine)class CLine: public CShape public: /* 初始化 */ CLine(double argA, double argB, double argC); /* 直線的屬性 */ / 線段的兩個(gè)端點(diǎn) TPoint *startP, *endP; / 直線方程的參數(shù):A,B,C double A, B, C;/* 對(duì)父類虛方法的實(shí)現(xiàn) */ 在目標(biāo)位圖上畫出直線(本系統(tǒng)中的實(shí)現(xiàn)為畫線段) void draw(Graphics:TBitmap * argDest); / 在TTreeView中描述 v

29、oid discript(int index, TTreeView * tree); / 返回描述用字符串 String discript(); / 判斷該直線是否與指定圖形相同 / 將指定圖形強(qiáng)制轉(zhuǎn)化為CLine類型,比較其參數(shù)A, B, C,/ 若小于指定閾值,則返回Ture,否則返回False。 bool similarWith(CShape * argShape); / 合并同一直線上的兩個(gè)線段 / 若目標(biāo)圖形與該圖形屬同一直線,進(jìn)行合并,返回True;/ 否則返回False。 void mergeWith(CShape * argShape); / 判斷是否選擇該直線進(jìn)行編輯。 /

30、判斷指定點(diǎn)(x, y)到該直線的距離,/ 如果小于指定閾值則返回True,否則False。 bool isClickOnShape(int x, int y); / 取得鼠標(biāo)形狀。 / 端點(diǎn)時(shí)返回45度,135度的雙向箭頭形狀表示旋轉(zhuǎn);/ 中點(diǎn)時(shí)返回垂直的四個(gè)方向箭頭的形狀表示移動(dòng) TCursor getCursor(int x, int y); / 更新直線 bool update(int x, int y);l 圓類(CCircle)class CCircle: public CShape public: /* 初始化 */ CCircle(int argX, int argY, int

31、argR); /* 圓的屬性 */ / 圓心 TPoint * centerP; / 半徑 int R;/* 對(duì)父類虛方法的實(shí)現(xiàn) */ 在目標(biāo)位圖上畫出圓 void draw(Graphics:TBitmap * argDest); / 在TTreeView中描述 void discript(int index, TTreeView * tree); / 返回描述用字符串 String discript(); / 判斷該圓是否與指定圖形相同 / 將指定圖形強(qiáng)制轉(zhuǎn)化為CCircle類型,比較其參數(shù)圓心坐標(biāo)和半徑,/ 若小于指定閾值,則返回Ture,否則返回False。 bool similarW

32、ith(CShape * argShape); / 合并同一圓上的兩個(gè)圓弧 / 若目標(biāo)圖形與該圖形屬同一圓,進(jìn)行合并,返回True;/ 否則返回False。 void mergeWith(CShape * argShape); / 判斷是否選擇該圓進(jìn)行編輯。 / 計(jì)算指定點(diǎn)(x, y)到圓心的距離,并與半徑比較,/ 如果小于指定閾值則返回True,否則False。 bool isClickOnShape(int x, int y); / 取得鼠標(biāo)形狀。 / 圓上點(diǎn)時(shí)返回水平的雙向箭頭形狀表示改變半徑;/ 圓心時(shí)返回垂直的四個(gè)方向箭頭的形狀表示移動(dòng) TCursor getCursor(int x

33、, int y); / 更新圓 bool update(int x, int y);4. 圖形容器類(CShapes)4.1 描述圖形容器類是圖形類的集合類,由C+ Builder的TList繼承得到。用來組織對(duì)圖像的識(shí)別結(jié)果、組織當(dāng)前編輯工作的圖形對(duì)象集。提供添加圖形、刪除圖形、圖形編輯等接口。4.2 實(shí)現(xiàn)class CShapes : public TList public: /* 初始化 */ CShapes(); / 從TreeView得到Shapes CShapes(TTreeView * tree); /在目標(biāo)位圖上畫出所有的圖形 void drawShapes(Graphics:

34、TBitmap * argDest); /描述圖形 void discript(TTreeView * tree);5. 點(diǎn)類(CPoint)5.1 描述點(diǎn)類對(duì)于與圖像上的前景點(diǎn)。由于識(shí)別時(shí)需要判斷是否為交點(diǎn),在一般的點(diǎn)的基礎(chǔ)上增加是否為交點(diǎn)的屬性。由C+ Builder的TPoint繼承得到。5.2 實(shí)現(xiàn)class CPoint : public TPoint public: /* 初始化 */ CPoint() isCrossPoint = false; ; CPoint(int argx, int argy, bool isCross); CPoint(int argx, int arg

35、y, Graphics:TBitmap * argImg); /* 屬性:是否為交點(diǎn) */ bool isCrossPoint;6. 單義域類(CSegment)6.1 描述在“基于單義域的圖形識(shí)別算法”中,單義域和多義域的唯一區(qū)別就是多義域不是單一的幾何元素,其在存儲(chǔ)結(jié)構(gòu)上是一樣的,在本系統(tǒng)中,都由CSegment類實(shí)現(xiàn),姑且命名為單義域類。單義域類為點(diǎn)的集合類,由C+ Builder的TList類繼承得到。提供添加點(diǎn)、刪除點(diǎn)、判斷該單義域是否有識(shí)別價(jià)值、識(shí)別該單義域等接口和方法。6.2 實(shí)現(xiàn)class CSegment : public TList public: /* 初始化 */ CS

36、egment(CPoint * p); /* 識(shí)別該單義域:實(shí)現(xiàn)算法中對(duì)單義域的識(shí)別部分 */ / 如果識(shí)別成功(得到圓或線段)返回True,否則返回False bool recognize(); /* 嘗試添加新的點(diǎn)到該單義域 */ / 判斷該點(diǎn)是否屬于該單義域并確定是在頭部還是在尾部,并將其插入到適當(dāng)位置;如果該點(diǎn)為交點(diǎn),則將相應(yīng)的方向關(guān)閉增長(zhǎng);若加入成功返回True,否則返回False。 bool addNewPoint(); /* 判斷該單義域是否有識(shí)別價(jià)值 */ / 如果該單義域含有的點(diǎn)數(shù)太少,則沒有價(jià)值返回False,否則返回True。 bool checkValue(); /*

37、屬性:識(shí)別出的圖形 */ CShape * shape;7. 基于單義域識(shí)別類(CSegments)7.1 描述基于單義域識(shí)別類是實(shí)現(xiàn)“基于單義域的直線和圓識(shí)別算法”的主要類。它實(shí)現(xiàn)了對(duì)目標(biāo)圖像的分割、對(duì)分割結(jié)果的顯示、對(duì)識(shí)別得到的多義域進(jìn)行分割、對(duì)單義域識(shí)別結(jié)果的總體考慮,最終得到識(shí)別結(jié)果集?;趩瘟x域識(shí)別類同時(shí)是單義域的集合類,由C+ Builder的TList類繼承得到。用來組織對(duì)圖像的單義域分割后的結(jié)果。7.2 實(shí)現(xiàn)class CSegments : public TList public: /* 構(gòu)造和析構(gòu)函數(shù) */ CSegments(); CSegments(); /* 掃描圖像

38、,得到多義域 */ / 從上往下,從左往右掃描圖像,對(duì)于每一個(gè)前景點(diǎn) / 1。生成新的CPoint實(shí)例 / 2。對(duì)于本類中的所有單義域,將該點(diǎn)嘗試加入 / 3。如果加入失敗,以該點(diǎn)為頭生成新的單義域并加入。 void segmentize(Graphics:TBitmap * argSrc); /* 在指定的位圖上顯示分割得到的多義域、單義域 */ void displaySegments(Graphics:TBitmap * argDes); /* 識(shí)別該集合中的元素 */ / 1。調(diào)用單義域的checkValue(),如果得到False,刪除該單義域; / 2。調(diào)用單義域的recogniz

39、e(),如果返回False,對(duì)該單義域進(jìn)行分割;/ 將新得到的2個(gè)單義域取代當(dāng)前的單義域,并進(jìn)行識(shí)別/ 3。所有的單義域識(shí)別完畢后,對(duì)各個(gè)單義域的識(shí)別結(jié)果進(jìn)行合并/ 4。返回得到的圖形容器類。 CShapes * recognize(); /* 刪除集合中的指定位置的元素 */ void removeItemOnly(int index); void removeItemAndFreePoints(int index);8. 霍夫變換識(shí)別直線類(CHTLine)8.1 描述實(shí)現(xiàn)霍夫變換識(shí)別直線算法。8.2 實(shí)現(xiàn)class CHTLine public: /* 構(gòu)造和析構(gòu)函數(shù) */ CHTLin

40、e (); CHTLine (); /* 對(duì)源位圖按照直線識(shí)別算法進(jìn)行霍夫變換 */ / argRho, argTheta分別是對(duì) r 和 q 的分割的份數(shù)。 void recognize(Graphics:TBitmap * argSource, int argRho, int argTheta); /* 在目標(biāo)位圖上顯示參數(shù)坐標(biāo)的信息 */ / 以參數(shù)坐標(biāo)的最大值為灰度最大值,按比例灰度在位圖上顯示。 void displayPramater(Graphics:TBitmap * argDest); /* 按照argRate指定的概率取得識(shí)別出的直線列表 */ void getLines(

41、TList * argList, double argRate);9. 霍夫變換識(shí)別圓類(CHTCircle)9.1 描述實(shí)現(xiàn)霍夫變換識(shí)別圓算法。9.2 實(shí)現(xiàn)class CHTCircle public: /* 構(gòu)造和析構(gòu)函數(shù) */ CHTCircle (); CHTCircle (); /* 對(duì)源位圖按照?qǐng)A的識(shí)別算法進(jìn)行霍夫變換 */ void recognize(Graphics:TBitmap * argRes); /* 在目標(biāo)位圖上顯示參數(shù)坐標(biāo)的信息 */ / 以參數(shù)坐標(biāo)的最大值為灰度最大值,按比例灰度在位圖上顯示參數(shù)坐標(biāo)中指定半徑的二維平面的數(shù)據(jù)。 void displayPramater(Graphics:TBitmap * argDest, int argR); /* 按照argRate指定的概率取得識(shí)別出的直線列表 */ void getCircles(TList * argList, double argRat

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論