目标:在一组图片中,每一张都要显示两个圆的圆心距离
效果图
其中黄色字体从左右往右分别对应两个圆,从上往下分别是圆心的横纵坐标、圆直径(直径已经转换成了mm单位)
原图
解题思路
先随便用什么方法初步定位到圆,
然后创建模板,
之后进行模板匹配,注意查找模板的时候查找数量的参数改为2;
用测量工具精准定位圆,由于是两个圆,所以要用到循环,定义一个j来循环仿射变换,(里面的坐标值注意不要搞错了)
然外面来个大循环,循环这个文件夹里面的所有图片
代码
dev_open_window(0, 0, 900,700, 'black', WindowHandle)
read_image(Image,'C:/Users/Administrator/Documents/Viewer Data/Data/apicture/11.BMP')
dev_set_draw('margin')
*提取轮廓
draw_circle(WindowHandle, Row, Column, Radius)
gen_circle(Circle, Row, Column, Radius)
area_center(Circle, Area, Row5, Column5)
reduce_domain(Image, Circle, ImageReduced)
edges_sub_pix(ImageReduced, Edges, 'canny', 1, 15, 35)
*创建模板
create_shape_model(ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
find_shape_model(ImageReduced, ModelID, -0.39, 0.78, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score)
*循环图片
list_image_files ('C:/Users/Administrator/Documents/Viewer Data/Data/apicture', 'default', [], ImageFiles1)
tuple_length (ImageFiles1, Length)
for Index := 0 to Length - 1 by 1
read_image (Image, ImageFiles1[Index])
*查找模板 每张图有两个圆
find_shape_model(Image, ModelID, rad(-180), rad(180), 0.5, 2, 0.5, 'least_squares', 0, 0.9, Row2, Column2, Angle2, Score1)
*因为每张图有两个圆
for j:=0 to |Score1| -1 by 1
dev_display_shape_matching_results(ModelID, 'red', Row2, Column2, Angle2, 1, 1, 0)
*仿射变换 形成矩阵的数据一个是原始的 一个是找到的模板的
vector_angle_to_rigid(Row5, Column5, 0, Row2[j], Column2[j], Angle2[j], HomMat2D)
affine_trans_contour_xld(Edges, ContoursAffinTrans, HomMat2D)
*卡尺工具
create_metrology_model(MetrologyHandle)
*都是用的找到的模板的数据Column2, Row2 对应到不同图片
affine_trans_point_2d(HomMat2D, Column2, Row2, Qx, Qy)
add_metrology_object_circle_measure(MetrologyHandle, Row2[j], Column2[j], Radius, 20, 5, 1, 30, [], [], Index1)
apply_metrology_model(Image, MetrologyHandle)
get_metrology_object_result(MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row3, Column3)
gen_cross_contour_xld(Cross, Row3, Column3, 2, Angle)
gen_contour_polygon_xld(Contour, Row3, Column3)
*拟合圆
fit_circle_contour_xld(Contour, 'algebraic', -1, 0, 0, 3, 2, Row4, Column4, Radius1, StartPhi, EndPhi, PointOrder)
gen_circle(Circle1, Row4, Column4, Radius1)
area_center(Circle1, Area1, Row6, Column6)
if ( j = 0)
dev_display (Circle1)
*显示圆心坐标 以及直径
disp_message (WindowHandle, [Row6,Column6,Radius*2*3.45*2/1000], 'window',100, 100, 'yellow', 'false')
R0:=Row6
C0:=Column6
Radius0:=Radius
else
dev_display (Circle1)
disp_message (WindowHandle, [Row6,Column6,Radius*2*3.45*2/1000], 'window',200, 200, 'yellow', 'false')
R1:=Row6
C1:=Column6
Radius1:=Radius
endif
endfor
stop()
*距离计算
distance_pp (R0, C0, R1, C1, Distance)
*距离像素转化为mm
D:=Distance*3.45*2/1000
disp_message(WindowHandle, D, 'window', 550, 150, 'red', 'false')
stop()
endfor
注意事项:检测到的图中显示的数值都是像素为单位,所以一般我们要进行转换。
Radiusx2x3.45x2/1000 Radius 单位是像素 3.45是的单位值um