Halcon 圓測量與直線測量


read_image (Image, 'test.bmp')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
draw_circle (WindowHandle, Row, Column, Radius)
*【輸入】
StartRow:=Row1
StartCol:=Column1
EndRow:=Row2
EndCol:=Column2
*卡尺寬度
RuleWidth:=40
*卡尺高度
RuleHeight:=1
*卡尺閾值
RuleThd:=5
*卡尺間隔
RuleSpace:=2
*搜索模式
RuleMode:='negative'
*點選擇
RuleSeleP:='all'
*【輸出】
LineRow0:=0
LineCol0:=0
LineRow1:=0
LineCol1:=0
PointRows:=[]
PointCols:=[]

MeasureLine (Image, Contours, Rectangle, StartRow, StartCol, EndRow, EndCol, RuleWidth, RuleHeight, RuleSpace, RuleThd, RuleSeleP, RuleMode, PointRows, PointCols, LineRow0, LineCol0, LineRow1, LineCol1)

MeasureCircle (Image, Contours, Row, Column, Radius, RuleWidth, RuleHeight, RuleSpace, RuleThd, RuleSeleP, RuleMode, PointRows, PointCols, CircleRow, CircleCol, CircleRad)

*顯示
dev_display (Image)
dev_display (Rectangle)
dev_set_color ('spring green')
dev_display (Contours)
dev_set_color ('orange')
gen_cross_contour_xld (Cross, PointRows, PointCols, 6, 0.785398)
dev_set_color ('red')
gen_circle_contour_xld (ContCircle, CircleRow, CircleCol, CircleRad, 0, 6.28318, 'positive', 1)
gen_contour_polygon_xld (Contour, [LineRow0,LineRow1], [LineCol0,LineCol1])
main
*直線測量
create_metrology_model (MetrologyHandle)
add_metrology_object_line_measure (MetrologyHandle, StartRow, StartCol, EndRow, EndCol, 100, 20, 1, 30, [], [], Index)
*搜索寬度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索間隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*邊緣閾值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*邊緣選擇
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*過度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*對圖像進行測量
apply_metrology_model (Image, MetrologyHandle)
*測量點
get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
*測量直線
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row_begin', 'column_begin', 'row_end', 'column_end'], Parameter)
*外圍矩形
angle_lx (StartRow, StartCol, EndRow, EndCol, Angle)
length1:=sqrt((StartCol-EndCol)*(StartCol-EndCol)+(StartRow-EndRow)*(StartRow-EndRow))
gen_rectangle2 (Rectangle, (StartRow+EndRow)/2, (StartCol+EndCol)/2, Angle, length1/2, RuleWidth)
LineRow0:=Parameter[0]
LineCol0:=Parameter[1]
LineRow1:=Parameter[2]
LineCol1:=Parameter[3]
return ()
MeasureLine
*圓測量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, 20, 5, 1, 30, [], [], Index)
*搜索寬度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索間隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*邊緣閾值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*邊緣選擇
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*過度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*對圖像進行測量
apply_metrology_model (Image, MetrologyHandle)
*測量點
get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
*測量圓
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
CircleRow:=Parameter[0]
CircleCol:=Parameter[1]
CircleRad:=Parameter[2]
return ()
MeasureCircle

 

set_system ('clip_region', 'false')

*圓測量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, 20, 5, 1, 30, [], [], Index)
*搜索寬度 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索間隔 int
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*邊緣閾值 byte
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*邊緣選擇 first last
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*過度方式 positive negative
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*對圖像進行測量
apply_metrology_model (Image, MetrologyHandle)
*測量圓
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
if (|Parameter|=3)
    *獲取多個找圓矩形小輪廓和邊緣點
    get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
    *邊緣點的十字標
    gen_cross_contour_xld (Cross, PointRows, PointCols, 5, 0)
    *圓心的十字標
    gen_cross_contour_xld (CrossCenter, Parameter[0], Parameter[1], 10, rad(45))
    *擬合的圓輪廓
    gen_circle_contour_xld (ContCircle, Parameter[0], Parameter[1], Parameter[2], 0, 6.28318, 'positive', 1)
endif
*測量點

clear_metrology_model (MetrologyHandle)
新版圓測量
set_system ('clip_region', 'false')

*直線測量
create_metrology_model (MetrologyHandle)
add_metrology_object_line_measure (MetrologyHandle, StartRow, StartCol, EndRow, EndCol, 100, 20, 1, 30, [], [], Index)
*搜索寬度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length1', RuleWidth)
*有效搜索高度
set_metrology_object_param (MetrologyHandle, Index, 'measure_length2', RuleHeight)
*搜索間隔
set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', RuleSpace)
*邊緣閾值
set_metrology_object_param (MetrologyHandle, Index, 'measure_threshold', RuleThd)
*邊緣選擇
set_metrology_object_param (MetrologyHandle, Index, 'measure_select',RuleSeleP)
*過度方式
set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', RuleMode)
*對圖像進行測量
apply_metrology_model (Image, MetrologyHandle)
*測量圓
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row_begin', 'column_begin', 'row_end', 'column_end'], Parameter)
if (|Parameter|=4)
    *獲取多個找邊緣點矩形小輪廓和邊緣點
    get_metrology_object_measures (Contours, MetrologyHandle, Index, RuleMode, PointRows, PointCols)
    *邊緣點的十字標
    gen_cross_contour_xld (Cross, PointRows, PointCols, 5, 0)
    *擬合的圓輪廓
    gen_contour_polygon_xld (ContLine, [Parameter[0],Parameter[2]], [Parameter[1],Parameter[3]])
    *生成直線的中心及角度
    centerRow:=(Parameter[0]+Parameter[2])/2
    centerCol:=(Parameter[1]+Parameter[3])/2
    angle_lx (Parameter[0], Parameter[1], Parameter[2], Parameter[3], Angle)
endif
*測量點

clear_metrology_model (MetrologyHandle)
新版直線測量

 

set_system ('clip_region', 'false')

tuple_length (Row, Length)

*圓測量
create_metrology_model (MetrologyHandle)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, RuleWidth, RuleHeight, 1, RuleThd, ['min_score'], [0.35], Index)
*搜索間隔 int
set_metrology_object_param (MetrologyHandle, 'all', 'measure_distance', RuleSpace)
*邊緣選擇 first last
set_metrology_object_param (MetrologyHandle, 'all', 'measure_select',RuleSeleP)
*過度方式 positive negative
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', RuleMode)
*對圖像進行測量
apply_metrology_model (Image, MetrologyHandle)

*測量圓
Parameter:=[]
gen_empty_obj (Contours)
gen_empty_obj (Cross)
gen_empty_obj (CrossCenter)
gen_empty_obj (ContCircle)
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', ['row', 'column', 'radius'], Parameter)
if (|Parameter|>=3)
    for Index2 := 0 to Length-1 by 1
        *獲取多個找圓矩形小輪廓和邊緣點
        get_metrology_object_measures (tempContours, MetrologyHandle, Index2, 'all', PointRows, PointCols)
        *邊緣點的十字標
        gen_cross_contour_xld (tempCross, PointRows, PointCols, 5, 0)
        *圓心的十字標
        gen_cross_contour_xld (tempCrossCenter, Parameter[Index2*3+0], Parameter[Index2*3+1], 50, rad(45))
        *擬合的圓輪廓
        gen_circle_contour_xld (tempContCircle, Parameter[Index2*3+0], Parameter[Index2*3+1], Parameter[Index2*3+2], 0, 6.28318, 'positive', 1)
        concat_obj (tempContours, Contours, Contours)
        concat_obj (tempCross, Cross, Cross)
        concat_obj (tempCrossCenter, CrossCenter, CrossCenter)
        concat_obj (tempContCircle, ContCircle, ContCircle)
    endfor
else
    for Index1 := 0 to Length-1 by 1
        *獲取多個找圓矩形小輪廓和邊緣點
        get_metrology_object_measures (tempContours, MetrologyHandle, Index1, 'all', PointRows, PointCols)
        *邊緣點的十字標
        gen_cross_contour_xld (tempCross, PointRows, PointCols, 5, 0)
        *最小二乘法擬合圓
        FitCircle(PointRows, PointCols,tempParameter)
        if (|tempParameter|=3)
            *圓心的十字標
            gen_cross_contour_xld (tempCrossCenter, tempParameter[0], tempParameter[1], 50, rad(45))
            *擬合的圓輪廓
            gen_circle_contour_xld (tempContCircle, tempParameter[0], tempParameter[1], tempParameter[2], 0, 6.28318, 'positive', 1)
        endif
        concat_obj (tempContours, Contours, Contours)
        concat_obj (tempCross, Cross, Cross)
        concat_obj (tempContCircle, ContCircle, ContCircle)
        tuple_concat (tempParameter, Parameter, Parameter)
    endfor
endif
*測量點

clear_metrology_model (MetrologyHandle)
圓測量
Parameter[0]:=-999.999
Parameter[1]:=-999.999
if (|RowList|<=3 or |ColList|<=3 or |RowList|!=|ColList|)
    return()
endif
sum_x := 0.0
sum_y := 0.0
sum_x2 := 0.0
sum_y2 := 0.0
sum_x3 := 0.0
sum_y3 := 0.0
sum_xy := 0.0
sum_x1y2 := 0.0
sum_x2y1 := 0.0
tuple_length(ColList,N)
for i := 0 to N-1 by 1
    assign (RowList[i], x)
    assign (ColList[i], y)
    assign (x*x, x2)
    assign (y*y, y2)
    assign (sum_x+x, sum_x)
    assign (sum_y+y, sum_y)
    assign (sum_x2+x2, sum_x2)
    assign (sum_y2+y2, sum_y2)
    assign (sum_x3+x2*x, sum_x3)
    assign (sum_y3+y2*y, sum_y3)
    assign (sum_xy+x*y, sum_xy)
    assign (sum_x1y2+x*y2, sum_x1y2)
    assign (sum_x2y1+x2*y, sum_x2y1)
endfor
C:=0
D:=0
E:=0
G:=0
H:=0
a:=0
b:=0
c:=0
C:=N * sum_x2 - sum_x * sum_x
D:= N * sum_xy - sum_x * sum_y
E:= N * sum_x3 + N * sum_x1y2 - (sum_x2 + sum_y2) * sum_x
G:= N * sum_y2 - sum_y * sum_y
H:= N * sum_x2y1 + N * sum_y3 - (sum_x2 + sum_y2) * sum_y
a:= (H * D - E * G) / (C * G - D * D)
b:= (H * C - E * D) / (D * D - G * C)
c:= -(a * sum_x + b * sum_y + sum_x2 + sum_y2) / N
Parameter[0]:=a/(-2)
Parameter[1]:=b/(-2)
Parameter[2]:=sqrt(a * a + b * b - 4 * c)/2
圓測量中的FitCircle

 


免責聲明!

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



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