今天有个网友问到这个add_metrology_object_line_measure算子没有角度参数,怎么做roi跟随。
勇哥网站上搜索了一下,还真没有写过这样的贴子,因此制作了一个小例子,给有需要的朋友参考。
代码比较简单。
用了形态模板匹配来定位roi位置。第一张图用来定义了模板。
中间那几个变量 a,b,c,d,e,f,g,h是roi四个边的顶点。
那一部分代码实际上的作用是:
已知rectangle2的中心坐标与length1,length2,求出rectangle2的四个顶点坐标位置,这里用了三角函数来计算。
这部分知识请参考勇哥写的贴子《halcon中求rectangle2矩形的四个顶点坐标》
dev_close_window()
file:=['F:/1112233.bmp','F:/2222.bmp']
mRow:=3050
mCol:=1856
mAng:=0
for Index1 := 0 to 1 by 1
read_image(Image, file[Index1])
dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle)
get_image_size(Image, Width, Height)
disp_obj(Image, WindowHandle)
if(Index1=0)
disp_rectangle2(WindowHandle, mRow,mCol, mAng, 700,1720)
gen_rectangle2(Rectangle, mRow,mCol, mAng, 700, 1720)
reduce_domain(Image, Rectangle, ImageReduced)
create_shape_model(ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
write_shape_model(ModelID, 'shape1.shm')
endif
read_shape_model('shape1.shm', ModelID1)
find_shape_model(Image, ModelID1, -0.39, 0.79, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score)
get_shape_model_contours(ModelContours, ModelID1, 1)
vector_angle_to_rigid(0, 0, 0, Row1, Column1, Angle, HomMat2D)
hom_mat2d_scale(HomMat2D,1,1, Column1, Row1, HomMat2DScale)
affine_trans_contour_xld(ModelContours, ContoursAffineTrans, HomMat2DScale)
disp_obj(ContoursAffineTrans, WindowHandle)
ang:=deg(Angle)
disp_circle(WindowHandle, Row1, Column1, 64)
dev_set_color('blue')
dev_set_draw('margin')
len1:=500
len2:=1120
gen_rectangle2(Rectangle1, Row1, Column1, Angle, len1, len2)
disp_obj(Rectangle1, WindowHandle)
newRow:=Row1
newCol:= Column1
newAngle:= Angle
hom_mat2d_identity(homMat2D)
hom_mat2d_rotate(homMat2D,newAngle, Row1, Column1, homMat2D)
hom_mat2d_translate(homMat2D, newRow, newCol, homMat2D)
create_metrology_model(MetrologyHandle)
set_metrology_model_image_size(MetrologyHandle, Width, Height)
tuple_cos (newAngle, Cos)
tuple_sin (newAngle, Sin)
dev_set_color('red')
a:= -len1*Cos - len2*Sin
b := -len1*Sin + len2*Cos
gen_cross_contour_xld(Cross1, newRow-b, newCol+a, 56, newAngle)
c := len1*Cos - len2*Sin
d := len1*Sin + len2*Cos
gen_cross_contour_xld(Cross2, newRow-d, newCol+c, 56, newAngle)
e:= len1*Cos + len2*Sin
f := len1*Sin - len2*Cos
gen_cross_contour_xld(Cross3, newRow-f, newCol+e, 56, newAngle)
g := -len1*Cos + len2*Sin
h := -len1*Sin - len2*Cos
disp_line(WindowHandle, newRow-h, newCol+g, newRow-b, newCol+a)
beginx:=newRow-h
beginy:= newCol+g
endx:= newRow-b
endy:=newCol+a
add_metrology_object_line_measure(MetrologyHandle, beginx,beginy ,endx , endy, 20, 5, 1, 30, [], [], Index)
set_metrology_object_param(MetrologyHandle,'all','measure_transition','all')
set_metrology_object_param(MetrologyHandle,'all','measure_select','all')
set_metrology_object_param(MetrologyHandle,'all','measure_threshold',30)
set_metrology_object_param(MetrologyHandle,'all','measure_sigma',1)
set_metrology_object_param(MetrologyHandle,'all','measure_length1',30)
set_metrology_object_param(MetrologyHandle,'all','measure_length1',435)
set_metrology_object_param(MetrologyHandle,'all','num_measures',50)
set_metrology_object_param(MetrologyHandle,'all','min_score',0.4)
apply_metrology_model(Image,MetrologyHandle)
get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row, Column)
dev_set_color('green')
dev_display(Contours)
dev_set_color('red')
radiusAry:=[]
for i := 0 to |Row|-1 by 1
radiusAry[i]:=14.0
endfor
disp_circle(WindowHandle,Row, Column, radiusAry)
clear_metrology_object(MetrologyHandle, 'all')
clear_metrology_model(MetrologyHandle)
stop()
endfor
勇哥另外一篇找线的贴子:
http://www.skcircle.com/?id=120
勇哥收罗了一下halcon的边缘检测和线条检测算子如下,供各位参考:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

