3D基于表面的匹配

3D基于表面特征的匹配

find_surface_model(SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID)
  在3D场景找到曲面模型的最佳匹配。要求曲面模型SurfaceModelID必须由create_surface_model或者read_surface_model创建。要实现正确,需要3D模型包含3D点和法向量或者包含3D点并且3D模型是3D深度图由xyz_to_object_model_3d转换得到。
需要说明的是,匹配过程不会对曲面模型包含的三角片或者多边形的这些几何拓扑信息进行计算,只会使用顶点进行匹配。也就是匹配过程是点对点的匹配。所以,对于包含参数曲面的CAD模型,是无法使用该方法进行匹配的。为了减小计算量,可以使用sample_object_model_3d进行下采样,减少法向量计算过程中的时间消耗。当用来创建3D模型的数据点中包含很多噪声是,可以将’scene_normal_computation’参数设置为mls,使用mls曲面来进行平滑和抑制噪声。
  匹配到的模型的3D位姿会赋值给Pose,它表示3D模型在坐标系中的位姿。这个坐标和使用create_surface_model创建3D模型是使用的坐标系相关。此外,每次匹配都会得到一个匹配分数,赋值给Score。实际得到多大的匹配分数与是否进行位姿校正有关。如果不进行位姿校正,匹配分数是模板模型中的点近似落在匹配到的模型上的点的个数。如果使用位姿校正,匹配分数是场景中匹配模型的可见部分,数值范围介于0和1之间。
  MinScore是用来决定一次匹配成功的最低标准,匹配分数大于MinScore才认为匹配成功。当然,如果设置MinScore为0,那么每次匹配都认为是正确的。
如果设置ReturnResultHandle为true,匹配结果会返回给SurfaceMatchingResultID。更多的匹配可以通过get_surface_matching_result获取。为了防止内存泄漏,获取匹配需要使用clear_surface_matching_result释放内存。
下面说一下匹配的过程,匹配过程分为3步:

第一步:近似匹配,在场景中找到模板的大致的位姿。

首先,场景ObjectModel3D中的物体会被均匀采样。采样距离由RelSamplingDistance决定,参考曲面模型的直径给出。减小采样距离会导致采样后的点数量增加,匹配过程更加耗时,匹配结果也更加稳定。增加采样距离会导致采样后点数量减少,匹配速度更快,但是匹配结果稳定性降低。可以通过get_surface_matching_result 查看采样后的点。为了实现鲁棒匹配,每个匹配模型至少需要50-100个匹配点。
  从采样后的场景中选择一系列关键点。选中的关键点的个数由KeyPointFraction决定。例如,如果设置KeyPointFraction为0.1,那么所有采样点中只有10%会被选中作为关键点。为了使得匹配更加稳定,最好使得关键点能够覆盖模型的表面。增加关键点,会使得匹配更加稳定,但是匹配速度回很慢;减少关键点会导致匹配速度慢,但是匹配更加稳定。可以通过get_surface_matching_result查看选择的关键点。
  对于每个被选到的关键点,假设其都是在模型表面上的,基于这个假设,计算出最佳的位姿。最佳位姿是通过查找关键点来实现的,通过与场景中所有其他模型的关键点比较,找到具有相似的距离和相对的方向关键点对。这个相似是由在创建模型时使用的算子create_surface_model中的参数’feat_step_size_rel’ 和’feat_angle_resolution’ 定义的。落在物体表面上数量最多的采样点,得到的关键点最能表示物体的位姿,这个位姿就是最佳的位姿。贴近物体表面的采样点的数量可表示为位姿的分数。
  然后,从所有关键点中选择得分最高的位姿,作为近似位姿。使用参数’num_matches’设置返回的位姿的最大数量。如果禁用位姿校正,每个位姿的评分返回赋值给到Score。这个分数曲面模型在场景中可见的数量,以及场景中物体的下采样比例。只有超过最低分数的位姿会被返回到Score中。为了确定最佳的Minscore,需要在多个场景中测试匹配。
  需要注意的是这个步骤只是近似匹配。位姿pose中的错误值与使用create_surface_model时采用下采样比例成正比,一般小于模型直径的5%。
下面是通用参数设置:
  ‘num_matches’:设置返回匹配结果的个数
  ‘max_overlap_dist_rel’:在3D匹配中不能控制最大重叠区域。取而代之的是,我们可以使用    max_overlap_dist_rel’控制两个模型沿着坐标轴的方向的最小包围盒的中心点的距离。这个参数的设置时参照模型的直径。一旦找到一个具有较高分数的模型被匹配到,即这个模型的最小包围盒中心与模板的中心点十分靠近,所有其他的匹配就会被抑制。如果匹配模型不能与其他模型相互重叠,那就需要设置max_overlap_dist_rel设置为1。需要注意的是max_overlap_dist_rel与max_overlap_dist_abs是互斥的,不能同时设置。如果不小心都设置了,那只有最后一个会被使用。两个参数的区别是  max_overlap_dist_rel范围是0-1,推荐值为0.5;而max_overlap_dist_abs范围是大于0,推荐值为1,2,3
scene_normal_computation:场景中采样点的法向量计算。默认模式是’fast’,在此模式下法向量的计算是基于小的邻域的。如果模式设置为’mls’,法向量的计算是基于大的邻域并且使用更加复杂更加精确的mls方法。更加详细的描述需要参考surface_normals_object_model_3d。mls模式对噪声不敏感,多用来抑制噪声。

第二步,稀疏位姿的优化:这一步是对第一步得到的位姿进行优化,提高位姿的精度,最大化匹配分数。

进行稀疏位姿优化近似匹配时,使用的是场景中的下采样的点。优化位姿的目标是使场景中的采样点最近点的所在平面之间的距离最小。这个平面是由这个点和其方向确定的。稀疏位姿优化默认情况下是使用的。如果要禁用,需要设置’sparse_pose_refinement’ 为 ‘false’。因为一个关键点产生一个候选的位姿,候选的位姿的数量与关键点的数量成正比。对于干扰较多的大型场景,即这个场景不属于感兴趣的物体,可以设置系数优化的false.
  在稀疏位姿优化优化之后,通过计算场景中模型点的数量,并将其除以模型上总点数,重新计算每个位姿的分数。这个结果是介于0和1之间的数,并且近似是场景中模型的可见部分。这个分数比近似匹配的分数更加稳定更加精确。但是这个分数要依赖于场景的采样距离RelSamplingDistance。下面的通用参数控制稀疏位姿优化的效果。
sparse_pose_refinement:是否执行稀疏位姿优化,false,true
score_type:设置位姿分数的类别,执行位姿优化之后可以得到不同的几种分数。如果不是用稀疏或者稠密位姿优化,这个参数没有任何意义。需要注意的是,稀疏位姿优化之后分数的计算使用的是场景中下采样之后的点;而稠密位姿优化之后分数的计算使用的是场景中的所有点。下面介绍支持的分数类型。
‘num_scene_points’:计算匹配到的对象表面上的采样点的加权数量。这个加权数量的计算方法是根据到匹配到的模型的距离对每个点进行加权。这个分数比近似匹配的分数更加准确,更加稳定。它取决于场景中下采样的距离RelSamplingDistance。
‘num_model_points’:统计场景中找到的模型的下采样后的点数。如果模型点附近有场景点,就将其定义为’detected’。返回的分数0和下采样点总数之间。
‘model_point_fraction’:这是默认的分数类型。通过将num_model_points的分数值除以模型点的个数,计算可见模型点的分数。分数介于0和1之间,近似是场景中可见模型的曲面的分数。
’pose_ref_use_scene_normals’:false,或者true。位姿优化是否使用场景中的法向量。如果该参数可用,且场景中包含有顶点法向量,那么这些法向量被用来提高位姿优化的精度。因此,与模型法线方向不同的场景点的影响将减小。需要说明的是场景中必须包含法向量,否则,这个参数会被忽略。

第三步:稠密位姿优化:精确地优化第二步找到位姿。这一步的工作类似于系数优化,并且最小化场景点和模型点所在平面的距离。区别有两点:1,只有前两步中num_matches里面最佳的位姿会被执行稠密位姿优化。2,传入场景中ObjectModel3D中所有的点都会被用来优化位姿。

将场景中的所有点都用来优化位姿会增加匹配的精确,但是相对于下采样点的匹配速度回比较慢。稠密位姿优化是默认执行的,如果要禁止,需要将通用参数dense_pose_refinement设置为false。执行稠密位姿优化之后,每个匹配的分数会被重新计算。根据点到物体表面的距离大小判断其是否在物体表面,判断的阈值可以通过pose_ref_scoring_dist或者pose_ref_scoring_dist_abs来设置。由于数值的原因,稠密位姿优化的精度限制在模型尺寸的0.1%左右.精度还取决于场景点的噪声,场景点的数量和模型的形状。下面介绍通用参数,他们的数值会影响稠密位姿优化的精度和速度。
  Dense_pose_refinement: false 或true是否执行稠密位姿优化,如果设置为false,下面的参数都不会被使用。
Pose_ref_num_steps:稠密优化的迭代次数。增加迭代次数会增加精度,代价是时间消耗会增加。然而,一旦达到收敛,即使增加迭代次数,精度也不会提高。
  Pose_ref_sub_sampling:设置用来稠密优化的场景点的比例。例如,如果设置为5,每5个点中取一个点,用来优化。这是在速度和精度之间权衡的操作。增加这个数据用来匹配的点会减少速度更快,精度会降低,减小这个值会有相反的效果。
  pose_ref_dist_threshold_rel:距离阈值 = 模型直径* pose_ref_dist_threshold_rel。只有与模型距离小于这个距离的点才回被用来优化位姿,大于这个距离会被忽略。
Pose_ref_scoring_dist_rel:设置用来评分的距离阈值。距离阈值 = 模型直径*Pose_ref_scoring_dist_rel。与Pose_ref_scoring_dist_abs互斥。如果两个参数都设置,最后设置的参数有效。
pose_ref_scoring_dist_abs:参考上面
score_type:设置评分的类型。位姿优化之后会得到几种不同的评分。pose_ref_scoring_dist_rel’ 或者 'pose_ref_scoring_dist_abs’决定了距离模型表面多远的点在模型上,大于这个距离的点不在模型上。需要说明的是稀疏位姿优化之后的分数计算是基于场景中采样后的点计算的;稠密位姿优化的之后的分数计算是基于场景中的所有点的。因此,稠密位姿优化之后分数值不依赖与场景中的采样距离。
分数的类型有三种,即:
num_scene_points:计算场景中找到的物体的表面附近的加权点的个数。每个点的权重与找到的物体的距离相关。得到的分数在0和场景中的点的个数。
Num_mode_poins:统计场景中检测的到模型的点的个数。如果场景中有一个点靠近模型上的这个点,那么模型上的这个点被标记‘detected’。得到分数在0和下采样模型的上点的个数之间。
Model_point_fraction:通过将num_model_points的得分值除以模型点数,计算可建模型点分数。得到的分数介于0和1之间,并且近似于场景中模型可见的部分。这个类型是默认的分数类型。
Pose_ref_use_scene_normals:是否使用场景中法向量来优化位姿。如果设置为true,且场景中包含定点法向量的信息,那么这些法向量用来提高位姿优化的精度。因此,场景中那些鱼模型法向量发现不一致的点对位姿的影响就减弱了。需要说明的是场景的点必须要含有法向量信息,否则,这个参数不起作用。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值