主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

3次元点群のレジストレーションと繋ぎ合わせ

この例では,反復最近接点(ICP)アルゴリズムにより複数の点群を組み合わせて3次元シーンを再構成する方法を説明します。

概要

この例では,Kinectを使ってキャプチャした点群の集合を繋ぎ合わせて,より大きいシーンの3次元ビューを構成します。2例ではICPがつの連続する点群に適用されます。このタイプの再構成は,オブジェクトの3次元モデルを開発したり,同时定位和地图(大满贯)に使用する3次元世界地図を作成するのに使用できます。

2つの点群のレジストレーション

外部= fullfile (toolboxdir (“愿景”),“visiondata”“livingRoom.mat”);负载(功能);%提取两个连续的点云,使用第一个点云为%的参考。ptCloudRef = livingRoomData {1};ptCloudCurrent = livingRoomData {2};

レジストレーションの質は,データのノイズおよびICPアルゴリズムの初期設定によって異なります。前処理手順を適用してノイズをフィルター処理するか,データに適した初期プロパティ値を設定することができます。ここでは,ボックスグリッドフィルターを使用したダウンサンプリングによりデータを前処理し,グリッドフィルターのサイズを10厘米に設定します。グリッドフィルターは点群の空間を立方体に分割します。各立方体内の点は,そのX, Y, Z座標の平均を取ることで単一の出力点に結合されます。

gridSize = 0.1;固定= pcdownsample (ptCloudRef,“gridAverage”, gridSize);移动= pcdownsample (ptCloudCurrent,“gridAverage”, gridSize);请注意,下采样步骤不仅加快了注册速度,%,但也可以提高准确度。

2つの点群の位置を合わせるには,ICPアルゴリズムを使って,ダウンサンプリングされたデータに対し3次元剛体変換の推定を行います。ここでは最初の点群を参照として使用し,推定した変換を元の2番目の点群に適用します。オーバーラップする点を処理するには,シーンの点群を,位置合わせした点群とマージする必要があります。

まず2番目の点群を最初の点群と位置合わせするための剛体変換を求めます。これを使用して2番目の点群を,最初の点群によって定義された参照座標系に変換します。

移动,固定,“指标”“pointToPlane”“推断”,真正的);ptCloudAligned = pctransform (ptCloudCurrent tform);

これで,レジストレーション済みのデータを使ってワールドシーンを作成できるようになりました。オーバーラップする領域は,1.5厘米のボックスグリッドフィルターでフィルター処理されます。結果として得られるシーンの点群で必要とされるストレージ容量を抑えるにはマージサイズを大きくし,シーンの解像度を高めるにはマージサイズを小さくします。

mergeSize = 0.015;ptCloudScene = pcmerge(ptclouddref, ptclouddaligned, mergeSize); / /合并%可视化输入图像。图subplot(2,2,1) imshow(ptCloudRef.Color) title(“第一输入图像”“颜色”' w ') drawnow subplot(2,2,3) imshow(ptCloudCurrent.Color) title(“第二个输入图像”“颜色”' w ') drawnow想象世界场景。次要情节(2 2(2、4))pcshow (ptCloudScene,“VerticalAxis”“Y”“VerticalAxisDir”“下来”)标题(“初始世界舞台”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”

图中包含3个轴。初始世界场景包含一个分散类型的对象。第一个输入图像包含一个image类型的对象。第二个输入图像包含一个类型为image的对象。

drawnow

点群のシーケンスの繋ぎ合わせ

より大きな3次元シーンを作成するには,上記と同じ手続きを繰り返して点群のシーケンスを処理します。最初の点群を使用して,参照座標系を規定します。各点群を参照座標系に変換します。この変換はペアワイズ変換の乗算です。

%存储累积转换的转换对象。accumTform = tform;figure hax = pcshow(ptCloudScene,“VerticalAxis”“Y”“VerticalAxisDir”“下来”);标题(“更新世界舞台”%设置坐标轴属性以加快渲染速度hax。CameraViewAngleMode =“汽车”;hScatter = hAxes.Children;i = 3:length(livingRoomData) ptCloudCurrent = livingRoomData{i};%使用以前的移动点云作为参考。固定=移动;移动= pcdownsample (ptCloudCurrent,“gridAverage”, gridSize);申请ICP注册。移动,固定,“指标”“pointToPlane”“推断”,真正的);将当前点云转换为参考坐标系统%由第一个点云定义。accumTform = affine3d (tform。T * accumTform.T);ptclouddalsigned = pctransform(ptCloudCurrent,伏转换);%更新世界场景。ptCloudScene = pcmerge(ptCloudScene, ptCloudAligned, mergeSize);想象世界场景。hScatter。XData = ptCloudScene.Location (: 1);hScatter。YData = ptCloudScene.Location (:, 2);hScatter。ZData = ptCloudScene.Location (: 3);hScatter。CData = ptCloudScene.Color;drawnow (“limitrate”结束

图中包含一个坐标轴。标题为“更新的世界场景”的轴包含一个类型为scatter的对象。

%在录制过程中,Kinect指向下方。形象化%结果更容易,让我们转换数据,使地平面是平行于X-Z平面。角= -π/ 10;一个= 1,0,0,0;...0, cos(角)sin(角),0;...0, -sin(角)cos(角),0;...0 0 0 1];ptCloudScene = pctransform(ptCloudScene, affine3d(A));pcshow (ptCloudScene“VerticalAxis”“Y”“VerticalAxisDir”“下来”...“父”hax)标题(“更新世界舞台”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”

图中包含一个坐标轴。标题为“更新的世界场景”的轴包含一个类型为scatter的对象。