基于形状匹配shape_model是工程上用的最多的,掌握它就有了一张王牌。
针对ROI小区域建模板,应用场合: 模板的形状和大小一经制作完毕便不再改变,在查找模板的过程中,只会改变模板的方向和位置等来匹配目标图像中的图像。定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。匹配速度比灰度快
【创建模板参数 create_shape_model】
create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
create_shape_model (ImageROI, NumLevels, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
【检察inspect_shape_model 可选】
inspect_shape_model(Image : ModelImages, ModelRegions : NumLevels, Contrast : )
创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数
inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 8, 30)
【保留轮廓后用get_shape_model_contours 可选】
get_shape_model_contours( : ModelContours : ModelID, Level : )
获得这个模板的轮廓,用于后面的匹配
get_shape_model_contours (ShapeModel, ModelID, 1)
【搜寻匹配find_shape_model】
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度
参数设置:
find_shape_model (SearchImage, ModelID, 0, rad(360), 0.7, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
【 结果转化 vector_angle_to_rigid或 affine_trans_contour_xld】
后期结果的仿射变换和轮廓处理
【涉及参数详解】
Numlevels:
指定金字塔级数,值越大用时越少,但要保证最高层至少四个点信息,值越大模块不易识别出来,需要设低 MinScore和Greediness
判断在金字塔最高级上匹配是否失败,可find_shape_model减小NumLevels值来测试;
用 inspect_shape_model函数的输出结果来选择一个较好的金字塔层数
AngleStart、AngleExtent:
决定可能的旋转范围,find时只找这个范围内匹配
判断是否在相同物体上找到多个匹配值,如物体几乎对称的,则要控制旋转范围;
AngleStep:
指定角度范围搜索的步长,auto时可以用 get_shape_model_params查看
Optimization:
设置none所有模型点都会被存储,对特别大的模板,不设none用来减少模板点的数量。如果点数设少了,对应 Greediness设一个比较小值
还可选择预处理(pregenerated completely),'pregeneration'或'no_pregeneration'。根据内存和时间折中
Contrast:
有三个参数,第一个数值是比较低的阈值,第二个数值是比较高的阈值。第三个数值是在基于组件尺寸选择重要模型组件时所设置的阈值,可以用 determine_shape_model_params自动确定。
MinConstrast:
将模板从噪声中分离,如果灰度值波动范围是10,则应设10
物体是否具有较低的对比度,又要能识别,减小MinContrast值;
设置为'auto',最小对比度会基于模板图像中的噪声自动定义。
自动在图像和噪声近似时才用。在某些情况下为了遮挡鲁棒性,也用
Metric:
决定模板识别条件,如果设’use_polarity’,则图中物体和模板必须有相同对比度,都是亮底黑字等, 'ignore_global_polarity',在两者对比度完全相反时也能找到目标。
判断是否全局或局部地转化对比度极性,又要能识别,设置Metric合适值
Greediness:
搜索贪婪度,影响搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。
值设的太高,就找不到其中一些可见物体,这时将其设0来执行完全搜索
如果为0,使用安全的搜索启发式,只要模板在图像中存在就一定能找到,相对浪费时间。为1,使用不安全的搜索启发式,这样即使模板存在于图像中,也有可能找不到模板,但只是少数情况。如果设置Greediness=0.9,在几乎所有的情况下,总能找到模型的匹配。
MinScore:
分析模板的旋转对称和它们之间的相似度,值越大,则越相似。
物体是否有封闭区域,又要能识别,则减小MinScore值
SubPixel:
决定是否精确到亚像素级,设为’interpolation’,则会精确到,这模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,需要在时间和精度上作折中
通常为'interpolation'。如果希望最小二乘就选择'least_squares', 这样才能确保运行时间和精度的权衡。
MaxOverlap:
如果有重叠,又要能识别,增加MaxOverlap值
MaxOverlap=0, 找到的目标区域不能存在重叠, 为1,所有找到的目标区域都要返回。
使用的说明:
*保证物体在图像边缘处截断,也就是保证轮廓的清晰
速度上的优化:
*只要匹配成功,则尽可能增加参数MinScore的值
*增加Greediness值直到匹配失败,同时在需要时减小MinScore值
*如果有可能,在创建模板时使用大NumLevels,即将图像多分几个金字塔级
*限定允许的旋转范围和大小范围,调find_shape_model时调整相应参数
*尽量限定搜索ROI的区域
*Greediness值尽可能大,用模板匹配进行视频对象跟踪时,它很大程度上影响匹配速度
看了感觉怎么样?来说说吧。。。
喜欢记得关注起来!赶紧的。