基于形状的模板匹配(Shape-Based)

2023-05-16

  • 称为基于边缘方向梯度的匹配,是一种最常用也是最前沿的模板匹配算法

(一)根本思想

  • 以物体边缘的梯度相关性作为匹配标准

(二)原理

  • 提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板的大小和清晰度的要求生成多层级的图像金字塔模型

  • 接着在图像金字塔层中自上而下逐层搜索模板图像,直到搜索到最底层或得到确定的匹配结果为止

(三)使用条件

  • 该方法使用边缘特征定位物体,对于很多干扰因素不敏感,如光照和图像的灰度变化,甚至可以支持局部边缘缺失、杂乱场景、噪声、失焦和轻微形变的模型

  • 更进一步说,它甚至可以支持多个模板同步进行搜索

  • 但是它不适用于旋转和缩放比较大的情况

(四)形状匹配算子

 /*
 1.创建形状模型:create_shape_model()
 2.寻找形状模型:find_shpae_model()
 3.释放形状模型:clear_shape_model()
 */

(五)实例

1、创建ROI区域,准备模板图像用来创建模板(创建模板以后可以保存下来)

  • 标准形状:draw_rectangle1/2、draw_circle、draw_ellipse、draw_line

  • 任意形状:draw_region、draw_polygon

  • 生成标准ROI:gen_rectangle1/2、gen_circle、gen_ellipse、gen_region_line

  • 通过XLD创建AOI:gen_region_contour_xld、gen_region_polygon_xld

  • 利用area_center()找到这个ROI区域的中心

  • 通过reduce_domain()从图像中获取这个ROI区域

2、ROI修正,通过预处理改善图像质量,以便找到更合适的模板图像

  • 修正函数:erosion(减小ROI)、dilation(扩大ROI)、shape_trans(形状转换)、boundary(像素级边界)、move_region(移动区域到新位置)

  • 组合:intersection(交集)、difference(差集)、union2(两个区域的并集)

3、直接创建模板

 create_shape_model(Template , // 模板图像
                    NumLevels, // 金字塔层数
                    AngleStart, // 起始角度
                    AngleExtent, // 角度范围
                    AngleStep, // 角度步长
                    Optimization, // 设置模板优化和模板创建方法
                    Metric, // 匹配方法设置
                    Contrast, // 模板中前景与背景的对比度
                    MinContrast, // 被查找图片的最小对比度
                    ModelID) // 模板ID
 // 可缩放比例
 create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
                    
 create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)
  • 通过determine_shape_model_params算子得到金字塔层数,再通过inspect_shape_model算子测试对比度的数值是否合理

  • 创建好模板以后,需要监视模板,用inspect_shape_model算子来完成,用来检测参数的适用性与找到合适的参数

  • 该算子执行后将会把预设参数的金字塔分级图像显示出来,可以根据需要判断参数选取的是否合理 

  inspect_shape_model(Image : // 输入参数,输入图像
                     ModelImages, // 输出参数,输出图像基于金字塔的影像
                     ModelRegions : // 输出参数,输出模型区域
                     NumLevels, // 输入参数,使用的金字塔层数。默认4,范围1~10
                     Contrast : ) // 输入参数,设置对比度。默认30,参考10,20,30,40,60,80,100,120,140,160

(1)NumLevels

  • 最开始是第一层,逐层+1

  • 金字塔越小,细节信息越多,定位的更准确,但消耗的时间也更多;金字塔越大,找到匹配使用的时间就越小

  • 另外必须保证最高层的图像具有足够的信息(至少四个点)。如果金字塔过大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些(注意这里的解决办法!!!)

  • 如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数

  • 如果最底层金字塔的信息太少,函数就会报错

  • 如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数

 // 根据创建的模型ID来查看形状模型的参数
 get_shape_model_params( : : ModelID : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
 // ScaleMin, ScaleMax, ScaleStep是模型的最小比例、最大比例、缩放步长

(2)Contrast

  • 对比度是用来测量目标与背景之间和目标不同部分之间局部的灰度值差异

  • 1个元素时:128,对比度,直接提取边缘

  • 2个元素时:[100, 128],表示使用滞后阈值的算法来进行分割提取边缘

  • 3个元素时:[100, 128, 10],前两个参数同2,最后一个参数表示所提取边缘的最小长度为10

  • 对比度阈值可以使用determine_shape_model_params函数自动确定,也可以在调用create_shape_model之前使用inspect_shape_mode函数检查效果

 determine_shape_model_params(Template, // 模板 
                              ‘auto’, // 金字塔层数
                              0, // 起始角度
                              rad(360), // 角度范围
                              0.9, // 缩小范围
                              1.1, // 放大范围
                              ‘auto’, // 减少像素的方法
                              ‘use_polarity’, // 极性
                              ‘auto’, // 对比度
                              ‘auto’, // 最小对比度
                              'all', // 需要自动确定的参数
                              ParameterName, // Name of values
                              ParameterValue) // Values

(3)AngleStart、AngleExtent、AngleStep

  • AngleStep的选择是基于目标的大小的,如果模板图像太小就不能产生许多不同离散角度的图像,因此对于较小的模板图像AngleStep应该设置的比较大

  • 如果AngleExtent不是AngleStep的整数倍, 将会相应的修改AngleStep

  • AngleStep

    • 选择标准:模板越大,角度步长越小;模板越小,角度步长越大

    • 速度和内存:步长越小,占用内存越多,定位速度越慢

    • 如果没有特殊要求,可选"auto"让系统做最佳选择,会基于模板的大小自动定义一个合适的角度步长

(4)Optimization

  • 设置模板优化和模板创建方法

  • 一些模板包含了太多像素点,这导致模板过大、增加执行时间、增加内存需求

  • 参数Optimization是用来减少这些点,相同条件下,运行时间依次减少

    • none,不减少像素

    • point_reduction_low,大约一半点

    • point_reduction_medium,大约1/3

    • point_reduction_high,大约1/4

  • 对于特别大的模板图像,将参数Optimization设置为不同于’none’的其他数值是非常有用的;对于比较小的模型,减少模型点数并不能提高搜索速度

  • 如果模型点数变少了,必须在find_shape_model函数中将参数Greediness设为一个比较小的值 比如:0.7、0.8

  • 如果Optimization设置为’auto’, create_shape_model自动确定模型的点数

  • 除了减少像素,该参数也可以控制模板的创建方式,来选择内存优先还是速度优先

  • 第二个值可选下面两个

    • 'pregeneration',模板预先创建,牺牲内存来换取查找速度

    • 'no_pregeneration',在查找时才创建必须数据,占用内存少

  • 默认的是系统中的设置

     set_system('pregenerate_shape_models','true'/'false')
  • 如果没有设置,默认为

     set_system('pregenerate_shape_models','false')

(5)Metric

  • 在图像中匹配模板的条件

    • use_polarity:图像中的目标和模型具有一样的对比度(前景亮,背景暗,那么仅仅那些比背景亮的目标可以找到)

    • ignore_global_polarity:在两者对比度完全相反时也能找到目标(如果目标是比背景暗的也能将目标找到)

    • ignore_local_polarity :即使局部对比度改变也能找到模型(当目标包含一部分中等灰度,并且其中部分比较亮部分比较暗时,这种模式是非常有用的)

  • 由于这种模式下find_shape_model函数的运行时间显著增加,最好的方法是使用create_shape_model创建几个反映目标可能的对比度变化的模型,同时使用find_shape_models去匹配他们

(6)MinContrast

  • 将模板从图像噪声中分离出来,如果灰度值的波动范围是10,则MinContrast = 10

  • 模板图像边缘不一定都是有益的,噪声、纹理会造成有害边缘,有害边缘会导致定位不准或找错、错误的分值、稍微增大查找时间

  • 参数MinContrast是在查找模板的时候,来减少“有害”边缘的

  • 该值可通过estimate_noise函数、inspect_shape_model函数、助手判断得到

(7)注意事项:通过Dxf(格式交换文件)文件创建模板

  •  通过像素轮廓可以直接创建模板

create_scaled_shape_model_xld
create_aniso_shape_model_xld

4、需要获得这个模板的轮廓,用来之后的匹配

 get_shape_model_contours(ModelContours, // 输出形状模型的轮廓表示
                          ModelID, // 模型句柄
                          Level) // 金字塔层数

5、模板匹配,得到位置、角度、缩放值、分值信息

  • 在图像中找出最佳匹配的模板,返回一个模板实例的长、宽、旋转角度

 find_shape_model(Image, // 搜索图像
                  ModelID, // 模板句柄
                  AngleStart, // 搜索时的起始角度
                  AngleExtent, // 搜索时的角度范围,必须与创建模板时的有交集
                  MinScore, // 最小匹配值,输出的匹配的得分Score大于该值
                  NumMatches, // 定义要输出的匹配的最大个数
                  MaxOverlap, // 当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出
                  SubPixel, // 计算精度的设置,五种模式,多选2,3
                  NumLevels, // 搜索时金字塔的层数
                  Greediness, // 贪婪度,搜索启发式,一般都设为0.9,越高速度快,容易出现找不到的情况
                  Row, Column, Angle, Score) // 输出匹配位置的行和列坐标、角度、得分(模板在搜索图像中可见比例的近似测量,如果模板的一半被遮挡,该值就不能超过0.5)
  • 参数影响到匹配的速度与精度

(1)MinScore

  • 模板匹配时至少有个什么样的质量系数才算是在图像中找到模板

  • MinScore设置的越大,越相似,搜索的就越快

  • 如果模板在图像中没有被遮挡,MinScore可以设置为0.8这么高甚至0.9

(2)NumMatches

  • 在图像上找到模板的最大的个数

  • 如果匹配时的质量系数大于MinScore的目标个数多于NumMatches,仅仅返回质量系数最好的NumMatches个目标位置。如果找的匹配目标不足NumMatches,那么就只返回找到的这几个

  • 参数MinScore优于NumMatche

(3)Maximum Overlap

  • 参数MaxOverlap是0到1之间的,定义了找到的两个目标区域最多重叠的系数,以便于把他们作为两个不同的目标区域分别返回

  • 如果找到的两个目标区域彼此重叠并且大于MaxOverlap,仅仅返回效果最好的一个

  • 重叠的计算方法是基于找到的目标区域的任意方向的最小外接矩形(看smallest_rectangle2)。如果MaxOverlap=0, 找到的目标区域不能存在重叠,如果MaxOverlap=1,所有找到的目标区域都要返回

(4)SubPixel

  • 确定找到的目标是否使用亚像素精度提取,一般设置为interpolation

  • 精度控制模型

    • none:不使用亚像素,最大误差为半个像素

    • interpolation:位置和角度都是亚像素精度的。在这种模式下模型的位置是在质量系数函数中插入的,这种模式几乎不花费计算时间,并且能达到足够高的精度

    • least_squares、least_squares_high、least_squares_very_high:最小二乘法亚像素精度

  • 不同模式对运行时间的影响:前两者时间相同,最小二乘法时间比较长

  • 该参数可影响以下结果:Position、Angle、Scaling

(5)NumLevels

  • 如果NumLevels=0,使用创建模板时金字塔的层数

  • NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔层数

  • 如NumLevels=[4,2]表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低的设为1)

  • 可以使用这种方法降低匹配的运行时间,但是这种模式下位置精度是比正常模式下低的,所谓正常模式是在金字塔最底层匹配

  • 因此如果需要较高的精度,应该设置SubPixel至少为’least_squares’。如果金字塔最底层设置的过大,可能不会达到期望的精度,或者找到一个不正确的匹配区域。这是因为在较高层的金字塔上模板是不够具体的,不足以找到可靠的模板最佳匹配。在这种情况下最低金字塔层数应设为最小值

(6)Greediness

  • 该参数是用来做定位加速的,很大程度上影响着搜索速度

  • 若为0,则为启发式搜索;若为1,则为不安全搜索

  • 值越小,速度越慢;值越高,找丢目标的可能越大

  • 建议取值:0.7~0.9

6、模板匹配之后进行转换(未完善)

(1)vector_angle_to_rigid()

  • 从一个点和角度计算一个刚体仿射变换

(2)affine_trans_contour_xld()

 for i:=0 to |Score|-1 by 1
     // 得到对应匹配目标的旋转矩阵
     vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2DRotate)
     // 在旋转矩阵的基础上添加缩放量,生成新的矩阵
     hom_mat2d_scale (HomMat2DRotate, Scale[i], Scale[i], Row[i],Column[i], HomMat2DScale)
     // 矩阵变换(xld基础上)
     affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
     // xld转换成region
     gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
     // 对区域,生成最小外接矩形
     smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
     // 使用绿色矩形框,框选匹配结果
     dev_set_color ('green')
     disp_rectangle1 (WindowHandle, Row1[0], Column1[0], Row2[0], Column2[0])
     // 使用红色勾画匹配结果轮廓
     dev_set_color ('red')
     dev_display (ContoursAffineTrans)
     // 显示各匹配结果提示语
     disp_message (WindowHandle, '第'+(i+1)+'个', 'window', Row1[0]-30, (Column1[0]+Column2[0])/2-10, 'green', 'false')
 endfor

7、如何加快搜索匹配?

  • 只要匹配成功,就尽可能的增加参数MinScore的数值

  • 增加Greediness的值直到匹配失败,同时在需要时减小MinScore的值

  • 在创建图像时,增加金字塔层数

  • 限定允许的旋转范围与大小范围,在调用find_shape_model()时调整相应的参数

  • 尽量限定搜索ROI区域的值

8、实例

(1)网格线

 // 关闭程序计数器,变量更新,图像窗口更新
 dev_update_off ()
 dev_close_window ()
 ​
 // 读取模版图像
 read_image (Image, 'wafer/wafer_mirror_dies_01')
 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
 set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
 // 定义输出区域,轮廓的线宽
 dev_set_line_width (3)
 dev_display (Image)
 ​
 // 这个过程会在屏幕右下角显示“Click 'Run' to continue”。
 disp_continue_message (WindowHandle, 'black', 'true')
 stop()
 ​
 // 创建剪切矩形ROI作为模板图像
 gen_rectangle1 (Rectangle, 362, 212, 414, 262)
 reduce_domain (Image, Rectangle, ImageReduced)
 ​
 // 根据金字塔数和对比度获取输入图像的金字塔图像、金字塔区域
 inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
 // 显示金字塔各层级的图像,以检查层数的合理性
 dev_display(ModelRegions)
 area_center(ModelRegions, AreaModelRegions, RowModelRegions, ColumnModelRegions)
 count_obj(ModelRegions, Number)
 // 确定金字塔的层级
 for i := 1 to Number by 1
     if(AreaModelRegions[i-1]>=10)
         NumLevels := i
     endif
 endfor
 ​
 // 创建形状模版
 create_shape_model (ImageReduced, NumLevels, rad(0), rad(1), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
 // 获得模型轮廓,中心点在原点位置
 get_shape_model_contours (ModelContours, ModelID, 1)
 ​
 // 开始在搜索图像中搜索模版
 for Index := 1 to 4 by 1
     read_image (Image, 'wafer/wafer_mirror_dies_' + Index$'02')
     // 计算当前过去的时间,单位是秒
     count_seconds (S1)
     // 使用匹配算子进行形状模板匹配
     find_shape_model (Image, ModelID, rad(0), rad(1), 0.5, 0, 0.0, 'least_squares', 2, 0.5, Row, Column, Angle, Score)
     // 计算当前过去的时间,单位是秒
     count_seconds (S2)
     Runtime := (S2 - S1) * 1000
 ​
     // 生成十字对象
     gen_cross_contour_xld (Cross, Row, Column, 6, rad(45))
     // 显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来
     dev_display_shape_matching_results (ModelID, 'lime green', Row, Column, Angle, 1, 1, 0)
     // 设置输出对象的颜色
     dev_set_color ('orange')
     // 显示图像
     dev_display (Image)
     // 显示十字
     dev_display (Cross)
     stop ()
 ​
 endfor
 get_system ('border_shape_models', model)
 //  匹配结束,释放模板资源
 clear_shape_model (ModelID)
  • 边界处理

    • set_system('border_shape_models','false')

    • 模板必须在ROI内

    • 靠近边缘部分会被裁减

    • set_system('border_shape_models','true')

    • 模板可以部分在ROI外面

    • 注意:分值会降低 

(2)环保标志

 dev_update_off ()
 dev_close_window ()
 ​
 // 定位模板
 // 读取图像
 read_image (Image, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/一个环保标志.png')
 // 获取图像的宽高
 get_image_size (Image, Width, Height)
 // 以合适的尺寸打开图像
 dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
 //显示图像、字体、填充方式、颜色、字宽
 dev_display (Image)
 set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
 dev_set_draw ('margin')
 dev_set_color ('red')
 dev_set_line_width (3)
 ​
 // 定义数组
 Message := '这个实例演示如何创建一个模板'
 Message[1] := '形状匹配模板建立与保存'
 Message[2] := '模板匹配的使用'
 // 显示数组话语
 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
 // 继续提示语显示
 disp_continue_message (WindowHandle, 'black', 'true')
 // 执行断点处
 stop()
 ​
 // 预处理获得优质的模板图像
 threshold (Image, Regions, 0, 122)
 dev_set_colored(12)
 connection (Regions, ConnectedRegions)
 fill_up (ConnectedRegions, RegionFillUp)
 select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 14845, 57911.9)
 dilation_circle (SelectedRegions, RegionDilation, 3.5)
 reduce_domain (Image, RegionDilation, ImageReduced)
 ​
 // 生成模板
 determine_shape_model_params(ImageReduced, 'auto', -0.39, 0.79, 0.9, 1.1, 'auto', 'use_polarity', 'auto', 'auto', 'all', ParameterName, ParameterValue)
 // 监视模板
 inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 5, 40)
 ​
 // 创建形状模板
 // 使用用图像创建带有缩放的匹配模板
 create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)
 // 保存模板
 write_shape_model (ModelID, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_huanbao.shm')
 // 清除模板
 clear_shape_model (ModelID)
  
 // 模板匹配
 // 获取检测目标图像
 read_image (Image1, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/三个环保标志.png')
 // 提示语定义与显示
 Message := '形状匹配步骤开始'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
 // 读取形状模板
 read_shape_model ('E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_huanbao.shm', ModelID1)
 // 模板匹配,后面的几个参数是匹配图像的位置状态等参数
 find_scaled_shape_model (Image1, ModelID1, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
 // 返回一个轮廓模型的轮廓表示
 get_shape_model_contours (ModelContours, ModelID1, 1)
 ​
 dev_display (Image1)
 // 循环
 for i:=0 to |Score|-1 by 1
     // 得到对应匹配目标的旋转矩阵
     vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2DRotate)
     // 在旋转矩阵的基础上添加缩放量,生成新的矩阵
     hom_mat2d_scale (HomMat2DRotate, Scale[i], Scale[i], Row[i],Column[i], HomMat2DScale)
     // 矩阵变换(xld基础上)
     affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
     // xld转换成region
     gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
     // 对区域,生成最小外接矩形
     smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
     // 使用绿色矩形框,框选匹配结果
     dev_set_color ('green')
     disp_rectangle1 (WindowHandle, Row1[0], Column1[0], Row2[0], Column2[0])
     // 使用红色勾画匹配结果轮廓
     dev_set_color ('red')
     dev_display (ContoursAffineTrans)
     // 显示各匹配结果提示语
     disp_message (WindowHandle, '第'+(i+1)+'个', 'window', Row1[0]-30, (Column1[0]+Column2[0])/2-10, 'green', 'false')
 endfor
 ​
 // 提示语定义与显示
 Message := '形状匹配结果如下:'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'green', 'false')
 // 将窗口内容写入图像对象
 dump_window_image (Image2, WindowHandle)
 write_image (Image2, 'png', 0, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/环保标志结果.bmp.png')

(3)晨光

 dev_update_off()
 dev_close_window()
 // 读取图像
 read_image(Image, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/晨光模板图像.jpg')
 get_image_size(Image, Width, Height)
 rgb1_to_gray(Image, GrayImage)
 dev_open_window_fit_image(GrayImage, 0, 0, -1, -1, WindowHandle)
 dev_display(GrayImage)
 ​
 // 预处理
 binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
 connection(Region, ConnectedRegions)
 fill_up(ConnectedRegions, RegionFillUp)
 select_shape(RegionFillUp, SelectedRegions, 'area', 'and', 22500, 23000)
 dilation_circle(SelectedRegions, RegionDilation, 3.5)
 reduce_domain(GrayImage, RegionDilation, ImageReduced)
 ​
 // 获取金字塔层数,图像监视
 determine_shape_model_params(ImageReduced, 'auto', -0.39, 0.79, 0.9, 1.1, 'auto', 'use_polarity', 'auto', 'auto', 'all', ParameterName, ParameterValue)
 inspect_shape_model(ImageReduced, ModelImages, ModelRegions, 5, 20)
 ​
 dev_set_draw ('margin')
 dev_set_line_width(3)
 ​
 // 创建模板
 create_shape_model(ImageReduced, 'auto', rad(0), rad(1), 'auto', 'auto', 'use_polarity', 20, 3, ModelID)
 write_shape_model(ModelID, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_chenguang.shm')
 clear_shape_model(ModelID)
 ​
 // 在目标图像中寻找模板图像
 read_image(ImageTest, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/晨光测试图像.jpg')
 message:= '查找模板'
 disp_message(WindowHandle, message, 'window', 16, 16, 'black', 'true')
 read_shape_model('E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_chenguang.shm',ModelID1)
 find_shape_model(ImageTest, ModelID1, rad(0), rad(1), 0.5, 0, 0, 'least_squares', 5, 0.8, Row, Column, Angle, Score)
 get_shape_model_contours(ModelContours, ModelID1, 1)
 dev_display(ImageTest)
 // 显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来
 dev_display_shape_matching_results(ModelID1, 'red', Row, Column, Angle, 1, 1, 0)
 // 匹配结束,释放模板资源
 clear_shape_model (ModelID1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于形状的模板匹配(Shape-Based) 的相关文章

  • @Transactional 事务加了 锁 为什么还有并发问题?

    一 原因分析 Spring 中通过在方法上添加注解 64 Transactional 可以很好的处理事务问题 Spring对此的处理原理是对 加了 64 Transactional 注解的方法 添加 AOP切面来时先事务管理的 而 sync
  • 聊聊微服务之什么是微服务及其好处

    一 什么是微服务 微服务就是一些协同工作的小而自治的服务 很小 xff0c 专注于做好一件事 在单一模块系统中 xff0c 随着新功能的增加 xff0c 代码库会越来越大 时间久了代码库会变得非常庞大 xff0c 以至于在什么地方修改都很困
  • RestTemplate 使用详解

    一 简介 常见的http客户端请求工具 xff1a JDK 自带 HttpURLConnectionApache HttpClientOKHttp 以上 工具虽然常用 xff0c 但对于 RESTful 操作相对不是太友好 所以 xff0c
  • BigDecimal 你使用对了吗

    背景 从事金融相关项目 xff0c 对BigDecimal应该是再熟悉不过了 xff0c 也有很多人因为不知道 不了解或使用不当导致资损事件发生 所以 xff0c 如果你从事金融相关项目 xff0c 或者你的项目中涉及到金额的计算 xff0
  • MySQL 中截取字符串的方法

    LEFT str len 从左边开始截取 xff0c 如果字符串为 null 则返回null str xff1a 被截取字符串 xff1b len xff1a 截取长度 span class token keyword SELECT spa
  • Redis 阻塞原因

    Redis 是典型的单线程架构 xff0c 所有的读写操作都是在一条主线程中完成的 当Redis用于高并发场景时 xff0c 这条线程就变的极其重要 如果它出现阻塞 xff0c 就会对应用带来致命的问题 当 Redis 出现阻塞时 xff0
  • 【pcl入门教程系列】之点云Concatenate

    简要说明 点云拼接 Concatenate 是指将点云进行累加在一起 xff0c 只是累加的方式不太一样 一种是点云的字段与维度完全一致 xff0c 数量可以不同 xff0c 两部分点云相加 xff0c 点云的数量增加了 另一种是点云的字段
  • python多线程

    单线程 from time import ctime sleep def music for i in range 2 print 34 I was listening to music s 34 ctime sleep 1 def mov
  • Nginx下配置Https证书详细过程

    一 Http与Https的区别 HTTP xff1a 是互联网上应用最为广泛的一种网络协议 xff0c 是一个客户端和服务器端请求和应答的标准 xff08 TCP xff09 xff0c 用于从WWW服务器传输超文本到本地浏览器的传输协议
  • SLAM学习记录:全局定位之gps说明

    这段时间因为各种事情耽误了 xff0c 好久没有进行更新了 xff0c 惭愧 xff01 前段时间在研究cartographer的定位建图模块 xff0c 在停更的时间主要再研究如何改善定位建图的效果 xff0c 也有一定的成效 xff0c
  • Windows操作系统名称与版本号汇总

    查看Windows系统版本号 xff1a 1 cmd xff1a winver 2 cmd xff1a systeminfo findstr Build 3 运行 xff1a dxdiag xff0c 可查看D3D版本 Windows操作系
  • 使用Onos+Ovs+Docker+Veth建立拓扑(2)

    使用Onos 43 Ovs 43 Docker 43 Veth建立拓扑 xff08 2 xff09 说明 首先在宿主机上安装一个带内核模块的ovs xff0c 然后在docker中安装一个不带内核的 这句话非常重要 可能存在的问题 Dock
  • 子网掩码 与同一网段

    子网掩码是必填的 子网掩码的作用 xff0c 通俗一点就是 就是用来分割子网和区分那些ip是同一个网段的 xff0c 那些不是同一网段的 以前以为ip地址的第三组数字就是网段 xff0c 其实大错特错了 其实同一网段指的是IP地址和子网掩码
  • 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍

    最近由于工作原因 xff0c 需要研究OpenCV中的Adaboost级联分类器 我阅读了OpenCV中所有相关得代码 xff0c 包括检测和训练部分 xff0c 发现目前OpenCV中的Adaboost级联分类器代码有以下2个特点 xff
  • 认识 UML 类关系——依赖、关联、聚合、组合、泛化

    文章目录 1 依赖 xff08 Dependency xff09 2 关联 xff08 Association xff09 3 聚合 xff08 Aggregation xff09 4 组合 xff08 复合 xff0c Compositi
  • 常用开发软件及网站

    常用开发软件及网站 点击查看
  • 电商模式术语:ABC、B2B、B2C、C2C、B2M、M2C、B2A、C2A、O2O

    电商模式分类详解 一 ABC 英文单词 xff1a Agent xff08 代理商 xff09 Business xff08 商家 xff09 Consumer xff08 消费者 xff09 ABC 模式是新型电子商务模式的一种 xff0
  • TkMapper(通用mapper)

    TkMapper的配置及使用 TkMapper主要是做单标查询 xff0c 复杂的多表查询我们还得自己写sql 官方文档 xff1a 点击查看使用的是Springboot框架使用的数据库表ums permision xff1a idpidn
  • python两个 list 获取交集,并集,差集的方法

    1 获取两个list 的交集 方法一 a 61 2 3 4 5 b 61 2 5 8 tmp 61 val for val in a if val in b 列表推导式求的两个列表的交集 print tmp 2 5 方法二 print li
  • 报错:EL1007E: Property or field 'name' cannot be found on null

    SpringBoot集成thymeleaf做开发遇到的错误 Caused by org springframework expression spel SpelEvaluationException EL1007E Property or

随机推荐

  • Docker-1.0>>>>>>初阶学习

    文章目录 Docker学习总结一 Docker的安装 xff1a 二 Docker常用命令1 帮助命令 xff1a 2 镜像命令 xff1a 3 容器命令 xff1a 三 镜像详解四 容器数据卷 xff08 持久化 xff0c 数据共享 x
  • 报错:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000

    Docker启动容器报错 docker Error response from daemon driver failed programming external connectivity on endpoint myrabbit 详细信息
  • 报错:yum install 安装时报yum doesn't have enough cached data to continue

    yum install 安装时报错 One of the configured repositories failed 未知 and yum doesn t have enough cached data to continue At th
  • Logback和Log4j详解

    文章目录 日志框架前言 一 日志简介1 什么是日志 xff1f 2 日志的用途 xff1f 二 常用的日志框架1 日志门面2 logback xff08 更快的执行速度使其成为主流 xff09 2 1 引入依赖2 2 编写xml文件2 3
  • cpu占用过高解决方案实践

    今天在查看项目服务器的时候 xff0c 发现cpu一直占用99 多 xff0c 于是就有了这篇文章 1 找到占用cpu高的进程 通过top命令来查看cpu占用高的进程有哪些 xff0c 如图 xff1a top 这里的pid代表的就是进程i
  • Java Stream流常用功能示例

    Steam流是Java8的新特性 xff0c 今个工作中经常用的功能写法 按条件过滤 collect span class token punctuation span span class token function stream sp
  • Mysql-->Binlog的查看

    一 使用Navicat查看binlog信息 1 查看binlog的信息 span class token keyword show span variables span class token operator like span spa
  • Linux开发环境配置---Java、Maven、Git和Nodejs

    Linux开发环境配置 1 Java环境 span class token comment 1 下载Java软件包 xff0c orcal或者openjdk都可以 xff0c 并上传到linux服务器 span span class tok
  • Linux下安装及简单使用nmap

    nmap是一款非常实用的扫描工具 xff0c 适用于linux windows mac三大主流平台 小编使用centos编译安装nmap 7 01版本 下载包 xff1a wget http nmap span class hljs pre
  • VNC server简单配置vnc

    linux 下VNC的配置 下面的命令可以结合远程shell 来进行 进程查找 xff1a ps ef grep i vnc 系统中一共有两个vnc xff1a 一个是系统管理自带的路径为 xff1a system gt perferenc
  • 元学习

    元学习是要学会任务中的特征表示 xff0c 从而在新任务上泛化 元学习主要解决的是学会如何学习的问题 元学习主要包括 xff1a zero shot One shot Few shot learning 元学习的主要方法包括 xff1a 基
  • windows media Foundation

    转自 xff1a https docs microsoft com en us windows desktop medfound microsoft media foundation sdk Microsoft Media Foundati
  • vscode nodemon打断点

    span class token number 1 span xff0c 修改 span class token keyword package span span class token punctuation span json spa
  • putty远程连接centos7的问题(time out)

    我在使用putty远程连接centos7时 xff0c 碰见了time out以及connection refused 的问题 现在总结一下 xff0c 以免之后再被绊倒 一 xff0c time out 问题分析 xff1a 我遇到的ti
  • Marvell 98DX3236系列交换机Uboot及内核文件烧写

    1 开发环境 开发板硬件相关 1 交换机开发板型号 RD XC3 24G4XG B 2 交换机CPU型号 98DX3236 3 交换机PHY芯片型号 88E1680 开发板软件相关 1 CPLD LC4032V 程序 ac3 24p jed
  • k8s学习笔记-部署Flannel网络

    主机列表 本次实验选择5台主机 xff0c 3台作为master主机 xff0c 2台作为node节点 节点ipOS版本hostname f安装软件192 168 0 1RHEL7 4k8s master01docker etcd flan
  • ROS教程四——编写Publisher和Subscriber节点(C++篇)

    本教程介绍如何使用C 43 43 编写发布者和订阅者节点 1 编写 Publisher Node 节点 是连接到ROS网络的可执行文件的ROS术语 现在将创建一个发布者 xff08 publisher talker xff09 节点 xff
  • 在Ubuntu系统中设置中文!!!

    建议在观看本篇前先观看上一篇修改Ubuntu系统下载源 Ubuntu系统下面可以配置中文 1 xff0c 设置 gt 系统设置 2 xff0c 选择区域与语言 单击管理已安装的语言 3 xff0c 单击添加或者删除语言 4 xff0c 选择
  • 视觉问答项目

    视觉问答项目 1 项目地址 本笔记项目包括如下 xff1a MCAN Deep Modular Co Attention Networks for Visual Question Answering 用于VQA的深层模块化的协同注意力网络
  • 基于形状的模板匹配(Shape-Based)

    称为基于边缘方向梯度的匹配 xff0c 是一种最常用也是最前沿的模板匹配算法 xff08 一 xff09 根本思想 以物体边缘的梯度相关性作为匹配标准 xff08 二 xff09 原理 提取ROI中的边缘特征 xff0c 结合灰度信息创建模