Halcon之几何模板制作
Halcon之几何模板制作11Halcon之几何模板制作与匹配一 几何模板的制作与保存***几何模板的制作和保存*获取窗口就的句柄 dev_get_window(WindowHandle)*1.读取图像*2.绘制模板区域*3.获取区域上图像*4.利用区域图像创建模板*5.保存*6.查看一下模板(默认位置会被修改到00)*1.读取图像 read_image(Image,1.bmp)*2.绘制模板区域 draw_rectangle1(WindowHandle,Row1,Column1,Row2,Column2)*生成区域 gen_rectangle1(Rectangle,Row1,Column1,Row2,Column2)*3.获取区域上图像 reduce_domain(Image,Rectangle,ImageReduced)*4.利用区域图像创建模板 create_shape_model(ImageReduced,auto,-0.39,0.79,auto,auto,use_polarity,auto,auto,ModelID)*5.保存 write_shape_model(ModelID,model.shm)*6.查看一下模板(默认位置会被修改到00)get_shape_model_contours(ModelContours,ModelID,1)create_shape_model(ImageReduced, ‘auto’, -0.39, 0.79, ‘auto’, ‘auto’, ‘use_polarity’, ‘auto’, ‘auto’, ModelID)参数详细说明1.ImageReduced含义输入的图像区域通常是经过预处理如阈值分割、ROI提取后包含待创建模板的物体图像。作用函数将基于该图像中的灰度变化边缘梯度提取模板特征。2.auto— 第1个参数金字塔层级数全称NumLevels含义定义图像金字塔的层数。auto表示让Halcon自动计算合适的层数。作用金字塔顶层用于粗匹配快速搜索底层用于精匹配高精度。自动模式下Halcon会根据模板大小和对比度自动选择层数通常为4-6层。手动设置示例4表示使用4层金字塔3.-0.39— 第2个参数起始角度全称AngleStart含义模板匹配时允许旋转搜索的起始角度单位弧度。当前值-0.39弧度 ≈-22.3度作用定义旋转搜索范围的起始边界。负值表示逆时针旋转的极限。4.0.79— 第3个参数角度范围全称AngleExtent含义从起始角度开始允许旋转的总角度范围单位弧度。当前值0.79弧度 ≈45.2度作用实际允许的旋转范围[AngleStart, AngleStartAngleExtent]本例中范围为[-0.39, 0.40]弧度 ≈[-22.3°, 22.9°]搜索时模板会在该角度区间内旋转匹配。5.auto— 第4个参数角度步长全称AngleStep含义在角度范围内离散采样的步长单位弧度。作用auto表示Halcon根据模板尺寸自动计算最优步长平衡匹配精度与速度。6.auto— 第5个参数优化选项全称Optimization含义控制模板的优化级别影响模板大小和匹配速度。常用值auto自动选择优化通常为点减少或无优化none不优化模板点最多匹配最准但慢point_reduction_high高程度减少模板点速度快精度降低pregeneration预生成旋转后的模板内存占用大速度快7.use_polarity— 第6个参数极性模式全称Metric含义定义匹配时对图像对比度明暗的要求。当前值use_polarity作用use_polarity要求匹配物体与模板的明暗对比一致例如模板是亮背景上的暗物体匹配时也必须如此。ignore_global_polarity忽略全局极性反转例如物体在亮或暗背景下均可匹配。ignore_local_polarity忽略局部极性变化更宽松但可能误匹配。8.auto— 第7个参数对比度阈值全称Contrast含义提取模板边缘点时最小灰度梯度值。作用autoHalcon自动计算对比度通常为灰度范围的15-20%。也可手动设置如[30, 10]表示全局阈值30局部对比度10用于保留弱边缘。9.auto— 第8个参数最小对比度全称MinContrast含义匹配时在图像中找到模板的最小灰度差异。作用控制匹配的灵敏度。如果图像中物体对比度低可设置较小值如5。autoHalcon根据模板对比度自动设置。10.ModelID—输出参数含义返回的模板句柄整数ID用于后续的find_shape_model、clear_shape_model等函数。作用唯一标识创建的形状模板所有相关操作都需引用此ID。参数组合总结参数位置参数含义当前值实际效果1图像区域ImageReduced从裁剪图像中提取特征2金字塔层数auto自动决定4-6层3起始角度-0.39 rad-22.3°4角度范围0.79 rad45.2°搜索范围-22.3° ~ 22.9°5角度步长auto自动计算离散角度数6优化方式auto自动优化模板点7极性模式use_polarity严格要求明暗一致8对比度阈值auto自动提取显著边缘9最小对比度auto自动设定匹配灵敏度10输出IDModelID存储模板句柄使用示例* 创建模板 create_shape_model(ImageReduced, auto, -0.39, 0.79, auto, auto, use_polarity, auto, auto, ModelID) * 查找模板 find_shape_model(SearchImage, ModelID, -0.39, 0.79, 0.5, 1, 0.5, least_squares, 0, 0.9, Row, Column, Angle, Score) * 释放模板 clear_shape_model(ModelID)常见调整建议角度范围如果物体旋转角度已知且较小可缩小范围提升速度。极性模式若光照可能反转如从背光变前光改用ignore_global_polarity。对比度边缘模糊的物体手动降低对比度阈值如10。金字塔层数大尺寸模板可减少层数如3提升速度但精度下降。二 几何模板的读取与匹配***几何模板的读取与匹配*1.读取模板*2.读取图像*3.进行模板匹配*4.利用匹配的结果我们进行仿射变换矩阵的生成*5.进行仿射变换实现模板匹配到现有的图像上*1.读取模板 read_shape_model(model.shm,ModelID)*2.读取图像 read_image(Image,2.bmp)*3.进行模板匹配*1.Image:匹配图像*2.模板*3.角度的开始:rad(-180)*4.角度的范围rad(360)*5.缩放比0.9*6.缩放比1.1*7.最小分数相似度越和模板相近分数就越高*8匹配个数0:有多少匹配多少*9重叠率*10亚像素精度*11金字塔层数*12贪婪度***输出y x 角度 缩放比 分数 find_scaled_shape_model(Image,ModelID,rad(-180),rad(360),0.9,1.1,0.5,1,0.5,least_squares,0,0.9,Row,Column,Angle,Scale,Score)*显示匹配的中心 gen_cross_contour_xld(Cross,Row,Column,60,Angle)*4.利用匹配的结果我们进行仿射变换矩阵的生成 get_shape_model_contours(ModelContours,ModelID,1)*方式1*(1)生成单位矩阵*hom_mat2d_identity(HomMat2DIdentity)*(2)加入缩放*hom_mat2d_scale(HomMat2DIdentity,Scale,Scale,0,0,HomMat2DScale)*(3)加入旋转*hom_mat2d_rotate(HomMat2DScale,Angle,0,0,HomMat2DRotate)*(4)加入平移*hom_mat2d_translate(HomMat2DRotate,Row,Column,HomMat2DTranslate)*方式2 vector_angle_to_rigid(0,0,0,Row,Column,Angle,HomMat2D)affine_trans_contour_xld(ModelContours,ContoursAffineTrans,HomMat2D)*5.进行仿射变换实现模板匹配到现有的图像上*affine_trans_contour_xld(ModelContours,ContoursAffineTrans,HomMat2DTranslate)前版本*获取窗口句柄 dev_get_window(WindowHandle)***一 制作模板*读取图像 read_image(Image,1.bmp)*绘制模板区域draw_rectangle1(WindowHandle,Row1,Column1,Row2,Column2)*生成矩形区域gen_rectangle1(Rectangle,Row1,Column1,Row2,Column2)*获取区域图像reduce_domain(Image,Rectangle,ImageReduced)*创建模板 create_scaled_shape_model(ImageReduced,auto,rad(-180),rad(360),auto,0.4,1.6,auto,auto,use_polarity,auto,auto,ModelID)*模板匹配find_scaled_shape_model(Image,ModelID,rad(-180),rad(360),0.4,1.6,0.5,1,0.5,least_squares,0,0.9,Row,Column,Angle,Scale,Score)*匹配成功if(|Row|0)*显示匹配结果dev_display_shape_matching_results(ModelID,red,Row,Column,Angle,Scale,Scale,0)endif***模板匹配 read_image(Image2,2.bmp)*进行模板匹配*图像*模板*开始角度*角度范围*最小缩放系数*最大缩放系数*最小分数*匹配个数*重叠度*亚像素*金字塔层数*贪婪度****输出*匹配后模板的Y坐标*匹配后模板的X坐标*匹配后模板的角度*匹配后模板的缩放系数*匹配后模板的分数find_scaled_shape_model(Image2,ModelID,rad(-180),rad(360),0.4,1.6,0.5,1,0.5,least_squares,0,0.9,Row,Column,Angle,Scale,Score)*显示模板get_shape_model_contours(ModelContours,ModelID,1)*匹配成功if(|Row|0)*方式1对模板进行仿射变换*生成仿射矩阵hom_mat2d_identity(HomMat2DIdentity1)*缩放hom_mat2d_scale(HomMat2DIdentity1,Scale,Scale,0,0,HomMat2DScale)*角度hom_mat2d_rotate(HomMat2DScale,Angle,0,0,HomMat2DRotate)*平移hom_mat2d_translate(HomMat2DRotate,Row,Column,HomMat2DTranslate)*对模板进行仿射变换affine_trans_contour_xld(ModelContours,ContoursAffinTrans,HomMat2DTranslate)endif*方式2对模板进行仿射变换*进行平移旋转仿射生成核心vector_angle_to_rigid(0,0,0,Row,Column,Angle,HomMat2D)*缩放矩阵生成hom_mat2d_scale(HomMat2D,Scale,Scale,Row,Column,HomMat2DScale)*对模板进行仿射变换affine_trans_contour_xld(ModelContours,ContoursAffinTrans2,HomMat2DScale)*获取窗口的句柄 dev_get_window(WindowHandle)*读取图像 read_image(Image1,C:/Users/Jumy/Desktop/Halcon-AOI教学资料/Halcon-AOI教学资料/程序与图像/06几何定位/1.几何模板制作/1.bmp)*绘制一个区域把瓶盖的图像抠出来做成几何模板 draw_rectangle1(WindowHandle,Row1,Column1,Row2,Column2)gen_rectangle1(Rectangle,Row1,Column1,Row2,Column2)*获取区域图像 reduce_domain(Image1,Rectangle,ImageReduced)*创建几何模板 create_scaled_shape_model(ImageReduced,auto,-0.39,0.79,auto,0.9,1.1,auto,auto,use_polarity,auto,auto,ModelID)*做完模板之后模板的中心点在00 get_shape_model_contours(ModelContours,ModelID,1)find_scaled_shape_model(Image1,ModelID,-0.39,0.78,0.9,1.1,0.5,1,0.5,least_squares,0,0.9,Row,Column,Angle,Scale,Score)dev_display_shape_matching_results(ModelID,red,Row,Column,Angle,1,1,0)*模板匹配 read_image(Image2,C:/Users/Jumy/Desktop/Halcon-AOI教学资料/Halcon-AOI教学资料/程序与图像/06几何定位/1.几何模板制作/2.bmp)*新盖子的位置角度、缩放系数相对于模板是变大了还是变小和模板的盖子一样大就是1、分数相似度越像就是越接近1***输入参数*检测图像*创建模板*匹配开始角度*角度范围*最小缩放系数*最大缩放系数*最小分数新图像盖子和模板盖子的相似度*匹配个数*重叠度*压像素*金字塔层数*贪婪度 find_scaled_shape_model(Image2,ModelID,rad(-180),rad(360),0.9,1.1,0.5,1,0.5,least_squares,0,0.9,Row3,Column3,Angle1,Scale1,Score1)*仿射变换的使用*仿射变换平移 旋转 缩放*生成单位矩阵 hom_mat2d_identity(HomMat2DIdentity)*缩放 hom_mat2d_scale(HomMat2DIdentity,Scale1,Scale1,0,0,HomMat2DScale)*旋转 hom_mat2d_rotate(HomMat2DScale,Angle1,0,0,HomMat2DRotate)*平移的效果 hom_mat2d_translate(HomMat2DRotate,Row3,Column3,HomMat2DTranslate)affine_trans_contour_xld(ModelContours,ContoursAffineTrans,HomMat2DTranslate)