今天有个网友问到这个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
勇哥另外一篇找线的贴子:
勇哥收罗了一下halcon的边缘检测和线条检测算子如下,供各位参考:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

