В этом примере показано, как оценить твердое преобразование между двумя облаками точек. В примере вы используете извлечение признаков и соответствие, чтобы значительно уменьшать число точек, требуемое для оценки. После того, как вы используете extractFPFHFeatures
функционируйте, чтобы извлечь функции быстро укажите гистограмму функции (FPFH) из облаков точек, вы используете pcmatchfeatures
функционируйте, чтобы искать соответствия в извлеченных функциях. Наконец, вы используете estimateGeometricTransform3D
функционируйте и соответствующие функции, чтобы оценить твердое преобразование.
Создайте два облака точек путем применения твердого преобразования к облаку точки ввода.
Считайте данные об облаке точек в рабочую область.
rng("default") ptCld = pcread("highwayScene.pcd"); ptCld.Count
ans = 65536
Downsample облако точек, чтобы улучшить скорость расчета, когда это содержит приблизительно 65 000 точек.
ptCloud = pcdownsample(ptCld,"gridAverage",0.2);
ptCloud.Count
ans = 24596
Создайте твердую матрицу преобразования с вращением с 30 степенями и переводом 5 модулей в x-и осях Y.
rotAngle = 30; rot = [cosd(rotAngle) sind(rotAngle) 0; ... -sind(rotAngle) cosd(rotAngle) 0; ... 0 0 1]; trans = [5 5 0]; tform = rigid3d(rot,trans);
Преобразуйте облако точки ввода.
ptCloudTformed = pctransform(ptCloud,tform);
Визуализируйте эти два облака точек.
pcshowpair(ptCloud,ptCloudTformed) xlim([-50 75]) ylim([-40 80]) legend("Original","Transformed","TextColor",[1 1 0])
Извлеките функции от обоих облака точек с помощью extractFPFHFeatures
функция.
fixedFeature = extractFPFHFeatures(ptCloud); movingFeature = extractFPFHFeatures(ptCloudTformed);
Найдите соответствие с функциями и отобразите количество соответствия с парами.
[matchingPairs,scores] = pcmatchfeatures(fixedFeature,movingFeature, ... ptCloud,ptCloudTformed,"Method","Exhaustive"); length(matchingPairs)
ans = 1814
Выберите соответствие с точками из облаков точек.
fixedPts = select(ptCloud,matchingPairs(:,1)); matchingPts = select(ptCloudTformed,matchingPairs(:,2));
Оцените матрицу преобразования с помощью соответствующих точек.
estimatedTform = estimateGeometricTransform3D(fixedPts.Location, ... matchingPts.Location,"rigid"); disp(estimatedTform.T)
0.8660 0.5000 0.0002 0 -0.5000 0.8660 -0.0002 0 -0.0003 0.0000 1.0000 0 4.9995 5.0022 0.0020 1.0000
Отобразите заданную матрицу преобразования.
disp(tform.T)
0.8660 0.5000 0 0 -0.5000 0.8660 0 0 0 0 1.0000 0 5.0000 5.0000 0 1.0000
Используйте предполагаемое преобразование, чтобы повторно преобразовать ptCloudTformed
назад к начальному облаку точек.
ptCloudTformed = pctransform(ptCloudTformed,invert(estimatedTform));
Визуализируйте эти два облака точек.
pcshowpair(ptCloud,ptCloudTformed)
xlim([-50 50])
ylim([-40 60])
title("Aligned Point Clouds")