c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...
2.3.2 第二個(gè)halcon程序轉(zhuǎn)EXE程序:字符識(shí)別
老規(guī)矩,每一段halcon代碼得用C#二次開(kāi)發(fā)下。根據(jù)上一節(jié)所教的,我們配置下C#的環(huán)境,順便添加好控件,如下圖(2-3-2-1)。
圖 2-3-2-1
控件基本跟上一節(jié)一樣,只是少了一個(gè)button多了一個(gè)textBox。我就不用截圖教了。
圖 2-3-2-2
還是粗魯?shù)闹苯由洗a。圖中(2-3-2-2)①后面為聲明全局變量,用來(lái)存儲(chǔ)讀取的圖片;Form1_load里面的步驟②,可能新手有點(diǎn)迷糊,這其實(shí)是一種編程習(xí)慣了。(詳見(jiàn)本節(jié)TIPS 1)步驟③有兩個(gè)知識(shí)點(diǎn):第一個(gè)是c#的,就是用OpenFileDialog類(lèi),該類(lèi)的作用是顯示一個(gè)標(biāo)準(zhǔn)的對(duì)話框,用于打開(kāi)文件。當(dāng)然對(duì)于我們這個(gè)例子,你也只能打開(kāi)我給的那張照片,畢竟其它照片就不一定適用于剩下的代碼了。適用方法就是如圖中紅筆標(biāo)明的第③步了,首先是實(shí)例化一個(gè)ofd,然后if()條件語(yǔ)句判斷,接下來(lái)你就可以在readImage()里面用ofd.FileName來(lái)表示圖片的地址了。有沒(méi)有比上一節(jié)用個(gè)string類(lèi)型的path寫(xiě)地址高大上一丟丟?
關(guān)鍵是這個(gè)方法可以打開(kāi)任何一張圖片,算是比較靈活的打開(kāi)文件的方式了。當(dāng)然百度上還有更詳細(xì)的教程,如果你有興趣,不妨查查看。
第二個(gè)知識(shí)點(diǎn)就是,你讀取的圖片大小跟你的halconWindow大小不匹配怎么辦,你得讓圖片矢量縮放。這個(gè)上一節(jié)的時(shí)候我刻意沒(méi)講解,怕知識(shí)點(diǎn)太多。現(xiàn)在教剛好,就是圖中我畫(huà)圈的兩步。先獲取圖片的大小:GetImageSize(),里面的參數(shù)根據(jù)提示通俗易懂,再SetPart(): set the part of the image that is displayed in the graphics window。對(duì),就是這個(gè)意思,所以你只要把上一步獲得的長(zhǎng)寬作為全部尺寸SetPart就可以了。當(dāng)然有個(gè)需要注意的細(xì)節(jié):GetImageSize的時(shí)候參數(shù)順序是先寬再高,SetPart的時(shí)候參數(shù)順序是先高再寬,比如本例中。可是為什么呢?因?yàn)樽鴺?biāo),自己悟去吧~~^_^
接下來(lái)是大頭,OCR的識(shí)別,雙擊"OCR識(shí)別"按鈕,在里面敲下如下代碼,你若牛13,最好先根據(jù)上一節(jié)教的方法,自己先試試,這樣帶著問(wèn)題看答案會(huì)效果超級(jí)好,我的答案如下圖(2-3-2-3):
圖2-3-2-3
按照TIPS 1)里面的方法,我們先為所有的圖形變量申請(qǐng)一個(gè)空變量。就是圖中(2-3-2-3)矩形里面的一大坨。然后每個(gè)變量用之前先dispose,就是圖中橢圓里面的。
圖2-3-2-4
圖 2-3-2-5
程序結(jié)束,所有的圖形變量再dispose掉,如圖中的矩形框內(nèi)。熟悉了這個(gè)大的結(jié)構(gòu)形式,下面我們來(lái)看具體的代碼。Halcon代碼2.3.1里面已經(jīng)有了,怎么轉(zhuǎn)換,我也第二節(jié)里面說(shuō)過(guò),如果還要我廢話,那這本書(shū)得厚很多倍。
不過(guò)有個(gè)地方,還是需要提一下的:就是本代碼,我在halcon里面的時(shí)候是識(shí)別出字符然后在字符上方一定位置顯示出來(lái),這里面我沒(méi)有那么做了,而是用textbox控件顯示出來(lái)。那就涉及到一個(gè)問(wèn)題,怎么把HTuple類(lèi)型的classs(因?yàn)閏lass是C#的關(guān)鍵字,不能作為變量名使用,所以我加了一個(gè)s,你沒(méi)有意見(jiàn)吧?)里面的字符弄出來(lái)。對(duì)的,答案已經(jīng)在上圖(2-3-2-5)中了,就是一個(gè)for循環(huán)。不過(guò)所有對(duì)HTuple 的操作方法都是'.Tuple+~',比如說(shuō)它的長(zhǎng)度是'.TupleLength()',不是c#自帶數(shù)組里面的'.Length()',然后就是HTuple每一個(gè)成員的調(diào)用方法'.TupleSelect()'。當(dāng)然還有很多其它方法,你可以'.'之后自己看,也都有自帶解釋。(又是一個(gè)打漁方法,有木有?)
有了上一節(jié)的halcon程序轉(zhuǎn)exe的鋪墊,這一節(jié)好講解多了,雖然代碼長(zhǎng)了不少,但是總共也就幾頁(yè)紙就可以說(shuō)清楚了,其實(shí)主干部分還是蠻有規(guī)律可尋的。
親愛(ài)的讀者,當(dāng)你學(xué)習(xí)到這一節(jié)。其實(shí)整個(gè)視覺(jué)項(xiàng)目的軟件部分的主要流程你都大致了解了。只要是基于halcon和C#二次開(kāi)發(fā)的,基本上是脫離不了這個(gè)主框架。什么主框架呢?有點(diǎn)懵?好吧。。
第一步:獲取圖片,一般都是通過(guò)相機(jī)現(xiàn)場(chǎng)拍照,保存下來(lái);
第二步:用halcon對(duì)照片進(jìn)行圖像處理,達(dá)到目的(比如例子中的找到人臉,或者識(shí)別字符等);
第三步:把halcon代碼轉(zhuǎn)成C#代碼(大多數(shù)情況下是作為一個(gè)類(lèi)或者一個(gè)方法),可以自己一步一步轉(zhuǎn),也可以直接用halcon自己生成的方式(這個(gè)我在2.2.2有講,網(wǎng)上有更詳細(xì)的教程)。
寫(xiě)完這一節(jié),現(xiàn)在已經(jīng)是2018年2月份的某個(gè)晚上。聽(tīng)著毛不易的《像我這樣的人》,不自禁情緒涌上心頭。。。今年我就28周歲了,依舊碌碌無(wú)為。想做一些事,總是覺(jué)得缺把火。喜歡的女同事也一直刻意跟我保持距離。這女孩特別愛(ài)笑,眼睛也好看。同事教我三招:1)堅(jiān)持;2)不要臉;3)堅(jiān)持不要臉。
話是這么說(shuō),但是真的好難做到,總感覺(jué)她對(duì)我愛(ài)答不理,我也不想死皮賴臉,更覺(jué)得死皮賴臉會(huì)適得其反,畢竟大家都是同事。
親戚中也有人勸我,不要眼光太高,找個(gè)差不多的就可以了。這意思再明白不過(guò):我的能力配不上我的眼光。可是為什么非要我降低眼光呢?我不能提升能力嗎?最近在看一本書(shū)知乎大神李栩然的《所有的奮斗都是一種不甘平凡》。哈哈,聽(tīng)名字就是雞湯文。但是生活嘛,你有多久沒(méi)喝過(guò)雞湯了?隔段時(shí)間拿個(gè)雞湯文鞭笞下自己對(duì)我來(lái)說(shuō)還是挺有意義的。畢竟"最怕你一生碌碌無(wú)為,還安慰自己平凡可貴"……
本節(jié)TIPS:
1) 本人寫(xiě)過(guò)很多halcon代碼,然后自動(dòng)生成C#代碼(方法上一節(jié)有說(shuō),別跟我說(shuō)你忘記了)。再慢慢學(xué)習(xí)這些C#代碼后,發(fā)現(xiàn)了一個(gè)規(guī)律:所有的圖形變量(HObject,HImage,HRegion等)都是先聲明,再為其申請(qǐng)一個(gè)空變量,每次用之前先dispose(),程序結(jié)束再dispose()。這樣的好處是肯定不會(huì)有內(nèi)存泄漏,這個(gè)問(wèn)題上一節(jié)我刻意沒(méi)提,換言之上一節(jié)代碼有內(nèi)存泄漏的缺陷,這樣的缺陷,單次運(yùn)行是沒(méi)有什么關(guān)系的,但是一旦運(yùn)用到工程上,往往都是循環(huán)執(zhí)行的,每次內(nèi)存泄漏一點(diǎn)兒,積少成多,一會(huì)兒系統(tǒng)就崩潰了。因此這一節(jié)開(kāi)始,我們按照規(guī)范的來(lái)。(其實(shí),當(dāng)我再檢查的時(shí)候,發(fā)現(xiàn)本例我的代碼里面其實(shí)也還有變量沒(méi)有被dispose。哈哈,機(jī)智的你發(fā)現(xiàn)沒(méi)有?)
那么,有的人會(huì)疑問(wèn),為什么要先申請(qǐng)空變量呢?其實(shí)是因?yàn)?#xff0c;halcon代碼自動(dòng)轉(zhuǎn)成C#代碼的時(shí)候,一般方法里面都會(huì)加上try-catch語(yǔ)句,一旦運(yùn)行報(bào)錯(cuò),在catch里面也可以把所有的變量dispose()掉,避免內(nèi)存泄漏,如果沒(méi)有之前申請(qǐng)的空變量,報(bào)錯(cuò)后,就不知道怎么dispose()了。所以都在try-catch語(yǔ)句之前先為聲明的所有圖形變量(HObject,HImage,HRegion等)申請(qǐng)一個(gè)空變量。這個(gè)大家多寫(xiě)幾次就能理解了。
總結(jié)
以上是生活随笔為你收集整理的c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最新古风的男生网名大全105个
- 下一篇: c#设计12星座速配软件_C#设计模式(