与基于透视形变的模板匹配类似,基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配,并且已标定和未标定的相机图像都适用。与透视形变不同的是,它的模板不是根据边缘轮廓创建的,而是根据特征点创建的。
例如:点的位置或者相邻像素的灰度信息等都可以作为描述符。有纹理的平面图形非常适用于这种方法,尤其是对于旋转倾斜等场景中的匹配可以得到非常理想的结果。
与基于透视形变的匹配类似,基于描述符的匹配允许一定程度的透视形变,并且能在有标定和无标定的图像中进行。但是不同的是,基于描述符的匹配与物体的轮廓无关,而是与目标的纹理密切相关,或者说与目标的特征点相关。
注:基于描述符的模板匹配只能用于有纹理的图像。
创建基于描述符的模板这一步会比较耗时,所用的时间与纹理的复杂度有关。
①选择ROI。与其他几种方法类似,在创建模板之前,先读取输入图像,选择ROI,可以是任意形状,也可以包含孔洞区域,尽量包含检测目标的突出特征。然后对ROI进行裁剪,得到模糊图像。
②创建基于描述符的匹配模型。由于基于描述符的匹配模型也有无标定和有标定两种情况,因此可以针对不同的方法选择对应的模型创建方式。可以使用create_uncalib_descriptor_model算子或者create_calib_descriptor_model算子,分别对应无标定和有标定的两种情况。对于有标定的情况,还需要知道相机内部参数和位姿。
Matching / Descriptor-Based 创建一个描述符的匹配模型,无标定 create_uncalib_descriptor_model(Template : : DetectorType, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, Seed : ModelID) Template:输入参数,输入一个用于产生模型的单通道图像。 DetectorType:输入参数,探测器的类型。默认'lepetit',列表【 'harris':针对低对比度的模板图像。 'harris_binomial':一个比较好的折中,比harris快,但是比lepetit鲁棒。 】。 DetectorParamName:输入参数,探测器的参数名称。默认 [],列表【 'alpha', 'check_neighbor', 'mask_size_grd', 'mask_size_smooth', 'min_check_neighbor_diff', 'min_score', 'radius', 'sigma_grad', 'sigma_smooth', 'subpix', 'threshold'】。 DetectorParamValue:输入参数,探测器参数的值。默认 [],列表【0.08, 1, 1.2, 3, 15, 30, 1000, 'on', 'off', 'none', 'interpolation'】。 DescriptorParamName:输入参数,描述符的参数名称。默认 [],列表 【描述符尺寸参数 'depth'蕨形深度(菊花形状)。默认11,典型值5-11。 'number_ferns'蕨形数量,增加数量使得匹配更加精确,同时增加运行时间。默认30,典型值5-50。(当深度为5时,数量150;当较大深度11,数量建议10)。 'patch_size'边长的大小。默认17,典型值15-33。 模拟参数 'min_rot'最小旋转角度,。默认-180,参考值-180-0。 'max_rot'最大旋转角度。默认180,参考值0-180。 'min_scale'模板最小的比例大小,。默认0.5,典型值0.1-1.0。 'max_scale'模板最大的比例大小,。默认1.4,典型值1.0-3.5。 'tilt'倾斜值,投射倾斜描述符。 】。 DescriptorParamValue:输入参数,描述符参数的值。默认 [],列表【0.5, 1.4, 11, 21, 30, -180, 180, 'on', 'off'】。 Seed:输入参数,随机种子数量。默认42。 ModelID:输出参数,输出描述符匹配模型的句柄。 |
Matching / Descriptor-Based 创建用于校准透视匹配的描述符模型(有标定) create_calib_descriptor_model(Template : : CamParam, ReferencePose, DetectorType, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, Seed : ModelID) Template:输入参数,输入一个用于产生模型的单通道图像。 CamParam:输入参数,照相机的原点方位。 ReferencePose:输入参数,输入图像中物体参数方位。 DetectorType:输入参数,探测器的类型。默认'lepetit',列表【 'harris':针对低对比度的模板图像。 'harris_binomial':一个比较好的折中,比harris快,但是比lepetit鲁棒。 】。 DetectorParamName:输入参数,输入匹配参数名称。默认 [],列表【 'alpha', 'check_neighbor', 'mask_size_grd', 'mask_size_smooth', 'min_check_neighbor_diff', 'min_score', 'radius', 'sigma_grad', 'sigma_smooth', 'subpix', 'threshold'】。 DetectorParamValue:输入参数,输入匹配参数对应的值。默认 [],列表【0.08, 1, 1.2, 3, 15, 30, 1000, 'on', 'off', 'none', 'interpolation'】。 DescriptorParamName:输入参数,输入描述符的参数名称。默认 [],列表 【描述符尺寸参数 'depth'蕨形深度(菊花形状)。默认11,典型值5-11。 'number_ferns'蕨形数量,增加数量使得匹配更加精确,同时增加运行时间。默认30,典型值5-50。(当深度为5时,数量150;当较大深度11,数量建议10)。 'patch_size'边长的大小。默认17,典型值15-33。 模拟参数 'min_rot'最小旋转角度,。默认-180,参考值-180-0。 'max_rot'最大旋转角度。默认180,参考值0-180。 'min_scale'模板最小的比例大小,。默认0.5,典型值0.1-1.0。 'max_scale'模板最大的比例大小,。默认1.4,典型值1.0-3.5。 'tilt'倾斜值,投射倾斜描述符。 】。 DescriptorParamValue:输入参数,输入描述符参数对应的值。默认 [],列表【0.5, 1.4, 11, 21, 30, -180, 180, 'on', 'off'】。 Seed:输入参数,随机种子数量。默认42。 ModelID:输出参数,输出描述符匹配模型的句柄。 |
③搜索目标。基于描述符的模板也分两种情况,即使用find_uncalib_descriptor_model算子或者find_calib_descriptor_model算子,分别对应无标定和有标定的两种情况,返回目标的三维位姿和匹配分数。
Matching / Descriptor-Based 找到图像中描述符模型的最佳匹配(无标定) find_uncalib_descriptor_model(Image : : ModelID, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, MinScore, NumMatches, ScoreType : HomMat2D, Score) Image:输入参数,输入需要匹配的单通道图像。 ModelID:输入参数,输入描述符匹配模型句柄。 DetectorParamName:输入参数,输入探测器的参数名称。默认 [],列表【'alpha', 'check_neighbor', 'mask_size_grd', 'mask_size_smooth', 'min_check_neighbor_diff', 'min_score', 'radius', 'sigma_grad', 'sigma_smooth', 'subpix', 'threshold'】。 DetectorParamValue:输入参数,输入探测器的参数值。默认 [],列表【 0.08, 1, 1.2, 3, 15, 30, 1000, 'on', 'off'】。 DescriptorParamName:输入参数,输入描述符的参数名称。默认 [],列表【'guided_matching', 'min_score_descr'】。 DescriptorParamValue:输入参数,输入描述符对应的参数值。默认 [],列表【0.0, 0.001, 0.005, 0.01, 'on', 'off'】。 MinScore:输入参数,与模板最小的匹配分数。默认0.2,建议值【0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0】,范围 0 ≤ MinScore ≤ 1。 NumMatches:输入参数,最大发现实例数。默认1,建议值【1, 2, 3, 4】,范围≥1。 ScoreType:输入参数,匹配的类型。默认'num_points',列表【 'inlier_ratio', 'num_points'】。 HomMat2D:输出参数,匹配模型与实例之间的二维变换矩阵。 Score:输出参数,输出目标物体的匹配分数。 |
Matching / Descriptor-Based 在图像中找到校准描述符模型的最佳匹配,并返回其3D姿态(有标定)。 find_calib_descriptor_model(Image : : ModelID, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, MinScore, NumMatches, CamParam, ScoreType : Pose, Score) Image:输入参数,输入需要匹配的单通道图像。 ModelID:输入参数,输入描述符匹配模型句柄。 DetectorParamName:输入参数,输入探测器的参数名称。默认 [],列表【'alpha', 'check_neighbor', 'mask_size_grd', 'mask_size_smooth', 'min_check_neighbor_diff', 'min_score', 'radius', 'sigma_grad', 'sigma_smooth', 'subpix', 'threshold'】。 DetectorParamValue:输入参数,输入探测器的参数值。默认 [],列表【 0.08, 1, 1.2, 3, 15, 30, 1000, 'on', 'off'】。 DescriptorParamName:输入参数,输入描述符的参数名称。默认 [],列表【'guided_matching', 'min_score_descr'】。 DescriptorParamValue:输入参数,输入描述符对应的参数值。默认 [],列表【0.0, 0.001, 0.005, 0.01, 'on', 'off'】。 MinScore:输入参数,与模板最小的匹配值。默认0.2,建议值【0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0】,范围 0 ≤ MinScore ≤ 1。 NumMatches:输入参数,最大的匹配数量。默认1,建议值【1, 2, 3, 4】,范围≥1。 CamParam:输入参数,相机的原点方位。 ScoreType:输入参数,匹配的类型。默认'num_points',列表【 'inlier_ratio', 'num_points'】。 Pose:输出参数,输出目标物体的3D位姿。 Score:输出参数,输出目标物体的匹配分数。 |
④优化匹配过程。如果一次匹配的效果不理想,可以通过调整匹配参数来优化匹配结果。例如,修改搜索空间、限制图像金字塔的层级数。
⑤清除模型。匹配结束后,使用clear_component_model算子将模板清除,并释放内存资源。当目标匹配成功后,会得到目标的位置坐标、旋转角度、缩放值、二维投影矩阵和匹配分值等参数。这些参数可以作为继续匹配输入,也可以用来进行其他的视觉处理,如图像对齐、几何计算等。
Matching / Descriptor-Based 将模板清除,并释放内存资源 clear_descriptor_model( : : ModelID : ) |