*
* 本示例演示了使用单个参考图像进行打印检查的过程。
*
* 读取参考图像并初始化程序。
read_image (Image, 'relay/relay_01')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, 600, 500, WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
dev_update_off ()
dev_display (Image)
get_image_size (Image, Width, Height)
Pi := rad(180)
*
* 读取已人为预定义的兴趣区域。
read_region (ROI, 'relay/relay_inspection_roi.reg')
reduce_domain (Image, ROI, ImageReduced)
*
*显示参考图像。
dev_clear_window ()
dev_display (ImageReduced)
dev_disp_text ('Reference image', 'window', 12, 12, 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
*
* 在此应用中,通过使用边缘幅度作为标准偏差的近似值,从单个参考图像创建变化模型。
Sigma := 0.5
edges_image (ImageReduced, ImaAmp, ImaDir, 'canny', Sigma, 'none', 20, 40) //使用Deriche,Lanser,Shen或Canny过滤器提取边缘。
gray_dilation_rect (ImaAmp, VariationImage, 3, 3) //确定矩形内的最大灰度值,灰度膨胀使得被检测图像与参考图像间的允许误差增加。参考图像ImageReduced生成--->偏差模型VariationImage,
*
* 显示变化图像。
dev_clear_window ()
dev_display (VariationImage)
dev_disp_text ('Variation image', 'window', 12, 12, 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
*
* 创建偏差模型。
AbsThreshold := 15
VarThreshold := 1
create_variation_model (Width, Height, 'byte', 'direct', VarModelID) //创建用于图像比较的变化模型。
prepare_direct_variation_model (ImageReduced, VariationImage, VarModelID, AbsThreshold, VarThreshold) //准备一个变化模型以与图像进行比较。ImageReduce参考图像,VariationImage偏差图像
*
*创建形状模型以对齐测试图像。 为了加快匹配速度,仅将打印件的一部分用作模板。为了被测图像与参考图像进行比较,两个图像必须很好的对齐,使用鲁棒的模板匹配来确定这两幅图像间的偏差量
read_region (MatchingROI, 'relay/relay_matching_roi') //读取图像ROI区域
reduce_domain (Image, MatchingROI, Template) //缩小图像的域。
create_shape_model (Template, 5, -rad(5), rad(10), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ShapeModelID) //准备一个形状模型以进行匹配。
area_center (MatchingROI, ModelArea, ModelRow, ModelColumn) //区域中心点
*
*仅出于可视化目的提取亚像素精确边缘。
edges_sub_pix (ImageReduced, Edges, 'sobel_fast', 0.5, 10, 20) //使用Deriche,Lanser,Shen或Canny滤镜提取亚像素精确边缘。
*
* 检查多个继电器上的印记。
for Index := 2 to 6 by 1
*
* 读取测试图片
read_image (Image, 'relay/relay_' + Index$'02d')
*
* 确定打印在测试图像中的确切位置。
find_shape_model (Image, ShapeModelID, -rad(5), rad(10), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
*
* 检查压印是否可以找到。
if (|Score| == 1)
*
* 将图像与参考图像对齐。
vector_angle_to_rigid (Row, Column, Angle, ModelRow, ModelColumn, 0, HomMat2D) //从点和角度计算刚性仿射变换。
affine_trans_image (Image, ImageAligned, HomMat2D, 'constant', 'false') //将任意仿射2D变换应用于图像。
*
* 将当前测试图像与参考图像进行比较。
reduce_domain (ImageAligned, ROI, ImageAlignedReduced)
compare_variation_model (ImageAlignedReduced, RegionDiff, VarModelID) //将图像与变化模型进行比较。
*
* 选择打印印记中错误的区域。
MinComponentSize := 5
dilation_circle (RegionDiff, RegionDilation, 3.5) //使用圆形结构元素扩展区域。
connection (RegionDilation, ConnectedRegions)
intersection (ConnectedRegions, RegionDiff, RegionIntersection) //计算两个区域的交点。
select_shape (RegionIntersection, SelectedRegions, 'area', 'and', MinComponentSize, ModelArea) //借助形状特征选择区域。
*
* 显示结果。
dev_display (ImageAligned)
count_obj (SelectedRegions, NumberDefects) //计算元组中的对象数。
if (NumberDefects > 0)
dev_disp_text ('Image ' + Index + ': ' + NumberDefects + ' Errors found', 'window', 12, 12, 'black', [], [])
dev_set_color ('green')
dev_set_line_width (1)
dev_display (Edges)
dev_set_color ('red')
dev_set_line_width (3)
area_center (SelectedRegions, Area, Row, Column)
elliptic_axis (SelectedRegions, Ra, Rb, Phi) //计算等效椭圆的参数。
gen_ellipse_contour_xld (ErrorMarker, Row, Column, Phi, Ra + 5, Rb + 5, gen_tuple_const(|Row|,0), gen_tuple_const(|Row|,6.28318), gen_tuple_const(|Row|,'positive'), 1.5) //创建对应于椭圆弧的XLD轮廓。
gen_tuple_const(|Row|,0) //用于生成特定长度的元组并且初始化其元素,创建一个具有|Row|个元素的、每个元 素都为 0 的数据
dev_display (ErrorMarker)
else //显示:"OK"
dev_disp_text ('Image ' + Index + ': OK', 'window', 12, 12, 'black', [], [])
dev_set_color ('green')
dev_set_line_width (1)
dev_display (Edges)
endif
else
if (|Score| == 0) //如果Score分数为0,显示:找不到要测试的图案
dev_disp_text ('Image ' + Index + ': Pattern to be tested could not be found', 'window', 12, 12, 'black', [], [])
else //显示:发现要测试的图案不明确
dev_disp_text ('Image ' + Index + ': Pattern to be tested was found ambiguously', 'window', 12, 12, 'black', [], [])
endif
endif
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
endfor
*
* Clean up
clear_shape_model (ShapeModelID)
clear_variation_model (VarModelID)
dev_disp_text (' End of program ', 'window', 'bottom', 'right', 'black', [], [])
注意:
1.通过参考图像边缘振幅来估计允许误差:为了使相邻边缘对振幅计算影响较小,使用一个3*3的Canny边缘滤波算子(edges_image),并使用灰度膨胀(gray_dilation_rect )使得被检测图像与参考图像间的允许误差增加;
2.参考图像和偏差图像生成 偏差模型 : create_variation_model 、prepare_direct_variation_model
3.理一遍思路: