Qt与halcon联合开发实现基于形状的模板匹配


目录

前言

一、基于形状的模板匹配是什么?

二、具体实现

1.算子介绍

2.关键代码实现

总结


前言

第一次在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、释放资源

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值