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