發表文章

目前顯示的是有「Halcon」標籤的文章

[Halcon] [Tip] Halcon 記憶體無法釋放 Note!

天呀~這真的是一個漫長的找蟲時刻! 日以繼夜的跑~跑~跑~ 就是為了看到問題之所在呀~ 最後壓縮到...是利用Halcon函式來檢查條碼的區域有問題。 只要掠過檢查條碼的區段,記憶體就乖乖的在原地徘徊... 反之...記憶體就會一階一階的往上爬~直到爆炸為止呀! 爆炸後...系統就整個hang了,做啥都沒效...只能重開機了。 如果有類似問題,可以測試以下方式: 1.針對大圖像手動的去執行 Reset() 。   確認Halcon有釋放大型的圖像資源。 2.每次執行檢測結束時,手動呼叫 GC :   System::GC::Collect();   System::GC::WaitForPendingFinalizers();   用以確認.NET程式有做釋放資源的動作。 3.檢查是否有未釋放的資料...   是否有new了,但是沒有delete的狀況。 4.確認做大量運算的影像是否為 單一通道 。   這次就是因為這一個問題啦...把三通道的影像改為單一通道後,記憶體狀況就很好。   由於不知道Halcon內部是如何清除記憶體的,所以,可以的話,盡量餵資料量較少的影像進去囉! 感謝我親愛的同事~繼續加油測試呀!GOGO~ 連續測試跑片了15小時之後,發現還是會記憶體上漲拉!只是可以撐比較久!天呀!應該還有其他問題! 2013-11-31 更新: 最後發現是因為Halcon中的某一參數設定導致。大致用意是對Halcon運算元做多執行緒的處理,當將此參數關閉,就可以消除這個問題,但是運算速度會變慢一點... 但是不當機最大,先用這個solution吧!

[Halcon] [ImageProcess] Dilation / Erosion 膨脹與侵蝕

圖片
Dilation / Erosion 在我目前實作中,滿常使用到的。 因為取得的區域,並不是每塊區域都是完美無瑕,所以需要Dilation / Erosion的方式來做校正。 Dilation (膨脹): 可以用來讓區域邊緣變得較平滑,可濾掉較小的凹區域。因為區域膨脹的關係,整體的區域會變大。 dilation1 ( Region , StructElement : RegionDilation : Iterations : ) dilation_circle ( Region : RegionDilation : Radius : ) dilation_rectangle1 ( Region : RegionDilation : Width , Height : ) 上頭一些函式,主要是輸入圓半徑做膨脹、利用輸入方形長寬做膨脹、利用另一個區域來做膨脹等... Erosion (侵蝕): 可以用來讓區域邊緣變得較平滑,可濾掉較小的凸區域。因為區域侵蝕的關係,整體的區域會變小。有時可能會將區域切割成許多小區域。 erosion1 ( Region , StructElement : RegionErosion : Iterations : ) erosion_circle ( Region : RegionErosion : Radius : ) erosion_rectangle1 ( Region : RegionErosion : Width , Height : ) 上頭一些函式,主要是輸入圓半徑做侵蝕、利用輸入方形長寬做 侵蝕 、利用另一個區域來做 侵蝕 等... 另外也有函式是將這兩種觀念組合起來應用: Opening   : 先侵蝕、後膨脹 opening ( Region , StructElement : RegionOpening : : )  opening_circle ( Region : RegionOpening : Radius : ) opening_rectangle1 ( Region : RegionOpening : Width , Height : ) ex:  opening_circ...

[.NET][Halcon] 如何使用Halcon .NET元件

圖片
使用Halcon一般會先在他的視覺化界面中測試。 開發完成後也有方法可以在Visual Studio環境中直接顯示Halcon的結果,可以讓客端直接知道跑的結果,然後去做調整。 在Visual Studio中,.NET的環境下可使用上Halcon開發的halcondotnet.dll。 (若使用xl版,則用halcondotnetxl.dll) 依照VS的版本不同,可至相對應路徑下尋找dll檔案來使用。 Visual Studio 2005 -> .NET Framework 2.0 Visual Studio 2008 -> .NET Framework 3.5 分別至%HALCONROOT%\bin\dotnet20及%HALCONROOT%\bin\dotnet35底下尋找dll。 無論是VB.NET/ C#.NET/ C++ .NET都可使用。 只是語法上有稍稍的不相同,但大抵上使用方法都是一致的。 1. 將halcon的Graphic元件放置到Visual Studio的工具箱中以便使用。 - 對工具箱點選右鍵 - 選擇Choose Items... - 用來選擇要添加的工具或控制項 或者上頭工具/選擇工具箱項目,也可進入添加。 2. 選擇Toolbox選項。可添加或刪除客製的元件或控制項。 - 選擇Browse,瀏覽資料夾選擇要添加的控制項。 - 選擇halcondotnet.dll添加HWindowControl控制項 3. 多了一個HWindowControl的.NET Framework Component,確定有勾選就按OK即可。 4. 即可在工具箱中,多出一個HWindowControl的控制項,用來顯示Halcon相關的圖檔影像。 用此控制項就可以開始在Visual Studio環境中直接顯示影像、Region等... (使用此控制項中的HalconWindow下的HWindow來顯示物件), 其用法相似PicutreBox...  

[Halcon] 自灰階直方圖取得需要的門檻

圖片
一般在使用門檻值找需要的區域時, 會使用 bin_threshold 方式, 來 自動 尋找需要的門檻值. 但是若是亮度分布不均時, bin_threshold就會切出一道奇妙的神秘區域了... 就是不正確的區域囉~! 一般使用時它會自 灰階分布圖 中自動找尋適當的門檻值. 但若值的偏離度太大...就會找出不適當的區域來使用... 這樣一來, 後續的動作就可能會有錯囉! 需要的話可以使用: get_image_size (ImagePart, Width, Height) gen_rectangle1(rect, 0, 0, Width, Height) gray_histo (rect, ImagePart, AbsoluteHisto, RelativeHisto) histo_to_thresh (RelativeHisto, 2, MinThresh, MaxThresh) 他會至Image影像上的rect區域中找到區段性的由 小至大 排列的門檻值. 此時可參考這些值, 找出適當的來使用. **若找白區(使用偏大的Index) threshold (ImagePart, Region, MinThresh[5], MaxThresh[length-1]) **若找黑區(使用偏小的Index) threshold (ImagePart, Region, MinThresh[0], MaxThresh[0]) Note: 灰階直方圖可自[視覺化->灰階直方圖]中點選, 就可直接看到目前影像的灰階資料.          打勾二值化會將結果直接顯示在影像上, 反之則不會.

[Halcon] 字串、字元 <-> HTuple

若有需要將平時寫程式常會用到的字串、字元轉換為Tuple用到Halcon的運算元時,該如何轉換呢?欲知字串、字元 V.S. Halcon Tuple的轉換詳情...請仔細看一下去... HTuple -> char*: HTuple DecodedDataStrings,Ords; HTuple len=0; char c[500]; //假設DecodedDataStrings中取得了字串型別的HTuple //要如何將HTuple轉換一般可用的為char指標? //1. 將字串HTuple轉換為ASCII的HTuple tuple_ords(DecodedDataStrings, &Ords);   //由於一個ASCII代表一個字元, 所以此刻可以用tuple_length取得目前字元陣列的長度 tuple_length(Ords, &len);   //2. 有值時, 則可以將資料轉換為char指標 if (len > 0) { tuple_chrt(Ords, ( char *)c); //將Ords(ASCII字元HTuple)轉為char指標c //亦可將其再轉換為String^ s=%String(c); } char* –> HTuple char c[500]; //ASCII字元 (1 Byte) wchar_t wc[500]; //UNICODE寬字元 (2 Byte) //假設一字元指標或字元陣列想將其值輸入到HTuple中 //要如何將字元指標或陣列轉換其Halcon運算元可用的HTuple呢? //1. 將字串指標傳入HTuple即可 HTuple(( char *)&c[0]); //也等同於HTuple((char*)c); //當字元指標屬於char或unsigned char時可直接轉換至ASCII HTuple wchar_t* –> HTuple HTuple t, Ords; char wcc[500]; //若字元指標屬於寬字元的指標(wchar_t)時就要注意會產生exception. //所以試了一下,...

[Halcon] Barcode 讀取 (1)

Halcon是一家德國提供影像處理軟體的公司,有提供許多運算元可以讓使用者直接就可以對影像或CCD進行操作。 下面是要介紹Halcon裡面和Barcode相關的簡易運算元: 1.  create_bar_code_model ( : : GenParamNames , GenParamValues : BarCodeHandle ) 用於建立一個Barcode模組,以供檢查或設定Barcode的運算元( find_bar_code...等 )來使用。 2.  find_bar_code ( Image : SymbolRegions : BarCodeHandle ,  : DecodedDataStrings ) 在一張影像中偵測並讀取Barcode的訊號值。利用給予的影像物件( Image )、指定的編碼型態( CodeType )、指定的Barcode模組( BarCodeHandle )來取得並輸出判斷的結果回傳Barcode所在的範圍位置( SymbolRegions )跟解碼後的資料字串( DecodedDataStrings )。 底下是從Halcon範例中擷取的一小段code: //為讀取Barcode創建一模組BarCodeHandle,前頭兩個參數可以用來添加此模組的參數。 create_bar_code_model ([], [], BarCodeHandle) read_image (Image, 'barcode/code39/code39'+(I$'.2')) //用於設定模組的參數,為了更能適應目前影像上的Barcode,此參數" element_size_max "、" element_size_mim "用於設定此模組尋找每一條bar或空格間最大、最小的寬度。若條碼很大張,則需要將 " element_size_max " 設大點。 set_bar_code_param (BarCodeHandle, 'element_size_max', 6) //開始尋找條碼型態為 Code 39 的條碼,並將結果輸出至SymbolRegions、DecodedDataStrings中。 find_...