###### tags: `halcon` ### 基本使用方法 #### 找範例程式 >瀏覽HDevelop範例程序:![](https://hackmd.io/_uploads/B1S7WICKn.png) > ![](https://hackmd.io/_uploads/rJEtcT0Yh.png) --- #### 認識視窗: 1. 圖形視窗 : 執行後顯示圖像結果 >點擊右鍵 -> '工具' -> '特徵檢視'=>查看圖形特徵值 點擊右鍵 -> '工具' -> '灰階直方圖',也可以直接點上方![](https://hackmd.io/_uploads/rkwfLLAKn.png) 灰階直方圖可取得圖形的值(上、下限,為分割欲取得區域),若是彩色則有RGB三個曲線 補充 : Region的圖形沒有灰階直方圖 在<範圍選擇和程式碼生成>的地方有一個圖像打叉的標誌![](https://hackmd.io/_uploads/By5UppRtn.png)要打開 ![](https://hackmd.io/_uploads/SyHxwU0K3.png) 2. 運算元視窗 : 查看運算元、輸入輸出等參數 ![](https://hackmd.io/_uploads/Hy09TaCK2.png) >進階並行化選項: 輸入=>直接添加程式碼至程式視窗 說明=>了解此運算元功能 3. 變數視窗 : 有程式碼內分別的圖像內容、詳細變數值 >對圖片點擊右鍵 -> '消除/顯示'=>單獨對圖形顯示在圖形視窗 控制變數可以看到變數細項 ![](https://hackmd.io/_uploads/SJHEyACKn.png) 4. 程式視窗 : 程式編寫 >打上程式碼後,若下一行不知道適合的指令可以下甚麼可直接按tab鍵(會給予使用者常在此行之後打的參數),同等於'建議' -> '後置計算' '前置計算'則一定要透過'建議'的路徑 ![](https://hackmd.io/_uploads/SkNt1AAFn.png) ![](https://hackmd.io/_uploads/Hywc10AFh.png) --- ### 讀取多張影像 >讀取多張影像,直接將資料夾拉近程式視窗中,並點擊插入影像 ![](https://hackmd.io/_uploads/ryUWEvAY2.png) --- ### 查看目前所用到的運算元屬於甚麼模組 >'檔案' -> '屬性' -> '使用模組' ![](https://hackmd.io/_uploads/rJ0opUAt2.png) --- ### 校正 >說明視窗72.2.2 '輔助' -> '開啟新檔calibration' -> 校正 -> '載入' -> 品質問題 -> 輸出結果(平均誤差,px越小越好) -> 程式碼產生 ![](https://hackmd.io/_uploads/SJoBHC0K2.png) ![](https://hackmd.io/_uploads/Bky_HRRF2.png) ![](https://hackmd.io/_uploads/HJXKHCCFn.png) --- ### 範例: 找二維碼 ``` *載入二維碼圖片 read_image (Image, 'C:/Users/PM_AIOT/AppData/Roaming/MVTec/HALCON-22.11-Progress/examples/images/datacode/ecc200/ecc200_contrast_variations_01.png') *創建二維碼模型 create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'maximum_recognition', DataCodeHandle1) *找二維碼 find_data_code_2d (Image, SymbolXLDs, DataCodeHandle1, [], [], ResultHandles, DecodedDataStrings) ``` ![](https://hackmd.io/_uploads/rk6IR8CKn.png) --- ### 範例: 找出點點 >使用拖拉資料夾=>一次匯入多個影像 在倒數第二行加入stop(),看每一張影像,沒有添加只會看到最後一張 找群聚參數-侵蝕與膨脹 1.gray_opening_shape 2.gray_closing_shape 3.opening_circle-給region使用 4.closing_circle-給region使用 ``` * Image Acquisition 01: Code generated by Image Acquisition 01 list_files ('C:/Users/PM_AIOT/Desktop/DC', ['files','follow_links','recursive'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[Index]) * Image Acquisition 01: Do something *模糊化 mean_image (Image, ImageMean,33, 33) *後項減前項並輸出 sub_image (Image, ImageMean, ImageSub, 1, 128) *找出點點 threshold (ImageSub, Regions, 100, 110) *聚集點點 closing_circle (Regions, RegionClosing, 50) *分割每一個點點 *connection (Regions, ConnectedRegions) *加入可以看到每一張,沒加只看的到最後一張 stop() endfor ``` ![](https://hackmd.io/_uploads/rJGCIYRFn.png) --- ### 範例: 找出某圖形(此次找出圖中蛋狀圖形) ``` *載入影像 read_image (Image, 'printer_chip/printer_chip_01') *滿足條件取出影像 threshold (Image, Regions, 143, 255) *將每個元件都分開 connection (Regions, ConnectedRegions) *利用面積找想要的元件 select_shape (ConnectedRegions, aa, 'area', 'and', 2500, 3500) *利用圓找想要的元件 select_shape (aa, SelectedRegions, 'circularity', 'and', 0.344682-0.02, 0.344682+0.02) ``` ![](https://hackmd.io/_uploads/ry1pBFCY2.png) --- ### OCR * 傳統OCR與Deep OCR區別: >傳統有角度問題(例如方向旋轉、6/9)、有字靠太近的問題、沒法辨識詞彙 Deep OCR沒角度問題(可透過一串字判斷方向,若一串字都是6跟9,可能也是不行,需要其他文字)、可以一次辨識詞彙或句子、缺點是不能辨識單一文字 * 傳統OCR- >'輔助' -> '開啟新檔OCR' -> 設定 -> 2.框框 -> 3.輸入框內文字 -> 4.有符合就勾 -> 5.應用快速設定 -> 結果 -> 程式碼輸出 補充: 切割=>內容不要動比較好 字型=>可以改,<預先訓練的分類器>內若有Rej表示,如果不像訓練好的類別不要顯示,若是NoRej則會硬擠一個最像的顯示。 ![](https://hackmd.io/_uploads/H1p86ACYh.png) * Deep OCR- >可觀察 控制變數=>DeepOCRResult ``` read_image (Image, 'C:/Users/PM_AIOT/AppData/Roaming/MVTec/HALCON-22.11-Progress/examples/images/fonts/arial_a7.png') create_deep_ocr ([], [], DeepOcrHandle) apply_deep_ocr (Image, DeepOcrHandle, [], DeepOcrResult) dev_get_window (WindowHandle) dev_display_deep_ocr_results (Image, WindowHandle, DeepOcrResult, [], []) ``` ![](https://hackmd.io/_uploads/ryKWfky9n.png) --- ### 梯度轉量度 邊緣化 >可點程式視窗中參數右鍵->'顯示程序在新標籤'->看副程式(做甚麼用的) ``` read_image (Image, 'printer_chip/printer_chip_01') *邊緣偵測 * laplace_of_gauss (Image, ImageLaplace, 2) *edges_sub_pix (ImageLaplace, Edges, 'canny', 1, 20, 40) *edges_image (ImageLaplace, ImaAmp, ImaDir, 'canny', 1, 'nms', 20, 40) *純抓參數 calculate_lines_gauss_parameters (12, 7, Sigma, Low, High) *檢測刮痕、線條 lines_gauss (Image, Lines, 1.5, 3, 8, 'light', 'true', 'bar-shaped', 'true') ``` --- ### 範例: 找出刮痕 ``` * Image Acquisition 03: Code generated by Image Acquisition 03 list_files ('C:/Users/PM_AIOT/Desktop/SM', ['files','follow_links','recursive'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[Index]) * Image Acquisition 03: Do something *純抓參數,看控制變數 calculate_lines_gauss_parameters (35, 50, Sigma, Low, High) *檢測刮痕、線條,輸入剛剛看到的控制變數 lines_gauss (Image, Lines, 10, 0.05, 0.15, 'light', 'true', 'bar-shaped', 'true') stop() endfor ``` ![](https://hackmd.io/_uploads/HkXPItRth.png) --- ### 範例: 攝影機 >'輔助' -> '開啟影像Image Acquisition' -> 來源 -> File -> 程式碼產生 -> '插入程式碼' ![](https://hackmd.io/_uploads/rypqmy1qn.png) ``` * Image Acquisition 03: Code generated by Image Acquisition 03 open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Integrated Camera', 0, -1, AcqHandle) grab_image_start (AcqHandle, -1) while (true) grab_image_async (Image, AcqHandle, -1) * Image Acquisition 03: Do something *拆成三個通道,給RGB decompose3 (Image, Image1, Image2, Image3) trans_from_rgb (Image1, Image1, Image1, ImageResult1, ImageResult2, ImageResult3, 'hsv') dev_display (ImageResult2) endwhile close_framegrabber (AcqHandle) ``` ![](https://hackmd.io/_uploads/SyKG9YAKn.png) --- ### 範例: 取mean值的例題參考 >找範例程序 rank.n ![](https://hackmd.io/_uploads/SkcpstAKh.png)