点群の対応する特徴の照合と可視化
この例では、点群の間の対応する特徴を関数 pcmatchfeatures
を使用して照合し、それらを関数 pcshowMatchedFeatures
を使用して可視化する方法を示します。
velodyneFileReader
オブジェクトを作成します。
veloReader = velodyneFileReader('lidarData_ConstructionRoad.pcap','HDL32E');
readFrame
メソッドを使用して、velodyneFileReader
オブジェクトから点群を 2 つ読み取ります。
frameNumber = 1; skipFrame = 5; fixed = readFrame(veloReader,frameNumber); moving = readFrame(veloReader,frameNumber+skipFrame);
固定点群と移動点群から地面をセグメント化して除去します。
groundPtsIdxFixed = segmentGroundSMRF(fixed); groundPtsIdxMoving = segmentGroundSMRF(moving); fixedSeg = select(fixed,~groundPtsIdxFixed,'OutputSize','full'); movingSeg = select(moving,~groundPtsIdxMoving,'OutputSize','full'); figure pcshowpair(movingSeg,fixedSeg) ylim([-50 60]) title('Input Point Clouds')
重ね合わせた入力点群は次のように色分けされます。
マゼンタ — 移動点群
緑 — 固定点群
計算時間を減らすために点群をダウンサンプリングします。ダウンサンプリングにより、処理する点の数が少なくなります。
fixedDownsampled = pcdownsample(fixedSeg,'gridAverage',0.2); movingDownsampled = pcdownsample(movingSeg,'gridAverage',0.2);
関数 extractFPFHFeatures
を使用して点群から特徴を抽出します。この関数は両方の点群における有効なインデックスを返します。有効な点を選択し、新しい参照点群を作成します。
[fixedFeature,fixedValidInds] = extractFPFHFeatures(fixedDownsampled); [movingFeature,movingValidInds] = extractFPFHFeatures(movingDownsampled); fixedValidPts = select(fixedDownsampled,fixedValidInds); movingValidPts = select(movingDownsampled,movingValidInds);
抽出された特徴と参照点群を使用して、点群の間の特徴を照合します。
indexPairs = pcmatchfeatures(movingFeature,fixedFeature,movingValidPts, ...
fixedValidPts);
対応する点群データがない場合は、2 つの特徴セットを単独で使用できます。関数 pcmatchfeatures
は、点群データを使用して一致する可能性がある特徴に関連する点の間の空間関係を推定し、空間関係しきい値に基づいて一致を棄却します。
各点群の点のうちでもう一方の点群に一致する特徴がある点のみを含む点群を作成します。
matchedFixedPts = select(fixedValidPts,indexPairs(:,2)); matchedMovingPts = select(movingValidPts,indexPairs(:,1));
一致を可視化します。
figure pcshowMatchedFeatures(movingSeg,fixedSeg,matchedMovingPts,matchedFixedPts, ... 'Method','montage') xlim([-40 210]) ylim([-50 50]) title('Matched Points')
一致した特徴と点群が見やすいように色分けして可視化されます。
マゼンタ — 移動点群
緑 — 固定点群
赤の丸 — 移動点群の一致した点
青のアスタリスク — 固定点群の一致した点
黄 — 一致した点を結ぶ線