Halcon一日一練:獲取孔位


本例程是用於獲取安裝螺絲孔在圖像中對應的坐標位置,並顯示該坐標位,如上圖所示。

read_image(Image,'rim.png')//讀取圖像
dev_close_window()//關閉窗口
get_image_size(Image, Width, Height)//獲取圖像大小
dev_open_window(0,0,Width/1, Height/1, 'blue', WindowHandle)
dev_display(Image)
threshold(Image, Regions, 25, 121)//對圖像進行二值化處理
connection(Regions, ConnectedRegions)//將區域進行分開
 

 

dev_clear_window()//清除窗口
dev_set_draw('margin')//顯示區域的填充方式(不填充)
dev_set_line_width(3)//設置區域顯示框的線寬
dev_display(Image)
area_center(SelectedRegions,Area, Rows, Columns)//獲取孔的面積和中心坐標
index:=|Rows|//獲取孔的數量

*依次對指定孔進行坐標顯示
for i:= 0 to (index-1) by 1
    messagex:=''+'孔的坐標為:'+Rows[i]
    messagey:=''+'孔的坐標為:'+Columns[i]
    disp_message(WindowHandle, messagex+messagey, 'window', 0, 0, 'blue', 'true')//顯示坐標孔
    disp_message(WindowHandle, i+1, 'image', Rows[i]-15, Columns[i]-10, 'red', 'false')//指定孔
    stop()//暫停
    
endfor

通過上面的代碼,我們先把初始圖像和已經獲取的對應坐標的圖像顯示出來,並把對應的四個空坐標顯示在圖像窗口的左上角,這樣能夠更加直觀的表達我們所做的工作。

 

在這里,我們需要注意幾個技巧,當我們的代碼寫到下面這句時:

threshold(Image, Regions, 25, 121)//對圖像進行二值化處理

該語句對圖像進行二值化分割操作,將需要的圖像區域通過灰度區間范圍的方式進行分割操作,其分割對應的值范圍為25-121灰度區間。我們通過打開灰度直方圖對話框能夠看到,圖像中不同灰度對應的直方圖顯示器對應的數量。

二值化處理過程中,我們如何來設置圖像的灰度門檻值呢,在這里我們可以通過HDevelop系統中的灰度直方圖,我可以在工具欄,會顯示灰度直方圖,這時我們對閥值前面按鍵按下讓其顯示打勾,我們在閥值列表會將圖像的灰度排列值以直方圖的形式顯示出來,我們將鼠標拉動閥值線就可以改變灰度閥值,圖中25為閥值的下限,121為上限。

閥值區間線的調整,能夠改變圖像二值化的上下限閥值,該值能夠實時的觀察圖像的二值化分割區間,調整該線的位置,圖像的灰度值區間將根據值而變化,通過這種辦法,能夠實時的觀察我們所需要的區間。

在拉動閥值線的過程中,我們可以觀察圖像的變化,會看到根據區間的變化,圖像中顯示的區域也隨之變化,通過多次調節,我們就能夠獲取四個孔獨立的顯示出來。這個時候,我們認為這就是我們想要的閥值,這個時候我們可以點擊插入代碼按鍵,並關閉閥值處理前面的按鍵,使其為紅色的打叉狀態,我們就可以回到程序編輯器中,繼續編寫我們的代碼。

 

另外一句代碼是在區域對進行選擇的時候,我們要對區域的特征進行篩選,我們是通過選擇孔所對應的區域來提取區域的四個孔,這個時候我們要如何操作呢?

select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1600, 6000)//選擇孔面積大小的區域

對應的孔的面積我們是不知道的,我們現在設置的是1600到6000個像素位,可是如何獲取這個像素的區間呢,我們現在打開菜單工具欄中的按鍵,會跳出特征檢測對話框,我們可以通過調節該對話框來快速的設置區域的屬性,並設置我們想要的閥值。

這個時候我們在特征選擇中選擇Region,在其下列選擇框依次選擇basic和area,說明我們要對區域的基本屬性進行提取,當然我們現在是要對區域數組中提取孔的面積,所以我們現在只要在connection函數分離的變量Regions區域數組中提取對應的孔,我們通過鼠標選取四個孔,每選取一個孔,我們在特征檢測對話框中會發現area的值會顯示出來,他們依次是5147,1633,4616,1600個像素位數,這個時候我們可以將select_shape最小區域滿足在1600至5147之間,當前我們可以適當的修正這兩個值,以獲得最佳區間范圍,而不至於提取了我們不該提取的區域。

這種操作你會發現我們能夠快速的找到對應的面積區域,從而准確的提取我們想要的四個孔,剩下的工作就是獲取該四個孔的區域中心位置,area_cente函數幫助我們提取了四個孔的面積和坐標,並以數組的形式顯示在變量窗口中,我們發現我們提取了四個孔,同時也獲得了對應的四個坐標位置,接下來的就是如何把這四個孔的數據顯示出來。

 

程序使用了循環語句

for i:= 0 to index-1 by 1
...

stop()
endfor

在例子中我們使用了一個循環操作,循環體是由for打頭,endfor結束,我們采用|Rows|來獲取數組的個數,數組的第一個數據是由0開始,所以我們必須以|Rows|-1開始,顯示的數據信息是指定對應孔的坐標,這個數據信息我們先進行整合:

 messagex:=''+'孔的坐標為:'+Rows[i]
 messagey:=''+'孔的坐標為:'+Columns[i]

即messagex變量代表了孔對應的row坐標數據,messagey變量代表了孔對應的column坐標數據,最后我們在圖像的左上角(0,0代表了左右)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM