<think>好的,我现在要解决用户的问题,关于在Halcon中使用匹配方式获取位置,并得到匹配轮廓的中心,同时考虑模板建立时的中心偏移,尽量利用模板XLD轮廓中心的方法。用户还指定了Halcon版本为v12,VC++2019。我需要仔细分析这个问题,并给出正确的代码示例。
首先,用户提到的是匹配得到位置后获取中心,但存在模板建立时的中心偏移。这意味着直接使用匹配返回的位置可能不准确,因为模板的轮廓中心可能与匹配结果的位置有偏差。用户希望利用模板XLD轮廓本身的中心来修正这个偏移。
我需要回忆一下Halcon的匹配流程,特别是基于形状的匹配(shape-based matching)。通常的步骤是创建模板,然后在图像中查找模板,得到匹配的位置、角度和缩放等信息。模板的创建可能基于XLD轮廓,而轮廓本身可能有自己的中心点,比如通过area_center_xld计算得到的中心。如果在创建模板时没有考虑这个中心点,那么匹配返回的位置可能基于模板的默认原点(比如图像中的原点),从而导致中心偏移。
用户的需求是,在匹配后,使用模板XLD轮廓的中心来调整最终的位置,从而消除这种偏移。因此,关键点在于如何在创建模板时记录轮廓的中心,并在匹配后应用这个中心偏移到匹配结果的位置上。
接下来,我需要考虑Halcon v12的相关算子。Halcon的版本可能会影响某些算子的参数或可用性,但一般来说,shape-based matching的基本流程在v12中应该已经存在。常用的算子包括create_shape_model、find_shape_model等,而处理XLD轮廓可能需要gen_contour_polygon_xld等。
现在,我需要分步骤思考解决方案:
1. **创建模板时的中心计算**:在创建模板之前,需要从模板的XLD轮廓计算出其中心点(RowCenter, ColumnCenter),这可以通过area_center_xld算子实现。这样,模板的原点就是这个中心点,这样在匹配时返回的位置就会直接对应到这个中心点,而不会有偏移。或者,如果模板的原点不是中心点,则需要将匹配后的位置调整这个偏移量。
2. **创建模板并保存中心信息**:在创建模板时,可能需要将模板的XLD轮廓的中心保存下来,以便后续在匹配时使用。例如,在创建模板后,保存RowCenter和ColumnCenter的值。
3. **进行匹配并调整位置**:当在目标图像中找到匹配实例时,得到的位置(Row, Column)是基于模板原点的。如果模板的原点不是轮廓中心,则需要将中心偏移应用到匹配结果上。例如,如果模板的原点是左上角,而中心是相对于原点的(DeltaRow, DeltaCol),那么匹配后的实际中心应为Row + DeltaRow,Column + DeltaCol。
但这里可能存在一个误解:当使用create_shape_model创建模板时,如果模板是基于XLD轮廓的,可能需要明确设置模板的原点。例如,在create_shape_model中,可以通过参数设置参考点的位置。如果未指定,Halcon可能默认使用轮廓的质心作为原点,或者在创建模板时自动计算。需要确认这一点。
可能的正确步骤应该是:
- 在创建模板时,先计算XLD轮廓的中心点(RowCenter, ColumnCenter)。
- 在创建模板时,将此中心点设为参考点(即模板的原点),这样在匹配结果中返回的位置(Row, Column)直接对应于该中心点,无需后续调整。
但用户提到“模板建立造成的中心偏移”,可能是指在创建模板时,模板的原点没有正确设置为轮廓中心,导致匹配后的位置需要调整。因此,正确的做法是在创建模板时,将参考点设置为轮廓的中心,这样匹配结果的位置就是该中心点的位置,不会有偏移。
因此,解决方案的关键步骤是:
1. 从模板图像中提取XLD轮廓。
2. 计算XLD轮廓的中心点(RowCenter, ColumnCenter)。
3. 创建形状模板,并将参考点设置为RowCenter和ColumnCenter。
4. 在匹配时,直接使用返回的位置作为中心点,无需调整。
或者,如果无法在创建模板时设置参考点,则需要在匹配后,根据模板的轮廓中心与模板原点的偏移量进行调整。例如,假设模板的原点是(0,0),而轮廓中心相对于原点的位置是(DeltaRow, DeltaCol),则匹配后的实际中心应该是Row + DeltaRow * cos(角度) - DeltaCol * sin(角度), Column + DeltaRow * sin(角度) + DeltaCol * cos(角度),需要考虑旋转的影响。
因此,需要明确如何在Halcon中创建模板并设置参考点。查阅Halcon的文档,create_shape_model的参数中有设置参考点的选项,即RefRow和RefColumn参数。如果在创建模板时,将参考点设为轮廓中心,那么匹配结果中的Row和Column就是该中心点的坐标,无需额外调整。
因此,正确的流程应该是:
- 提取模板轮廓XLD。
- 计算轮廓的中心点(RowCenter, ColumnCenter)。
- 使用create_shape_model创建模板,并指定RefRow和RefColumn为RowCenter和ColumnCenter。
- 在查找匹配时,得到的Row和Column即为轮廓中心的位置,不会有偏移。
这样,用户的问题就可以通过正确设置模板的参考点来解决中心偏移的问题。
接下来,需要编写相应的Halcon代码,并嵌入到VC++2019的环境中。由于用户指定了VC++2019,可能需要使用Halcon的C++接口,例如使用HDevelop生成的C++代码,或者直接使用Halcon的C++库。
现在,我需要将这些步骤转化为具体的代码示例,并确保考虑了所有细节,比如如何计算XLD轮廓的中心,如何设置参考点,以及如何在匹配后获取正确的位置。
可能的代码结构如下:
1. **提取模板XLD轮廓并计算中心**:
- 使用edges_sub_pix提取边缘。
- 使用select_shape_xld筛选轮廓。
- 使用area_center_xld计算轮廓中心。
2. **创建形状模板并设置参考点**:
- 使用create_shape_model或create_scaled_shape_model,传入RefRow和RefColumn参数为计算得到的中心。
3. **在目标图像中查找模板**:
- 使用find_shape_model获取匹配的位置、角度和缩放等参数。
4. **显示或使用匹配结果**:
- 直接使用返回的Row和Column作为中心点。
如果在创建模板时正确设置了参考点,则无需额外调整。但如果用户已经有一个模板,且无法重新创建,可能需要另一种方法,即记录模板轮廓的中心相对于模板原点的偏移量,并在匹配后进行调整。但这种情况可能需要更复杂的计算,考虑旋转和缩放的影响。
现在,我需要确保代码示例的正确性,并符合Halcon v12的语法。例如,在Halcon v12中,create_shape_model的参数可能略有不同,但基本功能应该一致。
可能的代码示例:
在HDevelop中的模板创建部分:
```cpp
// 假设模板图像已读取为ImageTemplate
// 提取XLD轮廓
edges_sub_pix(ImageTemplate, &Edges, "canny", 1, 20, 40);
// 选择轮廓(假设选择面积较大的区域)
select_shape_xld(Edges, &SelectedContours, "area", "and", 1000, 99999);
// 计算选中轮廓的中心
area_center_xld(SelectedContours, &Area, &RowCenter, &ColCenter, &PointOrder);
// 创建形状模板,设置参考点为轮廓中心
create_shape_model(ImageTemplate, 5, 0, 2*PI, "auto", "none", "use_polarity", "auto", "auto", &ModelID);
// 或者可能需要使用create_shape_model_xld,因为XLD轮廓作为输入?
// 注意:可能需要使用create_shape_model_xld来直接基于XLD创建模板
create_shape_model_xld(SelectedContours, "auto", 0, 2*PI, "auto", "auto", "use_polarity", "auto", 10, &ModelID);
// 这里需要确认Halcon v12中是否有create_shape_model_xld,或者是否需要先生成模板图像
```
这里可能存在混淆,因为create_shape_model通常基于图像区域创建模板,而create_shape_model_xld(如果存在)可以直接基于XLD轮廓创建模板。在Halcon中,正确的做法可能是使用create_shape_model_xld来基于XLD轮廓创建模板,这样可以避免从图像中提取边缘的步骤,直接使用已有的XLD轮廓。
例如,正确的流程是:
1. 提取模板的XLD轮廓(比如通过其他方式获得,如用户提供的XLD)。
2. 计算该轮廓的中心点。
3. 使用create_shape_model_xld创建模板,并指定参考点为中心点。
4. 在匹配时,find_shape_model_xld返回的位置即为轮廓中心。
但需要查阅Halcon的文档,确认create_shape_model_xld的参数是否允许设置参考点。在Halcon中,create_shape_model_xld的算子可能允许指定参考点,或者在创建模板时自动使用轮廓的质心作为参考点。
假设用户已经有一个模板XLD轮廓,需要基于它创建模板,并设置参考点为中心点。例如:
Halcon代码:
```cpp
// 假设 TemplateContour 是已有的XLD轮廓
// 计算中心
area_center_xld(TemplateContour, &Area, &RowCenter, &ColCenter, &PointOrder);
// 创建模板,设置参考点为RowCenter, ColCenter
create_shape_model_xld(TemplateContour, NumLevels, 0, 2*PI, AngleStep, "none", "use_polarity", "auto", "auto", &ModelID);
// 注意:可能需要通过 set_shape_model_origin 来设置参考点
set_shape_model_origin(ModelID, RowCenter, ColCenter);
```
这里可能需要使用create_shape_model_xld创建模板,然后使用set_shape_model_origin来调整参考点。或者,可能在创建模板时就可以指定参考点。
需要确认Halcon的算子。例如,create_shape_model的参数中有RefRow和RefColumn,但create_shape_model_xld可能没有,可能需要后续设置。
例如,在Halcon中,创建模板后可以使用set_shape_model_origin来设置参考点。因此,正确的步骤是:
1. 创建模板,可能默认参考点是原点(0,0)。
2. 计算XLD轮廓的中心点相对于原点的偏移量。
3. 使用set_shape_model_origin将参考点设为该中心点。
但这样可能需要在创建模板时,XLD轮廓的位置是基于原点的,而实际中,XLD轮廓可能位于模板图像的某个位置。因此,可能需要将XLD轮廓平移到原点,或者在创建模板时考虑其位置。
这部分可能比较复杂,可能需要更详细的步骤。
或者,另一种方法是,在创建模板时,XLD轮廓的位置是基于其自身的坐标的,参考点设置为该轮廓的中心,这样在匹配时,返回的位置就是该中心点的坐标。
假设用户已经正确设置了参考点,那么代码可能如下:
在模板创建阶段:
```cpp
// 读取模板图像,提取XLD轮廓
read_image(&Image, "模板图像路径");
edges_sub_pix(Image, &Edges, "canny", 1, 20, 40);
// 假设已经得到模板轮廓 TemplateContour
area_center_xld(TemplateContour, &Area, &RowCenter, &ColCenter, &PointOrder);
create_shape_model_xld(TemplateContour, "auto", 0, 2*PI, "auto", "auto", "use_polarity", "auto", 10, &ModelID);
// 设置参考点为中心点
set_shape_model_origin(ModelID, RowCenter, ColCenter);
```
然后在匹配阶段:
```cpp
// 在目标图像中查找模板
find_shape_model(ImageTarget, ModelID, 0, 2*PI, 0.7, 0, 0.5, "least_squares", 0, 0.9, &Row, &Column, &Angle, &Score);
// 此时,Row和Column即为模板轮廓中心的位置
```
但需要确认set_shape_model_origin是否在Halcon v12中存在,并且是否会影响匹配结果的位置。根据Halcon文档,set_shape_model_origin用于设置模板的原点,即参考点,因此匹配结果的位置就是该参考点的坐标。因此,这样处理后,Row和Column应该直接对应轮廓中心,无需调整。
因此,完整的代码示例应该包括模板创建时计算中心并设置参考点,然后在匹配时直接使用返回的位置作为中心点。
现在,需要将此Halcon代码转换为VC++2019中的C++代码,使用Halcon的C++接口。例如,使用HalconCpp命名空间中的类,如HImage、HXLDCont、HShapeModel等。
可能的VC++代码结构如下:
```cpp
#include "HalconCpp.h"
using namespace HalconCpp;
void main()
{
// 模板创建部分
HImage ImageTemplate;
ImageTemplate.ReadImage("template_image.png");
HXLDCont Edges;
Edges = ImageTemplate.EdgesSubPix("canny", 1, 20, 40);
HXLDCont SelectedContours;
SelectedContours = Edges.SelectShapeXld("area", "and", 1000, 99999);
HTuple Area, RowCenter, ColCenter, PointOrder;
SelectedContours.AreaCenterXld(&Area, &RowCenter, &ColCenter, &PointOrder);
HShapeModel ModelID;
CreateShapeModelXld(SelectedContours, "auto", 0, HTuple(2).Rad(), "auto", "auto", "use_polarity", "auto", 10, &ModelID);
ModelID.SetShapeModelOrigin(RowCenter, ColCenter);
// 保存模型(可选)
ModelID.WriteShapeModel("model.shm");
// 在目标图像中查找
HImage ImageTarget;
ImageTarget.ReadImage("target_image.png");
HTuple Row, Column, Angle, Score;
FindShapeModel(ImageTarget, ModelID, 0, HTuple(2).Rad(), 0.7, 0, 0.5, "least_squares", 0, 0.9, &Row, &Column, &Angle, &Score);
// 输出结果
for (int i = 0; i < Row.Length(); i++)
{
printf("实例 %d: 中心坐标 (%.2f, %.2f), 角度: %.2f, 得分: %.2f\n",
i+1, (double)Row[i], (double)Column[i], (double)Angle[i].Deg(), (double)Score[i]);
}
}
```
需要注意的几点:
1. Halcon的C++接口中,算子的名称可能与HDevelop中的略有不同,通常采用驼峰命名法,如CreateShapeModelXld而不是create_shape_model_xld。
2. 角度的转换,比如从弧度到度可能需要使用Rad()和Deg()方法。
3. 异常处理,例如检查轮廓是否存在,匹配是否成功等。
4. 需要包含正确的Halcon头文件和库路径,并在项目设置中配置。
此外,用户提到使用Halcon v12和VC++2019,需要确保Halcon库的版本兼容性。可能需要使用Halcon 12对应的C++库,并在VC++2019中正确配置。
另一个可能的错误点是,在创建模板时,是否应该使用XLD轮廓直接创建形状模型。在Halcon中,create_shape_model通常基于图像区域,而create_shape_model_xld可能用于基于XLD轮廓创建模型,但需要确认该算子在v12中是否存在。例如,在较新的Halcon版本中,create_shape_model_xld可能被引入,但在v12中可能不可用。如果不可用,可能需要使用其他方法,如将XLD转换为区域,然后创建模板。
如果create_shape_model_xld在v12中不存在,则需要调整方法:
1. 将XLD轮廓转换为区域:使用gen_region_contour_xld。
2. 创建形状模型基于该区域。
但这样可能失去亚像素精度,因此可能影响匹配精度。此时,更好的方法是确保在模板图像中提取轮廓,并基于该图像区域创建形状模型,同时设置参考点为中心。
例如,替代代码:
```cpp
// 提取模板图像的区域
HRegion TemplateRegion;
TemplateRegion.GenRegionContourXld(SelectedContours, "filled");
// 创建形状模型,使用TemplateRegion作为模板区域
HShapeModel ModelID;
CreateShapeModel(ImageTemplate, 5, 0, HTuple(2).Rad(), "auto", "none", "use_polarity", "auto", "auto", &ModelID);
// 设置参考点为中心点
ModelID.SetShapeModelOrigin(RowCenter, ColCenter);
```
但这种方法可能不如直接使用XLD轮廓精确,特别是在亚像素级别。
因此,如果Halcon v12支持create_shape_model_xld,则优先使用该方法。否则,可能需要使用其他方法。
根据Halcon的版本更新日志,create_shape_model_xld可能是在较新的版本中添加的。例如,Halcon 12可能没有这个算子,而是在之后的版本中引入。因此,在v12中,可能需要使用传统的方法:基于图像区域创建模板,并设置参考点。
此时,正确的流程是:
1. 在模板图像中提取XLD轮廓,计算其中心。
2. 将该轮廓转换为区域,并创建形状模型。
3. 设置参考点为中心点。
代码示例:
```cpp
// 提取模板轮廓并计算中心
HImage ImageTemplate;
ImageTemplate.ReadImage("template.png");
HXLDCont Edges = ImageTemplate.EdgesSubPix("canny", 1, 20, 40);
HXLDCont SelectedContours = Edges.SelectShapeXld("area", "and", 1000, 99999);
HTuple Area, RowCenter, ColCenter, PointOrder;
SelectedContours.AreaCenterXld(&Area, &RowCenter, &ColCenter, &PointOrder);
// 将XLD轮廓转换为区域
HRegion TemplateRegion;
TemplateRegion.GenRegionContourXld(SelectedContours, "filled");
// 创建形状模型,使用模板图像和区域
HShapeModel ModelID;
CreateShapeModel(ImageTemplate, 5, 0, HTuple(360).Rad(), "auto", "none", "use_polarity", 30, 10, &ModelID);
// 设置参考点为中心
ModelID.SetShapeModelOrigin(RowCenter, ColCenter);
// 保存模型
ModelID.WriteShapeModel("model.shm");
// 在目标图像中查找
HImage ImageTarget;
ImageTarget.ReadImage("target.png");
HTuple Row, Column, Angle, Score;
FindShapeModel(ImageTarget, ModelID, 0, HTuple(360).Rad(), 0.7, 0, 0.5, "least_squares", 0, 0.9, &Row, &Column, &Angle, &Score);
// 输出中心坐标
for (int i = 0; i < Row.Length(); i++) {
cout << "Center: (" << Row[i].D() << ", " << Column[i].D() << ")" << endl;
}
```
这里需要注意,GenRegionContourXld生成的区域可能不如XLD精确,特别是在边缘的亚像素位置,这可能导致模板匹配的精度下降。因此,用户的问题中提到要“尽量利用模板xld轮廓中心的方式实现”,所以可能需要找到一种在v12中基于XLD创建模板并正确设置参考点的方法。
如果Halcon v12不支持create_shape_model_xld,可能需要寻找其他方法,例如:
1. 在模板图像中,根据XLD轮廓的位置,生成一个匹配模型,其参考点设置为XLD轮廓的中心。
2. 在匹配时,返回的位置即为参考点的位置,即轮廓中心。
此时,关键在于正确设置参考点,而无论模板是基于区域还是XLD。
总结,正确的步骤应该是:
- 计算模板XLD轮廓的中心坐标。
- 创建形状模型,并设置参考点为该中心坐标。
- 在匹配时,得到的Row和Column即为该中心点的位置,无需调整。
因此,即使用户的模板是基于图像区域创建的,只要参考点正确设置为XLD轮廓的中心,就能消除中心偏移的问题。
现在,回到用户的提问,最终的代码示例需要包括:
1. 模板创建部分:提取XLD,计算中心,创建模板并设置参考点。
2. 匹配部分:查找模板,获取中心坐标。
在VC++2019中的代码示例应反映这些步骤,并正确使用Halcon的C++接口。
可能的VC++代码如下:
```cpp
#include "HalconCpp.h"
#include <iostream>
using namespace HalconCpp;
int main()
{
try
{
// 1. 模板创建
HImage imgTemplate;
imgTemplate.ReadImage("template.png");
// 提取XLD轮廓
HXLDCont edges = imgTemplate.EdgesSubPix("canny", 1.0, 20, 40);
// 筛选轮廓(示例:按面积筛选)
HXLDCont selectedContours = edges.SelectShapeXld("area", "and", 1000, 9999999);
// 计算轮廓中心
HTuple area, rowCenter, colCenter, pointOrder;
selectedContours.AreaCenterXld(&area, &rowCenter, &colCenter, &pointOrder);
// 创建形状模型,并设置参考点为中心
HShapeModel model;
model.CreateShapeModel(imgTemplate, 5, 0, HTuple(360).Rad(), "auto", "none", "use_polarity", 30, 10);
model.SetShapeModelOrigin(rowCenter, colCenter);
// 保存模型(可选)
model.WriteShapeModel("shape_model.shm");
// 2. 在目标图像中匹配
HImage imgTarget;
imgTarget.ReadImage("target.png");
HTuple row, col, angle, score;
model.FindShapeModel(imgTarget, 0, HTuple(360).Rad(), 0.7, 0, 0.5, "least_squares", 0, 0.9, &row, &col, &angle, &score);
// 输出结果
for (int i = 0; i < row.Length(); i++)
{
std::cout << "匹配实例 " << i + 1 << ": 中心坐标 (" << col[i].D() << ", " << row[i].D()
<< "), 角度: " << angle[i].D() * 180 / PI << "°, 得分: " << score[i].D() << std::endl;
}
}
catch (HException &ex)
{
std::cerr << "Halcon异常: " << ex.ErrorMessage() << std::endl;
}
return 0;
}
```
需要注意的几点:
1. 在创建形状模型时,使用CreateShapeModel方法,参数包括图像、对比度、最小角度、最大角度等。
2. SetShapeModelOrigin用于设置参考点为计算得到的轮廓中心。
3. FindShapeModel返回的位置(row, col)即为参考点的位置,即轮廓中心。
4. 角度单位可能需要转换,如从弧度到度。
5. 需要处理可能的异常,例如未找到轮廓或匹配失败。
如果用户使用的是基于XLD的模板创建(如create_shape_model_xld),则代码需要相应调整,但假设在v12中不可用,因此使用基于图像区域的方法。
用户需要确保模板图像中的对象位置与XLD轮廓提取后的位置一致,否则计算的中心可能不准确。此外,如果模板图像中的对象有多个轮廓,可能需要合并轮廓后再计算中心,或者确保选择的轮廓是正确的主轮廓。
最后,用户需要根据实际图像调整参数,如边缘检测的阈值、筛选条件、匹配分数阈值等。</think>在Halcon中通过模板匹配获取目标位置,并利用模板XLD轮廓中心校正偏移的步骤如下(适用于Halcon 12及VC++ 2019环境):
---
### **核心思路**
1. **模板准备阶段**:提取模板的XLD轮廓并计算其几何中心,将其设为匹配模型的参考点。
2. **匹配阶段**:直接使用匹配结果中的坐标(已基于参考点修正),无需额外偏移计算。
---
### **C++代码实现**
```cpp
#include "HalconCpp.h"
#include <iostream>
using namespace HalconCpp;
int main()
{
try
{
//---------------------------
// 1. **模板创建与参考点设置**
//---------------------------
HImage imgTemplate;
imgTemplate.ReadImage("template.png"); // 读取模板图像
// 提取XLD轮廓
HXLDCont edges = imgTemplate.EdgesSubPix("canny", 1.0, 20, 40);
// 筛选有效轮廓(示例:按面积过滤)
HXLDCont selectedContours = edges.SelectShapeXld("area", "and", 1000, 99999);
// 计算XLD轮廓的几何中心
HTuple area, rowCenter, colCenter, pointOrder;
selectedContours.AreaCenterXld(&area, &rowCenter, &colCenter, &pointOrder);
// 创建形状匹配模型,并设置参考点为轮廓中心
HShapeModel model;
model.CreateShapeModel(
imgTemplate, // 模板图像
5, // 金字塔层级(自动优化)
0, // 起始角度(弧度)
HTuple(360).Rad(), // 角度范围(0~360度)
"auto", // 角度步长(自动计算)
"none", // 不限制缩放
"use_polarity", // 对比度极性敏感
30, // 对比度阈值
10 // 最小轮廓尺寸
);
model.SetShapeModelOrigin(rowCenter, colCenter); // 关键:设置参考点为中心
// 保存模型(可选)
model.WriteShapeModel("model.shm");
//---------------------------
// 2. **目标图像匹配**
//---------------------------
HImage imgTarget;
imgTarget.ReadImage("target.png"); // 读取待检测图像
// 执行匹配
HTuple row, col, angle, score;
model.FindShapeModel(
imgTarget, // 目标图像
0, // 起始角度(弧度)
HTuple(360).Rad(), // 角度范围
0.7, // 最小匹配分数
1, // 最大匹配实例数
0.5, // 最大重叠度
"least_squares", // 亚像素精度模式
0, // 金字塔层级(0=最高精度)
0.9, // 贪婪度
&row, &col, &angle, &score
);
//---------------------------
// 3. **结果输出**
//---------------------------
for (int i = 0; i < row.Length(); i++)
{
std::cout << "实例 " << i + 1 << ":\n"
<< " 中心坐标: (" << col[i].D() << ", " << row[i].D() << ")\n"
<< " 旋转角度: " << angle[i].D() * 180 / M_PI << "°\n"
<< " 匹配得分: " << score[i].D() << std::endl;
}
}
catch (HException &ex)
{
std::cerr << "Halcon错误: " << ex.ErrorMessage() << std::endl;
}
return 0;
}
```
---
### **关键解释**
1. **XLD中心计算**
通过 `AreaCenterXld` 算子计算轮廓的几何中心 (`rowCenter`, `colCenter`),此中心将作为模板的参考点。
2. **参考点设置**
`SetShapeModelOrigin` 将模板的参考点设为XLD轮廓中心,确保匹配结果直接返回该中心坐标,避免偏移。
3. **亚像素精度**
使用 `"least_squares"` 参数提升匹配精度,适合对定位要求高的场景。
---
### **注意事项**
- **图像预处理**:确保模板图像与目标图像的边缘提取参数(如 `edges_sub_pix` 的滤波器和阈值)一致。
- **参考点验证**:通过 `dev_display` 显示参考点位置,确认其与轮廓中心重合。
- **多实例处理**:若存在多个匹配结果,可通过 `score` 阈值过滤低质量匹配。
通过上述方法,可直接获得基于XLD轮廓中心的精确匹配位置,消除模板建立时的坐标偏移问题。