halcon-find_shape_model形状模板匹配

形状匹配原理:模板创建后,会根据模板中的边缘等关系去图像中进行搜索,可以理解成提取模板中的灰度发生变化的那些点,然后再去图像中匹配,这样的效果是对干扰比较稳定,匹配速度快,并且即使边缘发生部分遮挡,匹配效果依旧较好

定位对象内部的灰度值可以有变化,但对象边缘轮廓必须清晰平滑的场合

 

 

在HDevelop中

复制代码
dev_close_window ()
read_image (Image, 'D:/bb/tu/3.jpg')
rgb1_to_gray (Image, GrayImage)

****截取模板图像:B字母****
gen_rectangle1 (Rectangle, 16, 120, 69, 172)
reduce_domain (GrayImage, Rectangle, ImageReduced)
get_image_size (ImageReduced, Width, Height)
dev_open_window(10,100,Width, Height,'black',WindowHandle1)
*显示模板图像
dev_display(ImageReduced)

inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
*预览金字塔
*金字塔多少层比较合适,可以通过ModelRegions观看--为后面创建模板做准备
*参数1:输入模板图像
*参数2:输出的金字塔图像
*参数3:金字塔区域
*参数4:金字塔层数
*参数5:图像中物体对比度的阈值或滞后阈值,以及可选的物体部分的最小尺寸


create_shape_model (ImageReduced, 'auto', -0.2, 0.2, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*创建形状模板
*参数1:模板图像(reduce_domain后)
*参数2:金字塔的最大层级--层级越高搜索越快
*      值列表:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'
*参数3:模板旋转的起始角度--弧度
*参数4:模板旋转的终止角度--弧度
*参数5:角度步长
*       限制:角度步长>=0和角度步长<=pi/16
*参数6:设置模板优化和模板创建方法
*       'auto'
*       'no_pregeneration'
*       'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration'
*参数7:匹配方法设置
*       'ignore_color_polarity'    即使颜色对比度在局部发生变化,也会找到模型--可用于具有任意数量通道的图像
*       'ignore_global_polarity'   如果对比度(比如亮背景暗前景)全局反转,也会在图像中找到对象--只能应用于单通道图像
*       'ignore_local_polarity'    即使对比度在局部发生变化,也会找到模型--只能应用于单通道图像
*       'use_polarity'   则图像中的对象和模型必须具有相同的对比度。例如,如果模型是暗背景上的明亮对象,则仅当该对象也比背景亮时,才能找到该对象--只能应用于单通道图像  
*                        如果多通道图像用作模型图像或搜索图像,则只会使用第一个通道(并且不会返回错误消息)
*参数8:设置对比度
*参数9:设置最小对比度
*参数10:模板句柄


find_shape_model (GrayImage, ModelID, -0.2, 0.2, 0.5, 6, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
*形状模板匹配
*参数1:输入图像
*参数2:模板句柄
*参数3:搜索时的起始角度
*参数4:搜索时的终止角度,必须与创建模板时的有交集
*参数5:被找到的模板最小分数--大于等于这个值才能被匹配
*      默认值:0.5      建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
*      典型值范围:0≤MinScore ≤ 1
*      最小增量:0.01       建议增量:0.05
*参数6:要找到的模板最大实例数
*       0   不限制
*参数7:要找到的模型实例的最大重叠比例
*      默认值:0.5       建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
*      典型值范围:0≤ MaxOverlap≤ 1      最小增量:0.01     建议增量:0.05
*      0 表示不允许重叠
*参数8:计算精度的设置
*        'none'   不适用亚像素,最大误差为半个像素
*        'interpolation'   差值得到亚像素精度
*        'least_squares', 'least_squares_high', 'least_squares_very_high'
*        'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4'
*        'max_deformation 5', 'max_deformation 6'
*参数9:搜索时金字塔的层级
*参数10:贪婪度,搜索启发式,一般都设为0.8,越高速度快,容易出现找不到的情况
*       0≤ Greediness ≤ 1   
*最后4个:输出匹配位置的行和列坐标、角度、得分 【中心坐标】
复制代码

 

 


在QtCreator中

  HObject  ho_Image, ho_GrayImage, ho_Rectangle;
  HObject  ho_ImageReduced, ho_ModelImages, ho_ModelRegions;
  HTuple  hv_Width, hv_Height, hv_WindowHandle1;
  HTuple  hv_ModelID, hv_Row, hv_Column, hv_Angle, hv_Score;

 

复制代码
  ReadImage(&ho_Image, "D:/bb/tu/3.jpg");
  Rgb1ToGray(ho_Image, &ho_GrayImage);

  //***截取模板图像:B字母****
  GenRectangle1(&ho_Rectangle, 16, 120, 69, 172);
  ReduceDomain(ho_GrayImage, ho_Rectangle, &ho_ImageReduced);
  GetImageSize(ho_ImageReduced, &hv_Width, &hv_Height);
  SetWindowAttr("background_color","black");
  OpenWindow(10,100,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle1);
  HDevWindowStack::Push(hv_WindowHandle1);
  //显示模板图像
  if (HDevWindowStack::IsOpen())
    DispObj(ho_ImageReduced, HDevWindowStack::GetActive());

  InspectShapeModel(ho_ImageReduced, &ho_ModelImages, &ho_ModelRegions, 4, 30);
  //预览金字塔
  //金字塔多少层比较合适,可以通过ModelRegions观看--为后面创建模板做准备
  //参数1:输入模板图像
  //参数2:输出的金字塔图像
  //参数3:金字塔区域
  //参数4:金字塔层数
  //参数5:图像中物体对比度的阈值或滞后阈值,以及可选的物体部分的最小尺寸


  CreateShapeModel(ho_ImageReduced, "auto", -0.2, 0.2, "auto", "auto", "use_polarity", 
      "auto", "auto", &hv_ModelID);
  //创建形状模板
  //参数1:模板图像(reduce_domain后)
  //参数2:金字塔的最大层级--层级越高搜索越快
  //     值列表:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'
  //参数3:模板旋转的起始角度--弧度
  //参数4:模板旋转的终止角度--弧度
  //参数5:角度步长
  //      限制:角度步长>=0和角度步长<=pi/16
  //参数6:设置模板优化和模板创建方法
  //      'auto'
  //      'no_pregeneration'
  //      'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration'
  //参数7:匹配方法设置
  //      'ignore_color_polarity'    即使颜色对比度在局部发生变化,也会找到模型--可用于具有任意数量通道的图像
  //      'ignore_global_polarity'   如果对比度(比如亮背景暗前景)全局反转,也会在图像中找到对象--只能应用于单通道图像
  //      'ignore_local_polarity'    即使对比度在局部发生变化,也会找到模型--只能应用于单通道图像
  //      'use_polarity'   则图像中的对象和模型必须具有相同的对比度。例如,如果模型是暗背景上的明亮对象,则仅当该对象也比背景亮时,才能找到该对象--只能应用于单通道图像
  //                       如果多通道图像用作模型图像或搜索图像,则只会使用第一个通道(并且不会返回错误消息)
  //参数8:设置对比度
  //参数9:设置最小对比度
  //参数10:模板句柄


  FindShapeModel(ho_GrayImage, hv_ModelID, -0.2, 0.2, 0.5, 6, 0.5, "least_squares", 
      0, 0.9, &hv_Row, &hv_Column, &hv_Angle, &hv_Score);
  //形状模板匹配
  //参数1:输入图像
  //参数2:模板句柄
  //参数3:搜索时的起始角度
  //参数4:搜索时的终止角度,必须与创建模板时的有交集
  //参数5:被找到的模板最小分数--大于等于这个值才能被匹配
  //     默认值:0.5      建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
  //     典型值范围:0≤MinScore ≤ 1
  //     最小增量:0.01       建议增量:0.05
  //参数6:要找到的模板最大实例数
  //      0   不限制
  //参数7:要找到的模型实例的最大重叠比例
  //     默认值:0.5       建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
  //     典型值范围:0≤ MaxOverlap≤ 1      最小增量:0.01     建议增量:0.05
  //     0 表示不允许重叠
  //参数8:计算精度的设置
  //       'none'   不适用亚像素,最大误差为半个像素
  //       'interpolation'   差值得到亚像素精度
  //       'least_squares', 'least_squares_high', 'least_squares_very_high'
  //       'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4'
  //       'max_deformation 5', 'max_deformation 6'
  //参数9:搜索时金字塔的层级
  //参数10:贪婪度,搜索启发式,一般都设为0.8,越高速度快,容易出现找不到的情况
  //      0≤ Greediness ≤ 1
  //最后4个:输出匹配位置的行和列坐标、角度、得分 【中心坐标】
复制代码

 

 

 

 

posted @   天子骄龙  阅读(3470)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-03-26 生活技巧
2020-03-26 真假蜂蜜区别方法
点击右上角即可分享
微信分享提示

目录导航