###### tags: `halcon`
### 基本使用方法
#### 找範例程式
>瀏覽HDevelop範例程序:
>

---
#### 認識視窗:
1. 圖形視窗 : 執行後顯示圖像結果
>點擊右鍵 -> '工具' -> '特徵檢視'=>查看圖形特徵值
點擊右鍵 -> '工具' -> '灰階直方圖',也可以直接點上方
灰階直方圖可取得圖形的值(上、下限,為分割欲取得區域),若是彩色則有RGB三個曲線
補充 : Region的圖形沒有灰階直方圖
在<範圍選擇和程式碼生成>的地方有一個圖像打叉的標誌要打開

2. 運算元視窗 : 查看運算元、輸入輸出等參數

>進階並行化選項:
輸入=>直接添加程式碼至程式視窗
說明=>了解此運算元功能
3. 變數視窗 : 有程式碼內分別的圖像內容、詳細變數值
>對圖片點擊右鍵 -> '消除/顯示'=>單獨對圖形顯示在圖形視窗
控制變數可以看到變數細項

4. 程式視窗 : 程式編寫
>打上程式碼後,若下一行不知道適合的指令可以下甚麼可直接按tab鍵(會給予使用者常在此行之後打的參數),同等於'建議' -> '後置計算'
'前置計算'則一定要透過'建議'的路徑


---
### 讀取多張影像
>讀取多張影像,直接將資料夾拉近程式視窗中,並點擊插入影像

---
### 查看目前所用到的運算元屬於甚麼模組
>'檔案' -> '屬性' -> '使用模組'

---
### 校正
>說明視窗72.2.2
'輔助' -> '開啟新檔calibration' -> 校正 -> '載入' -> 品質問題 -> 輸出結果(平均誤差,px越小越好) -> 程式碼產生



---
### 範例: 找二維碼
```
*載入二維碼圖片
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)
```

---
### 範例: 找出點點
>使用拖拉資料夾=>一次匯入多個影像
在倒數第二行加入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
```

---
### 範例: 找出某圖形(此次找出圖中蛋狀圖形)
```
*載入影像
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)
```

---
### OCR
* 傳統OCR與Deep OCR區別:
>傳統有角度問題(例如方向旋轉、6/9)、有字靠太近的問題、沒法辨識詞彙
Deep OCR沒角度問題(可透過一串字判斷方向,若一串字都是6跟9,可能也是不行,需要其他文字)、可以一次辨識詞彙或句子、缺點是不能辨識單一文字
* 傳統OCR-
>'輔助' -> '開啟新檔OCR' -> 設定 -> 2.框框 -> 3.輸入框內文字 -> 4.有符合就勾 -> 5.應用快速設定 -> 結果 -> 程式碼輸出
補充:
切割=>內容不要動比較好
字型=>可以改,<預先訓練的分類器>內若有Rej表示,如果不像訓練好的類別不要顯示,若是NoRej則會硬擠一個最像的顯示。

* 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, [], [])
```

---
### 梯度轉量度 邊緣化
>可點程式視窗中參數右鍵->'顯示程序在新標籤'->看副程式(做甚麼用的)
```
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
```

---
### 範例: 攝影機
>'輔助' -> '開啟影像Image Acquisition' -> 來源 -> File -> 程式碼產生 -> '插入程式碼'

```
* 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)
```

---
### 範例: 取mean值的例題參考
>找範例程序 rank.n
