主要内容

本页采用了机器翻译。点击此处可查看英文原文。

pcregistericp

使用 ICP 算法对两个点云进行配准

说明

tform = pcregistericp(moving,fixed) 返回一个刚体变换,用于将移动点云与固定点云进行配准。

该配准算法基于迭代最近点 (ICP) 算法。要使该迭代过程达到最佳性能,需要根据您的数据调整相关属性。为了提高点云配准的准确性和效率,建议在使用 pcregistericp 之前,先使用 pcdownsample 对点云进行降采样。

当您选择 "pointToPlane""planeToPlane"(也称为广义 ICP 或 G-ICP)度量时,点云配准算法需要点云法线。如果输入点云的 Normal 属性为空,该函数会将其填充。

示例

[tform,movingReg] = pcregistericp(moving,fixed) 还会返回与固定点云对齐的变换后点云。

[tform,movingReg,rmse] = pcregistericp(moving,fixed) 还会返回对齐点之间欧几里得距离的均方根误差,可使用上述任何一种语法。

[___] = pcregistericp(moving,fixed,Name=Value) 支持上述语法中的任何参量组合,且可使用一个或多个名称-值参量指定选项。例如,pcregistericp(moving,fixed,Metric="planeToPlane") 将最小化度量设置为 "planeToPlane"

示例

全部折叠

将点云数据加载到工作区中。

ptCloud = pcread("teapot.ply");

显示已加载的点云。

pcshow(ptCloud) 
title("Teapot")

Figure contains an axes object. The axes object with title Teapot contains an object of type scatter.

创建一个变换对象,使其沿 Z 轴旋转 30 度,并进行 [5 5 10] 的平移。

rotationAngles = [0 0 30];
translation = [5 5 10];
tform1 = rigidtform3d(rotationAngles,translation);

对点云进行变换,并可视化结果。

ptCloudTformed = pctransform(ptCloud,tform1);

pcshow(ptCloudTformed)
title("Transformed Teapot")

Figure contains an axes object. The axes object with title Transformed Teapot contains an object of type scatter.

对点云进行配准。

tform = pcregistericp(ptCloudTformed,ptCloud);

将结果与正确的变换进行比较。

disp(tform1.A);
    0.8660   -0.5000         0    5.0000
    0.5000    0.8660         0    5.0000
         0         0    1.0000   10.0000
         0         0         0    1.0000
tform2 = invert(tform);
disp(tform2.A);
    0.8660   -0.5000    0.0000    5.0000
    0.5000    0.8660    0.0000    5.0000
   -0.0000   -0.0000    1.0000   10.0000
         0         0         0    1.0000

将点云数据加载到工作区中。

ld = load("livingRoom.mat");
moving = ld.livingRoomData{1};
fixed  = ld.livingRoomData{2};

可视化点云,并将显示方向设置为 y 轴。

figure
pcshowpair(moving,fixed,VerticalAxis="Y",VerticalAxisDir="Down")

Figure contains an axes object. The axes object contains 2 objects of type scatter.

使用 nonuniformGridSample 方法对点云进行降采样,以提高点云配准的效率和精度。

maxNumPoints = 12;
fixedDownsampled = pcdownsample(fixed,"nonuniformGridSample",maxNumPoints);
movingDownsampled = pcdownsample(moving,"nonuniformGridSample",maxNumPoints);

使用平面到平面(广义 ICP)配准方法对点云进行配准。

[~,movingReg] = pcregistericp(movingDownsampled,fixedDownsampled,Metric="planeToPlane");

可视化点云对齐情况,并设置显示方向为 y 轴。

figure
pcshowpair(movingReg,fixed,VerticalAxis="Y",VerticalAxisDir="Down")

Figure contains an axes object. The axes object contains 2 objects of type scatter.

将包含颜色信息的移动点云数据加载到工作区中。

moving = pcread("apartmentMoving.pcd");

将包含颜色信息的点云数据加载到工作区中。

fixed  = pcread("apartmentFixed.pcd");

对彩色点云进行可视化处理,并设置显示方向以显示 yx 平面。

figure
pcshowpair(moving,fixed,"ViewPlane","YX","ColorSource","Color")

Figure contains an axes object. The axes object contains 2 objects of type scatter.

利用平面间(广义 ICP)配准和颜色信息对彩色点云进行配准。将 Metric 参量的值设置为 planeToPlaneWithColor

[~,movingReg] = pcregistericp(moving,fixed,Metric="planeToPlaneWithColor");

可视化点云对齐结果,并设置方向以显示 yx 平面。

figure
pcshowpair(movingReg,fixed,"ViewPlane","YX","ColorSource","Color")

Figure contains an axes object. The axes object contains 2 objects of type scatter.

输入参数

全部折叠

移动点云,指定为一个 pointCloud 对象。

固定点云,指定为 pointCloud 对象。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: Metric="planeToPlane" 将 ICP 算法的最小化度量设置为 "planeToPlane"

最小化度量,指定为 "pointToPoint""pointToPlane""planeToPlane""planeToPlaneWithColor""pointToPlaneWithColor"。迭代最近点 (ICP) 算法通过根据指定的度量标准最小化两个点云之间的距离,来估计移动点云与固定点云之间的刚体变换。

基于正则化的度量指标 "pointToPlane""planeToPlane"(也称为广义 ICP 算法)虽然会在每次迭代中增加额外的计算量,但可以减少配准所需的迭代次数。这些度量在注册平面表面时能提升性能。对于包含颜色信息的点云,"pointToPlaneWithColor""planeToPlaneWithColor" 度量标准可进一步提高配准精度。

降采样方法选择使用 pcdownsample 函数对点云进行
降采样。如果选择 "pointToPlane""planeToPlane" 度量,注册算法需要点云法线。"nonuniformGridSample" 度量是在原始(未下采样)数据上计算法线,从而得到更精确的法线。因此,使用 "nonuniformGridSample" 也能提高 "pointToPoint""pointToPlane" ICP 配准方法的精度。

请将 "random""gridAverage""nonuniformGridSample" 降采样方法与 pcdownsample 结合使用,具体情况如表中所示。

度量移动点云降采样方法固定点云降采样方法
"pointToPoint""random""random"
"gridAverage""gridAverage"
"pointToPlane""gridAverage""gridAverage"
"random""nonuniformGridSample"
"planeToPlane""gridAverage""gridAverage"
"nonuniformGridSample""nonuniformGridSample"
"planeToPlaneWithColor""gridAverage""gridAverage"
"nonuniformGridSample""nonuniformGridSample"

"pointToPlaneWithColor" 度量采用了一种多尺度配准方法,其中点云配准过程是从粗略配准逐步过渡到精细配准的。粗略配准的结果将作为初始变换,输入到接下来的精细配准步骤中。因此,pcregistericp 函数不使用输入点云中的法线,因此该下采样方法不会影响其配准精度。

匹配对中的内点百分比,指定为 (0, 1] 区间内的标量。该值指定了将作为内点使用的匹配对所占的百分比。如果一对匹配点的欧几里得距离小于该点云中任意一对匹配点之间最大欧几里得距离的指定百分比,则该函数将该对匹配点视为内点。默认情况下,该函数将所有匹配对都作为内点。

仅指定 InlierRatioInlierDistance 名称-值参量即可排除异常值。如果未指定这两个参量中的任何一个,该函数将使用所有匹配的成对项,这相当于将 InlierRatio 的值设置为 1。

内点距离阈值,指定为一个标量。该值用于设定固定点云中某一点与移动点云中匹配点之间的最大距离,超过该距离时,函数将不再将其视为内点。当您拥有更精确的初始变换 InitialTransform 时,请减小此值。当初始变换中的不确定性较大时,请增加该值。请注意,增加此值可能会降低注册速度。

仅指定 InlierRatioInlierDistance 名称-值参量即可排除异常值。如果未指定这两个参量中的任何一个,该函数将使用所有匹配的成对项,这相当于将 InlierRatio 的值设置为 1。

迭代的最大次数,指定为正整数。该值指定了函数在尝试使两个点云收敛时所进行的最大迭代次数。

连续 ICP 迭代之间的容差,指定为形式为 [Tdiff Rdiff] 的两元素向量,其中 TdiffRdiff 分别表示在连续 ICP 迭代中估计的平移和旋转的绝对差值的容差。Tdiff 衡量两个平移向量之间的欧几里得距离。Rdiff 衡量以度为单位的角差。当最近三次连续迭代中估计的刚体变换之间的平均差异小于指定的容差值时,算法即停止。

初始刚体变换,指定为一个 rigidtform3d 对象。该变换必须将移动点云与固定点云对齐。如果未提供该参数,该函数将使用默认变换,将移动点云的质心移动到固定点云的质心位置。当您拥有外部粗略估计时,初始刚性变换会很有用。

注意

对于 "pointToPlaneWithColor" 度量,InitialTransform 名称-值参量的默认值为一个 rigidtform3d 对象,该对象执行恒等变换。

显示进度信息,指定为逻辑值 0 (false) 或 1 (true)。将 Verbose 指定为 true 以显示进度信息。

输出参量

全部折叠

刚性变换,返回值为 rigidtform3d 对象。刚性变换将一个移动点云映射到一个固定点云上。rigidtform3d 对象描述了刚体三维变换。迭代最近点 (ICP) 算法用于估计移动点云与固定点云之间的刚体变换。

经过变换的点云,以 pointCloud 对象的形式返回。变换后的点云与固定点云进行了对齐。

均方根误差,以正数标量形式返回,表示对齐点之间的欧几里得距离。对齐后的点是移动点云经 tform 变换器转换后与固定点云相交的结果。对于固定点云中的每个点,该算法会找到变换器生成后点云 movingReg 中距离该点最近的点,然后计算这两个点之间的欧几里得距离,最后计算 rmsermse 值越低,表示配准越精确。rmse 的计算方法是:

rmse = sqrt(sum(distance.^2,'all')/numel(distance));

算法

全部折叠

Illustration of complete point cloud registration workflow.

参考

[1] Besl, P.J., and Neil D. McKay. “A Method for Registration of 3-D Shapes.” IEEE Transactions on Pattern Analysis and Machine Intelligence 14, no. 2 (February 1992): 239–256. https://doi.org/10.1109/34.121791.

[2] Chen, Yang, and Gérard Medioni. “Object Modelling by Registration of Multiple Range Images.” Image and Vision Computing 10, no. 3 (April 1992): 145–155. https://doi.org/10.1016/0262-8856(92)90066-C.

[3] Segal, A., Haehnel, D. and S. Thrun. "Generalized-ICP". Robotics: Science and Systems V, Robotics: Science and Systems Foundation,. (June 2009): 435-442. https://doi.org/10.15607/RSS.2009.V.021.

[4] Korn, Michael, Martin Holzkothen, and Josef Pauli. "Color supported generalized-ICP." In 2014 International Conference on Computer Vision Theory and Applications (VISAPP), 592–599. Lisbon, Portugal: IEEE, 2014. https://doi.org/10.5220/0004692805920599.

[5] Park, Jaesik, Qian-Yi Zhou, and Vladlen Koltun. "Colored point cloud registration revisited." In Proceedings of the IEEE International Conference on Computer Vision (ICCV), 143-152. Venice, Italy: IEEE, 2017. htttps://doi.org/10.1109/ICCV.2017.25.

扩展功能

全部展开

版本历史记录

在 R2018a 中推出

全部展开