exponenta event banner

Оценка преобразования между двумя облаками точек с помощью функций

В этом примере показано, как оценить жесткое преобразование между двумя облаками точек. В этом примере извлечение и сопоставление элементов используется для значительного уменьшения количества точек, необходимых для оценки. После использования extractFPFHFeatures для извлечения элементов быстрой точечной гистограммы (FPFH) из облаков точек используется pcmatchfeatures для поиска совпадений в извлеченных элементах. Наконец, вы используете tge estimateGeometricTransform3D функция и согласующие элементы для оценки жесткого преобразования.

Предварительная обработка

Создайте два облака точек, применив жесткое преобразование к входному облаку точек.

Считывание данных облака точек в рабочее пространство.

rng("default")
ptCld = pcread("highwayScene.pcd");
ptCld.Count
ans = 65536

Чтобы повысить скорость вычислений, необходимо выполнить анализ облака точек, поскольку оно содержит около 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")