1. 程式人生 > >halcon學習筆記(2)——clip例子學習(直方塊圖和特徵直方塊圖)

halcon學習筆記(2)——clip例子學習(直方塊圖和特徵直方塊圖)

    例子在HDevelop自帶例子裡面,叫clip;這裡講我實驗的內容,機械視覺目的:檢測照片中影象,標記中心位置及其方向,程式碼如下:

dev_update_window ('off')
read_image (Image, 'E:/test2.jpg')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width , Height, 'black', WindowID)
dev_display (Image)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
threshold (Image, Regions, 49, 95)
connection (Regions, Regions)
select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)
dev_set_draw ('fill')
dev_set_colored (12)
dev_display (SelectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_display (Image)
dev_set_color ('green')
dev_display (SelectedRegions)
orientation_region (SelectedRegions, Phi)
area_center (Regions, Area, Row, Column)
dev_set_line_width (3)
dev_set_draw ('margin')
Length := 80
for i := 0 to |Phi| - 1 by 1
    dev_set_color ('blue')
    disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)
    disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')
endfor

         這是原始圖,找了張白紙自己記號筆畫的,然後用手機拍的照片。

         

        結果影象如上圖。

        下面一步一步說程式碼:

dev_update_window ('off')

這句如字面意思,就關閉視窗圖形的重新整理

read_image (Image, 'E:/test2.jpg')

這句也如字面,讀取影象,可以在運算元視窗輸入,然後在filename開啟圖片所在位置,點選確定即可直接插入上面的程式,運算元視窗如下:


get_image_size (Image, Width, Height)

如字面意思,獲取影象的尺寸;

dev_close_window ()

dev_open_window (0, 0, Width , Height, 'black', WindowID)

dev_display (Image)

set_display_font (WindowID, 14, 'mono', 'true', 'false')

disp_continue_message (WindowID, 'black', 'true')

stop ()

上面這幾句也如字面意思,主要是視窗顯示的樣式及訊息提醒什麼的(比如按F5繼續等),寫程式也可執行,視窗會預設顯示步驟;

threshold (Image, Regions, 49, 95)

這句很重要,是灰度直方塊圖的閾值運算元,這個一定要點選灰度直方塊圖命令來輸出,你可以通過調節閾值範圍來去除不需要的圖形和干擾,如下圖中右圖裡,紅色90的那條線就是,就是灰度閾值範圍在0-90之間,調節時候右圖回隨著閾值變化而變化,記得點插入程式碼上面“閾值”前面有個小圖示,這個是實時顯示的,不然你調時候右圖不會重新整理,調到你滿意然後點選插入程式碼就可以,如上面的程式碼:


connection (Regions, Regions)

這句寫就可以了,如字面計算連通域的命令,是為了特徵直方塊圖做準備的;

select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)

這句是特徵直方圖的程式碼,灰度直方圖一樣,不用寫,在特徵直方圖中調出即可,樣式如下圖:


dev_set_draw ('fill')

dev_set_colored (12)

dev_display (SelectedRegions)

disp_continue_message (WindowID, 'black', 'true')

stop ()

dev_display (Image)

dev_set_color ('green')

dev_display (SelectedRegions)

上面語句也是介面顯示的,可以按F1檢視幫助,這裡不贅述了

orientation_region (SelectedRegions, Phi)

這句是計算圖形方向的運算元,Phi是角度,計算方法是計算圖形長寬比例,長方向,窄邊為方向向量;

area_center (Regions, Area, Row, Column)

這句是計算圖形中心的運算元

dev_set_line_width (3)

線寬

dev_set_draw ('margin')

畫斜線

Length := 80

線長

for i := 0 to |Phi| - 1 by 1

    dev_set_color ('blue')

    disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)

    disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')

endfor

這句是迴圈以圖形中心劃線,畫箭頭,並在中心位置標記角度的文字

        怎麼樣,是不是比opencv簡單明瞭,當然opencv也可以做到,找到對應的相關函式和運算元,然後按照這個思路程式設計就好,就是到了直方塊圖時候就比較麻煩。