《创建灰度值模板》
创建基于灰度值模版(基于归一化相关性模版)
*参数1: 输入的图片 做模版的图片
*参数2: 金字塔层级,设置为auto自动选择金字塔层级, 值越大,匹配速度越快, 不同分辨率下的模版
*参数3: 起始角度 rad(-180) 转成弧度数
*参数4:结束角度
*参数5:角度递增量
*参数6:'use_polarity' 使用极性 ignore_global_polarity 忽略极性
*参数7 ModelID 模版的id 获取匹配的结果可以通过id进行获取
create_ncc_model (ImageReduced, 'auto', rad(-180), rad(180), 'auto', 'use_polarity', ModelID)
《查找模板匹配结果》
find_ncc_model (Image1, ModelID, rad(-180), rad(180), 0.8, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)
*1 输入的图片
*2 模版id
*3、4 开始角度和结束角度
*5 最小得分
*6 匹配的个数 1 就是1个,0匹配多个
*7 重叠率 0.5 超出0.5 谁的得分高 就匹配到谁,
*8 是否启用亚像素级别 true使用
*9 金字塔层级 0 保留的细节多,计算量比较大
*10、11 模版匹配点的坐标
*12 模版匹配结果的角度
*13 模版匹配的得分
《释放模板句柄》
clear_ncc_model (ModelID) // 释放模版句柄
《模板的导入》
read_ncc_model ('1.shm', ModelID) // 导入模版
*参数1 模板的路径
*参数2 输出的图片
《模板的导出》
write_ncc_model (ModelID,'1.shm' )//导出模版
*参数1 输入的图片
*参数2 导出的路径
《基于形状的模板》
create_scaled_shape_model (ImageReduced, 'auto', rad(-45), rad(90), 'auto', 0.8, 1.1, 'auto', 'auto', 'ignore_global_polarity', 'auto', 'auto', ModelID)
*参数6、7 缩放比例最小值和最大值
*参数8 缩放的递增量
*参数9 Optimization优化方式 自动模型优化方式
*参数11 Contrast: 对比度 自动计算对比度
*参数12 MinContrast 最小的对比度
《获取模板中心点坐标》
get_shape_model_contours (ModelContours, ModelID, 1) // 获取模版轮廓信息
《刚性的仿射变换》
vector_angle_to_rigid (0, 0, 0, Row, Column, 0, HomMat2D)
*从第一个点的位置、角度变换到第二点的位置、角度
*HomMat2D 输出参数 获取变换矩阵
把 坐标原点 (0,0) ,不旋转(角度 0) 移动到 (Row, Column) ,仍然不旋转(角度 0) 生成一个纯平移矩阵 ,存到 HomMat2D
《把变换矩阵使用指定轮廓》
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
ModelContours:模板的原始轮廓(默认在原点)
HomMat2D:移动指令(移到哪、转多少)
ContoursAffineTrans:移动后的轮廓(画在图上就是匹配框)
《模板匹配》
find_scaled_shape_model (Image1, ModelID, rad(-45), rad(90), 0.8, 1.1, 0.5, 0, 0.5, 'least_squares', 0, 0.8, Row1, Column1, Angle, Scale, Score)
*参数SubFixel:是否启用亚像素级别 None:不启用,least_squares 启用亚像素级匹配 最小二乘法查找亚像素
*参数Greediness 贪婪度(值越大查找速度越快)
Image1
在找在这张图片里搜索目标。
ModelID
用啥找 用 create_scaled_shape_model 创建好的模板 ID。
rad(-45)
最小角度 目标最少能旋转 -45°(逆时针 45 度)
rad(90)
最大角度 目标最多能旋转 90°(顺时针 90 度)
0.8
最小缩放 目标最小可以缩到原来的 0.8 倍
1.1
最大缩放 目标最大可以放到原来的 1.1 倍
0.5
最小得分(最关键!)
得分范围:0 ~ 1
低于 0.5 的结果直接丢掉
数值越高,匹配越准,但更容易找不到
你第三个框不准,就是这个值设太低了
0
最多找几个目标
0 = 找到所有符合的目标
写 1 = 只找一个
0.5
金字塔重叠度不用管,默认 0.5 就行。
'least_squares'
精度模式 least_squares = 高精度亚像素定位
0
插值默认 0 即可。
0.8
贪婪度
越大:找得越快,但可能漏检
越小:找得越准,但更慢0.8 是平衡值。
输出结果
Row1, Column1
目标中心坐标(画框用)
Angle
目标旋转角度
Scale
目标缩放倍数
Score
匹配得分 越接近 1 越准,低于 0.5 都是误匹配
《展示基于形状模版匹配结果》
dev_display_shape_matching_results (ModelID, 'red', Row1, Column1, Angle, Scale, Scale, 0)
ModelID你做好的模板 ID,用来画轮廓。
'red' 匹配框画成红色,也可以写 'green'、'blue'。
Row1, Column1 匹配到的目标中心位置。
Angle 目标旋转角度。
Scale, Scale 目标缩放大小(等比例缩放写两个一样就行)。
0 固定参数,直接写 0 就完事。
《仿射变换查找结果》
*基础的变换 平移变换、旋转变换、缩放变换、倾斜变换
for Index := 0 to |Row1|-1 by 1
*1创建初始化的仿射矩阵
hom_mat2d_identity (HomMat2DIdentity)
*2 生成平移变换矩阵 参数1初始化的矩阵 参数2和参数3移动的位置
hom_mat2d_translate (HomMat2DIdentity,Row1[Index], Column1[Index], HomMat2DTranslate)
*3 生成一个旋转矩阵 参数1是平移矩阵
hom_mat2d_rotate (HomMat2DTranslate, Angle[Index],Row1[Index], Column1[Index], HomMat2DRotate)
*4 生成一个缩放矩阵 参数1是旋转矩阵
hom_mat2d_scale (HomMat2DRotate, Scale[Index], Scale[Index],Row1[Index], Column1[Index], HomMat2DScale)
*5 使用矩阵
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
*6展示变换之后轮廓信息
dev_display (ContoursAffineTrans)
平移变换 hom_mat2d_translate
作用:移动位置把轮廓从原点 → 移到目标中心。
旋转变换 hom_mat2d_rotate
作用:调整角度让框跟着目标的旋转角度一起转。
缩放变换 hom_mat2d_scale
作用:调整大小让框的大小匹配目标大小。
倾斜变换(你没用到)
hom_mat2d_slant作用:拉斜、歪着变换(一般匹配不用)