發表文章

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

[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...

[CCD] Line Scan V.S. Area Scan

圖片
Line scan和Area scan有以下不同之處: 1. 感光元件(Sensor)型式不同。 2. 取像作動的需求及結果不同。 Line scan ,感光元件會使用Linear CCD Sensor線型的感光元件。一次只可拍攝可視範圍內的 一條線 。若要拍攝整張影像,需要搭配機台運動控制(固定CCD移動欲拍之物體或乘載物體之托盤/ 固定欲拍之物體移動CCD)、利用Trigger、磁性尺或光學尺來確認要拍攝的影像比例、長度是否正確; Area scan ,感光元件會使用Array Sensor陣列型的感光元件。只要直接曝光取像就可以取得在可視範圍內的 一塊面積 影像,拍攝時機台不需特別作動。若欲拍攝物體過大,會分批檢測或者會多次拍攝後做軟體接圖的動作再做檢查的動作。 參考網址: http://www.icpdas.com/products/Vision/mavis/vision_glossary_a~m_c.htm http://www.adlinktech.com/big5/solution/tech_forum.php?file=measure/20050816.htm

[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_...