* find_aniso_shape_model 这个例子展示了如何使用HALCON的 shape-base(形状基础) 匹配方式
* 去寻找SMD电容元器件, 这些SMD电容元器件在具有10位深度的图像(类型为uint2的图像)中在行和列方向上呈现独立的尺寸变化。
*
dev_update_off ()
dev_close_window ()
*
* 为了能够可视化显示, 我们指定uint2图像中有效位的数量。
* 之所以这样做是因为信息不能够存储在图像文件自身中
*设置格式
set_system ('int2_bits', 10)
*读取图片
read_image (Image, 'smd/smd_capacitors_01')
*获取图片的宽度和高度
get_image_size (Image, Width, Height)
*打开一个窗口适应并显示读取的图片
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
*设置字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*显示关于本工程的信息
Message := 'This program shows how to use shape-based matching'
Message[1] := 'to find SMD capacitors that exhibit independent'
Message[2] := 'size changes in the row and column direction in'
Message[3] := 'images with a depth of 10 bits.'
Message[4] := 'First a synthetic model for the SMD capacitors'
Message[5] := 'is created. In the next step the created model'
Message[6] := 'is used to find the SMD capacitors.'
*显示信息
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
*显示“按F5继续运行”信息
disp_continue_message (WindowHandle, 'black', 'true')
*程序会在这里停止
stop ()
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置颜色
dev_set_color ('green')
*设置线宽
dev_set_line_width (3)
* 为SMD电容器创建一个合成模型。这里就只是一个圆角矩形。
*根据多边形角点创建一个XLD轮廓
gen_contour_polygon_rounded_xld (Contour, [50,100,100,50,50], [50,50,150,150,50], [6,6,6,6,6], 1)
*创建一个固定灰度值的图像
gen_image_const (Image, 'byte', 200, 150)
*将先前建立的XLD轮廓绘制到图像上,128是灰度值
paint_xld (Contour, Image, ImageModel, 128)
*为各向异性尺度不变匹配准备一个轮廓模型
create_aniso_shape_model (ImageModel, 'auto', -rad(10), rad(20), 'auto', 0.9, 1.7, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 20, ModelID)
*返回一个轮廓模型的轮廓表示
get_shape_model_contours (ModelContours, ModelID, 1)
*设置显示字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*
* 在图片中查找SMD电容的模型并显示找到模型的数量和时间以及模型的比例
* 这里的比例是指实际图形与建立的简单模型的比例大小
*按照已知的图片数量进行循环
for J := 1 to 4 by 1
*读取图片
read_image (Image, 'smd/smd_capacitors_' + J$'02d')
*显示图片
dev_display (Image)
*测量一次时间
count_seconds (S1)
*在一个图像中找出一个各向异性尺度不变轮廓的最佳匹配。
find_aniso_shape_model (Image, ModelID, -rad(10), rad(20), 0.9, 1.7, 0.9, 1.1, 0.7, 0, 0.5, 'least_squares', 0, 0.8, Row, Column, Angle, ScaleR, ScaleC, Score)
*测量一次时间
count_seconds (S2)
*设置一个变量为两次测量时间的差值
Time := (S2 - S1) * 1000
*获取匹配模型的数量
Num := |Score|
*显示找到的模型与匹配模型花费的时间信息
disp_message (WindowHandle, Num$'d' + ' models found in ' + Time$'5.2f' + ' ms', 'window', 12, 12, 'black', 'true')
*获取找到的矩形列的平均值
MeanColumn := mean(Column)
*
for I := 0 to Num - 1 by 1
*显示找到的模型
* Display the found model.
*生成相同二维变换的同质变换矩阵
hom_mat2d_identity (HomMat2D)
*为一个同质二维变换矩阵添加一个缩放
hom_mat2d_scale (HomMat2D, ScaleR[I], ScaleC[I], 0, 0, HomMat2D)
*依照角度旋转二维矩阵
hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)
*为一个同质变换矩阵添加一个旋转
hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)
*对XLD轮廓(contour)进行一个任意二维仿射变换
affine_trans_contour_xld (ModelContours, ContoursTrans, HomMat2D)
*在当前窗口显示变换后的图形
dev_display (ContoursTrans)
*
*在找到的模型旁边显示模型的比例
ScaleRowStr := 'ScaleRow=' + ScaleR[I]$'5.3f'
ScaleColStr := 'ScaleCol=' + ScaleC[I]$'5.3f'
*获取一个字符串的空间大小
get_string_extents (WindowHandle, ScaleRowStr, AscentStr, DescentStr, WidthStr, HeightStr)
*显示建模的比例信息
if (Column[I] <= MeanColumn)
disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] - 60 - WidthStr, 'green', 'false')
else
disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] + 60, 'green', 'false')
endif
endfor
* 不激活以下代码程序将不中断的运行
if (J < 4)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
*在四张图片中寻找电容的程序结束
endfor
*清除简单形状模型
clear_shape_model (ModelID)
*重置uint2图像的有效位数为未知
set_system ('int2_bits', -1)