模板匹配_定位_同步测量

发布于 2021-09-14 06:26

本文介绍一下工业中常用的模板匹配+定位+测量的手法,即先对物料创建模板,实时运行时根据模板去找到定位物料,然后根据模板与被测点或者位置的仿射变换关系,对不同方向的物料进行实时测量。

*从图像助手读入图像

list_files('C:/Users/ZHANG/Desktop/zjf/board', ['files','follow_links'], ImageFiles)

tuple_regexp_select(ImageFiles,['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'],ImageFiles)

read_image (Image, ImageFiles[0])//选取一张供创建模板测量的标准图片

gen_rectangle1 (ROI_0, 194.55,162.835, 297.479, 440.566)//选取模板定位区域,此处是新建ROI助手

reduce_domain (Image, ROI_0,ImageReduced)

create_shape_model (ImageReduced,'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

get_shape_model_contours(ModelContours, ModelID, 1)

rectR1:=-106//从模板中心往测量矩形1中心Row的偏移量

rectR2:=106//从模板中心往测量矩形2中心Row的偏移量

rectC:=2//两个测量矩形列相对于模板中心列的偏移量

rectLength_W:=165//测量矩形的半高- ->可借助新ROI获得区域的坐标信息

rectLength_H:=7//测量矩形的半宽

for Index := 0 to |ImageFiles| - 1 by1

read_image (Image, ImageFiles[Index])

get_image_size (Image, Width, Height)

find_shape_model (Image, ModelID, 0, rad(360), 0.5, 0, 0.5,'least_squares', 5, 0.9, Row, Column, Angle, Score)

dev_display (Image)

for Index1:=0 to |Row|-1 by 1

vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)

affine_trans_contour_xld (ModelContours, ContoursAffineTrans,HomMat2D)//先定位,将模板变换过来

*跟随(仿射变换) 测量矩形1

hom_mat2d_identity (HomMat2DIdentity)

hom_mat2d_translate(HomMat2DIdentity,Row+rectR1,Column+rectC, HomMat2DTranslate1)//先平移

hom_mat2d_rotate(HomMat2DTranslate1,Angle,Row,Column,  HomMat2DRotate1)//再旋转,还是绕模板中心旋转

affine_trans_point_2d (HomMat2DRotate1, 0, 0, RowNew1, ColumnNew1)

*affine_trans_pixel(HomMat2DRotate, rectR, rectC, RowTrans, ColTrans)

 *测量矩形2  

hom_mat2d_translate(HomMat2DIdentity,Row+rectR2,Column+rectC, HomMat2DTranslate2)

hom_mat2d_rotate(HomMat2DTranslate2,Angle,Row,Column,  HomMat2DRotate2)

affine_trans_point_2d (HomMat2DRotate2, 0, 0, RowNew2, ColumnNew2)     gen_rectangle2(Rectangle1,RowNew1,ColumnNew1,Angle,rectLength_W,rectLength_H)   gen_rectangle2(Rectangle2,RowNew2,ColumnNew2,Angle,rectLength_W,rectLength_H)

 *以上述产生的矩形作为测量矩形

gen_measure_rectangle2 (RowNew1, ColumnNew1, Angle, rectLength_W, rectLength_H,Width, Height, 'nearest_neighbor', MeasureHandle1)

gen_measure_rectangle2(RowNew2,ColumnNew2,Angle, rectLength_W,rectLength_H, Width, Height, 'nearest_neighbor', MeasureHandle2)

 *此处获得了边的中心行/列坐标,边缘对宽度,边缘对间距,供计算使用

measure_pairs (Image, MeasureHandle1, 1, 119, 'all', 'all',RowEdgeFirst1, ColumnEdgeFirst1,AmplitudeFirst1,RowEdgeSecond1,ColumnEdgeSecond1, AmplitudeSecond, IntraDistance1, InterDistance1)

measure_pairs(Image,MeasureHandle2,1,154,'all','all', RowEdgeFirst2,ColumnEdgeFirst2,AmplitudeFirst2,RowEdgeSecond2, ColumnEdgeSecond2,AmplitudeSecond1, IntraDistance2, InterDistance2)           sumPins:=|IntraDistance1|+| IntraDistance2|

ave:=mean(sum(IntraDistance1)+sum(IntraDistance2))

dev_set_draw ('margin')

dev_set_line_width (2)

dev_display (Rectangle1)

dev_display (Rectangle2)

dev_get_window (WindowHandle)

*显示:测量矩形1

disp_line(WindowHandle,RowEdgeFirst1rectLength_H*cos(Angle),ColumnEdgeFirst1-rectLength_H*sin(Angle),RowEdgeFirst1+rectLength_H*cos(Angle),ColumnEdgeFirst1+rectLength_H*sin(Angle))

disp_line(WindowHandle,RowEdgeSecond1rectLength_H*cos(Angle),ColumnEdgeSecond1-rectLength_H*sin(Angle),RowEdgeSecond1+rectLength_H*cos(Angle),ColumnEdgeSecond1+rectLength_H*sin(Angle))

 *测量矩形2

disp_line(WindowHandle,RowEdgeFirst2-rectLength_H*cos(Angle),ColumnEdgeFirst2-rectLength_H*sin(Angle),RowEdgeFirst2+rectLength_H*cos(Angle),ColumnEdgeFirst2+rectLength_H*sin(Angle))

disp_line(WindowHandle,RowEdgeSecond2-rectLength_H*cos(Angle),ColumnEdgeSecond2-rectLength_H*sin(Angle),RowEdgeSecond2+rectLength_H*cos(Angle),ColumnEdgeSecond2+rectLength_H*sin(Angle))

gen_contour_polygon_xld (Contour, [RowEdgeFirst1,RowEdgeSecond1],[ColumnEdgeFirst1,ColumnEdgeSecond1])

gen_contour_polygon_xld (Contour, [RowEdgeFirst2,RowEdgeSecond2],[ColumnEdgeFirst2,ColumnEdgeSecond2])    

concat_obj (Contour, Contour, Contour)

disp_message (WindowHandle, 'Pins数量'+sumPins, 'Image', 0, 0, 'red', 'true')

disp_message (WindowHandle, 'Pins平均宽度'+ave, 'Image', 30, 0, 'red', 'true')

close_measure (MeasureHandle1)

close_measure (MeasureHandle2)

endfor

endfor

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材