標籤:文字檔 視窗 角度 其他 應用 span 運動控制 調用 靜態
有了前面的基礎後,我們來測試一下如何把程式做的更通用,首先是把初始化的方法修改一下,在初始化的時候傳遞過去HTuple這個對象(改成了全域的變數,以便於不同的方法調用)
?
其次需要有相機開啟/相機關閉,映像儲存/映像載入的功能(方便我們快速做測試),前面的相機操作已經講過了,這裡映像的載入也只是套用了前面的載入一個靜態映像的功能(把絕對位址改成了參數),儲存映像調用了Halcon的WriteImage方法
?
這個方法可以參考範例write_image的這個範例學習(看他匯出的C#的程式,稍微修改一下就行了)
?
此外為了防止程式退出的時候控制項還在運行導致的報錯,所以在表單關閉的時候需要把類的線程殺掉,那些變數都扔掉
?
如何把模板匹配的內容放過來?我們把範常式序產生的C#代碼定位到繪製特徵矩形的部分,基本可以照抄這部分內容(繪製矩形,產生矩形)
?
當然繪製完成之後會輸出矩形的很多參數,這些變數也要照抄產生的C#代碼,這些長寬高,圓周率,面積,角度基本都是HTuple類型,這個類型可以簡單理解為浮點數(有時候也表示-0255的byte,或者int等)
?
接下來就到了最重要的部分,其實就兩個函數,一個是建立模板,一個是匹配模板(產生的C#代碼中在for迴圈體內部還有一些函數,通過在Halcon執行可以發現他是讓圖片每次旋轉一定的角度然後看作是新的圖片,這個跟我們當前的項目沒有關係,所以只需要掌握這兩條函數即可)
?
Halcon的映像的處理是流程式的,比如A映像是原始映像,先做第一次處理得到B,再做第二次處理得到C,如此往下最後得到我們需要的映像部分。雖然我們不一定完全理解每一種影像處理演算法的具體意義,但是只要能理解他的流程會拿過來用即可(這個項目中他最後得到了ho_ImageReduced對象,輸出了模板匹配的hv_TempalteID對象)
?
如果你要加深Halcon每一行程式操作之後得到的變數的效果,還是回到Halcon的程式,你每一次F6單步之後可以定位到變數視窗,滑鼠放到產生的每一個變數上看他的提示(region是一種變數,image又是一種變數)
?
可以測試下運行結果,先繪製一個矩形框,然後右擊結束,確實可以得到X,Y,R,Error
?
那麼如何執行動態匹配呢(假如我們要讓相機不停的拍照,也不停的識別特徵並對外傳出座標),只要把這部分代碼放到死迴圈裡面就行了(還是要做全域的布爾值變數,只在確實模板得到了之後才執行,否則會報錯,你的TempalteID都沒有執行個體化),可以測試確實映像在動還是能始終得到數值
?
有一點常識要知道,預設水平是Y座標,垂直是X座標,左上方是[0,0]點。所謂的Error是0-255的數值(完全符合就是0,完全不匹配就是255),此外輸出的R是弧度(這些都可以自己測試發現,左邊是我用手完全遮擋畫面的效果,右圖是我把相機旋轉90度的效果,因為拍的是顯示器,顯示器不太好動)
?
最後我們再來看一個讀寫特徵匹配模板的功能(你不可能每一次都開啟相機-儲存映像-瀏覽圖形-設定特徵-得到特徵匹配ID-自動模式),我們肯定希望匹配了一次之後就把這個所謂的匹配ID儲存起來,下次可以直接載入自動運行。Halcon也確實有這樣一個範例提供了write_template和read_template方法(儲存的檔案沒有尾碼,名字叫做testt,這個有點奇怪,其實就是一個文字檔,2-3M左右大小)
?
有了前面的經驗之後,這裡可以直接複製產生的C#代碼,就一個WriteTempalte方法和ReadTempalte方法,很好理解(我之前寫的讀寫檔案方法都必須加類型,這裡為了統一起來,也為他設定一個txt的類型)
?
讀模數板的時候注意,函數的參數要帶ref,所謂的帶ref就是函數輸入的變數會被修改(詳細用法大家可以做幾個簡單的函數做測試,不帶ref是比較常用的,這裡如果不帶著類的執行個體的hv_TemplateID並不能得到修改,當然也可以用其他方法來實現)
?
總結:到此為止Halcon和C#的混合編程就介紹完畢了。在工業應用中涉及到演算法的東西(比像處理,運動控制)很少會用到C#作為最終的執行程式,因為效率比較低。但是這並不妨礙我們用C#作為上層的互動程式,調用別人開發好的DLL,實際上如果用C++來做上層,這些應用程式層的驗證,處理都會比C#麻煩的多。而在整個的影像處理演算法中,特徵匹配還是非常有用的,你可以把他當做字元識別來用(你摳一個字母A,然後找到映像中所有字母A),也可以作為Face Service來用(當匹配率低於多少就認為不是同一個人,或者匹配一張臉去掉映像中的這張臉,發現可能的雙胞胎之類的)。也可以當做瑕疵檢測來用(你摳一個正常產品的樣本圖片,然後拿著這個樣本比對不正常的東西,如果發現誤差超過某個數值就認為產品有問題,否則合格)讀者需要掌握:
1 常規的視覺系統的操作,基本的像素,二值化,曝光,特徵,匹配率的概念
2 Halcon的基本用法,理解優秀軟體的設計理念(尤其是這樣一種平台級的產品)
3 Halcon+C#的混合編程方法,理解C#最擅長的處理方法,在以後可能的項目中也嘗試這種混合編程的思路
?
?
更多教學視頻和資料下載,歡迎關注以下資訊:
我的優酷空間:
http://i.youku.com/acetaohai123
?
我的線上論壇:
http://csrobot.gz01.bdysite.com/
?
問題交流:
QQ:910358960
郵箱:[email protected]
?
?
C#應用視頻教程3.4 Halcon+C#測試