目录
前言
第一次在CSDN写博客,准备写一个简单的形状匹配算子的用法及实现的介绍。
一、基于形状的模板匹配是什么?
基于形状的模板匹配,也称为基于边缘方向梯度的匹配,是一种最常用也最前沿的模板匹配算法。该算法以物体边缘的梯度相关性作为匹配标准。
二、具体实现
1.算子介绍
create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)//创建形状模板
Template:模板图像
NumLevels:金字塔的层数,可设为“auto”或0—10的整数
AngleStart:模板旋转的起始角度
AngleExtent:模板旋转角度范围
AngleStep:旋转角度的步长
Optimization:设置模板优化和模板创建方法
Metric:匹配方法设置
Contrast:设置对比度
MinContrast:设置最小对比度
ModelID:输出模板句柄
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)//模板匹配
Image :搜索图像
ModelID:模板ID
AngleStart:搜索起始角度
AngleExtent:搜索角度范围
MinScore: 最小匹配分值,
NumMatches:匹配个数
MaxOverlap:重叠系数
SubPixel:精度控制
NumLevels:搜索时使用金字塔层数.
Greediness:用于控制定位加速
2.关键代码实现
2.1生成模板(部分代码)
HTuple RowBegin,ColBegin,RowEnd,ColEnd;//定义框选矩形区域的两个坐标点
DrawRectangle1(m_WindowHandle,&RowBegin,&ColBegin,&RowEnd,&ColEnd);//框选矩形函数
HImage ho_Rectangle1;//定义矩形区域
GenRectangle1(&ho_Rectangle1,RowBegin,ColBegin,RowEnd,ColEnd);//根据框选矩形的两个坐标点生产矩形
HImage ho_ReduceImage;
ReduceDomain(m_Image,ho_Rectangle1,&ho_ReduceImage);//剪裁图像
CreateShapeModel(ho_ReduceImage, 5, HTuple(0).TupleRad(), HTuple(360).TupleRad(),
HTuple(0.4735).TupleRad(), (HTuple("none").Append("no_pregeneration")), "use_polarity",
((HTuple(10).Append(11)).Append(9)), 4, &m_ModelID);//生成模板
HImage ho_ModelContours;
GetShapeModelContours(&ho_ModelContours, m_ModelID, 1);//获取模板轮廓
HTuple hv_ModelRegionArea,hv_RefRow,hv_RefColumn;
AreaCenter(ho_Rectangle1, &hv_ModelRegionArea, &hv_RefRow, &hv_RefColumn);//获取区域中心坐标(还有面积)
HTuple hv_HomMat2D;
VectorAngleToRigid(0, 0, 0, hv_RefRow, hv_RefColumn, 0, &hv_HomMat2D);//从点和角度计算刚性仿射变换
HImage ho_TransContours;
AffineTransContourXld(ho_ModelContours, &ho_TransContours, hv_HomMat2D);//对XLD轮廓进行仿射2D变换
if (HDevWindowStack::IsOpen())
DispObj(ho_TransContours,HDevWindowStack::GetActive());
WriteShapeModel(m_ModelID,qModelPath.toStdString().c_str());//保存模板文件
2.2模板匹配(部分代码)
HTuple m_ModelID;
ReadShapeModel(HTuple("./ShmList/test/chilun.shm"),&m_ModelID);//读取模板文件
HImage ho_ModelContours;
GetShapeModelContours(&ho_ModelContours, m_ModelID, 1);//生成模板轮廓
HTuple hv_Row,hv_Column,hv_Angle,hv_Score;
FindShapeModel(m_Image,m_ModelID,HTuple(0).TupleRad(), HTuple(360).TupleRad(),
0.5, 0, 0.5, "least_squares", (HTuple(5).Append(1)), 0.6, &hv_Row, &hv_Column,
&hv_Angle, &hv_Score);//模板匹配算子
HTuple hv_ScoreMax;
if(hv_Score.Length()>0)
{
TupleMax(hv_Score,&hv_ScoreMax);//获取最大分数值
HTuple hv_Index;
TupleFind(hv_Score,hv_ScoreMax,&hv_Index);寻找分数索引
HTuple hv_HomMat2D;
HomMat2dIdentity(&hv_HomMat2D);//生产仿射矩阵
HomMat2dRotate(hv_HomMat2D,HTuple(hv_Angle[hv_Index]), 0, 0, &hv_HomMat2D);//仿射矩阵旋转角度
HomMat2dTranslate(hv_HomMat2D, HTuple(hv_Row[hv_Index]), HTuple(hv_Column[hv_Index]),&hv_HomMat2D);//仿射矩阵平移
HImage ModelXld;
AffineTransContourXld(ho_ModelContours,&ModelXld,hv_HomMat2D);//XLd仿射2D变换
if (HDevWindowStack::IsOpen())
{
DispObj(ModelXld,HDevWindowStack::GetActive());//显示
}
}
ClearShapeModel(m_ModelID);
总结
实现后的软件界面截图:
生成模板界面
模板匹配界面
总体步骤为:
1、选择区域
2、生成模板
3、模板匹配
4、将模型轮廓进行仿射变换后显示
5、释放资源