模板匹配_定位_同步测量
发布于 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 我们将第一时间删除。
相关素材