halcon-fuse.hdev

* fuse.hdev: measuring the width of a fuse wire
* 
dev_update_window ('off')
dev_close_window ()
* ****
* step: acquire image
* ****
read_image (Fuse, 'fuse')
get_image_size (Fuse, Width, Height)
dev_open_window_fit_image (Fuse, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 12, 'Courier', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Fuse)
set_display_font (WindowID, 12, 'courier', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: create measure object
* ****
* -> specify ROI
Row := 297
Column := 545
Length1 := 90
Length2 := 10
Angle := rad(90)
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
* -> create measure object
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
dev_display (ROI)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: measure
* ****
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: visualize results
* ****



for i := 0 to |RowEdgeFirst|-1 by 1
    
    row1:= [-sin(Angle+rad(90))*Length2+RowEdgeFirst[i], -sin(Angle-rad(90))*Length2+RowEdgeFirst[i]]
    column1:=[cos(Angle+rad(90))*Length2+ColumnEdgeFirst[i], cos(Angle-rad(90))*Length2+ColumnEdgeFirst[i]]
    
    row2:=[-sin(Angle+rad(90))*Length2+RowEdgeSecond[i], -sin(Angle-rad(90))*Length2+RowEdgeSecond[i]]
    column2:=[cos(Angle+rad(90))*Length2+ColumnEdgeSecond[i], cos(Angle-rad(90))*Length2+ColumnEdgeSecond[i]]
    
    gen_contour_polygon_xld (EdgeFirst, row1, column1)
    gen_contour_polygon_xld (EdgeSecond, row2, column2)
    
    dev_set_color ('cyan')
    dev_display (EdgeFirst)
    dev_set_color ('magenta')
    dev_display (EdgeSecond)
    dev_set_color ('blue')
    if (i = 0)
        set_tposition (WindowID, RowEdgeFirst[i] + 5, ColumnEdgeFirst[i]+20)
    else
        set_tposition (WindowID, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i]+20)
    endif
    write_string (WindowID, 'width: '+IntraDistance[i]+' pix')
endfor
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: destroy measure object
* ****
close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()

重要函数解析:
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
产生一个矩形,以便用于显示gen_measure_rectangle2的处理范围

gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
产生的这个矩形框将作为感兴趣区域
Prepare the extraction of straight edges perpendicular to a rectangle.

measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
第4个参数阈值比较重要
|

其中各点坐标
A:RowEdgeFirst[0],ColumnEdgeFirst[0]
A':RowEdgeSecond[0],ColumnEdgeSecond[0]

B:RowEdgeFirst[1],ColumnEdgeFirst[1]
B':RowEdgeSecon[1],ColumnEdgeSecond[1]

C:RowEdgeFirst[2],ColumnEdgeFirst[2]
C':RowEdgeSecond[2],ColumnEdgeSecond[2]




本例需要的是保险丝的宽度,即IntraDistance


gen_contour_polygon_xld (EdgeFirst, row1, column1)
本例是根据两点坐标产生一个轮廓EdgeFirst,比如row1=[1,2],column=[11,12],则产生的直线的首尾坐标是(1,11)和(2,12)


本例基本步骤:
1.输入灰度图像
2.gen_measure_rectangle2,划定ROI
3.measure_pairs.在ROI内测量边缘对
posted on 2012-09-03 22:05  _song  阅读(495)  评论(0编辑  收藏  举报