estimateGeometricTransform3D

Оцените 3-D геометрическое преобразование из совпадающих пар точек

Описание

пример

tform = estimateGeometricTransform3D(matchedPoints1,matchedPoints2,transformType) оценивает 3-D геометрическое преобразование между двумя наборами точек 3-D путем отображения инлиеров в совпадающих точках из одного набора 3-D точек matchedPoints1 к inliers в совпадающих точках из другого набора 3-D точек matchedPoints2.

[tform,inlierIndex] = estimateGeometricTransform3D(___) дополнительно возвращает вектор, задающий каждую совпадающую пару точек как inlier или выбросы, используя входные параметры из предыдущего синтаксиса.

[tform,inlierIndex,status] = estimateGeometricTransform3D(___) дополнительно возвращает код состояния, указывающий, могла ли функция оценить преобразование, и, если нет, почему это не удалось. Если вы не задаете status Выходу функция вместо этого возвращает ошибку для условий, которые не могут привести к результатам.

[___] = estimateGeometricTransform3D(___, Name,Value) задает дополнительные опции, используя один или несколько аргументы пары "имя-значение" в дополнение к любой комбинации аргументов из предыдущих синтаксисов. Для примера, 'Confidence',99 устанавливает значение доверия для нахождения максимального количества инлиеров равным 99.

Примеры

свернуть все

Загрузите файл облака точек в рабочую область.

ptCloud1 = pcread('teapot.ply')
ptCloud1 = 
  pointCloud with properties:

     Location: [41472×3 single]
        Count: 41472
      XLimits: [-3 3.4340]
      YLimits: [-2 2]
      ZLimits: [0 3.1500]
        Color: []
       Normal: []
    Intensity: []

ptCloud1 = pcdownsample(ptCloud1,'random',0.25);  

Создайте объект преобразования 3-D с поворотом на 30 градусов.

theta = 30; % degrees
rot = [cosd(theta)  sind(theta) 0; ...
      -sind(theta)  cosd(theta) 0; ...
            0           0       1];
trans = [0 0 0];
tform = rigid3d(rot,trans);

Преобразуйте облако точек с помощью объекта преобразования.

ptCloud2 = pctransform(ptCloud1,tform);

Чтобы ввести шум, добавьте случайные точки в обе облака точек.

noise1 = rescale(rand(1000,3),-2,2);
ptCloud1 = pointCloud([ptCloud1.Location;noise1]);
noise2 = rescale(rand(1000,3),-2,2);
ptCloud2 = pointCloud([ptCloud2.Location;noise2]);

Визуализируйте шумные облака точек.

figure
pcshowpair(ptCloud1,ptCloud2)
title('Point Clouds With Added Noise')

Извлечение совпадающих точек из облаков точек.

matchedPoints1 = ptCloud1.Location;
matchedPoints2 = ptCloud2.Location;

Оцените твердое преобразование между облаками точек.

[tformEst,inlierIndex] = estimateGeometricTransform3D(matchedPoints1, ...
    matchedPoints2,'rigid'); 

Извлеките точки inlier.

inliersPtCloud1 = transformPointsForward(tformEst,matchedPoints1(inlierIndex,:));
inliersPtCloud2 = matchedPoints2(inlierIndex,:);

Визуализируйте инлиеры выровненных облаков точек.

figure
firstPtCloud = pointCloud(inliersPtCloud1);
secondPtCloud = pointCloud(inliersPtCloud2);
pcshowpair(firstPtCloud,secondPtCloud)
title('Aligned point clouds')

Входные параметры

свернуть все

Первый набор совпадающих 3-D точек, заданный как матрица M-на-3, в которой каждая строка является набором (x, y, z) координат, а M является количеством совпадающих точек.

Второй набор совпадающих точек 3-D, заданный как матрица M-на-3, в которой каждая строка является набором (x, y, z) координат, а M является количеством совпадающих точек.

Тип преобразования, заданный как 'rigid' или 'similarity'. Каждый тип преобразования требует минимального количества совпадающих пар точек, чтобы оценить преобразование. Обычно можно улучшить точность преобразования, используя большее количество совпадающих пар точек. В этой таблице показан тип объекта, связанный с каждым типом преобразования, и минимальное количество совпадающих пар точек, которое требуется преобразованию.

transformTypetform ОбъектМинимальное количество совпадающих пар точек
'rigid'rigid3d3
'similarity'affine3d3

Типы данных: string

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'Confidence', 99 устанавливает значение доверия для нахождения максимального количества инлиеров равным 99.

Максимальное количество случайных испытаний, заданное как разделенная разделенными запятой парами, состоящая из 'MaxNumTrials' и положительное целое число. Это значение задает количество рандомизированных попыток, которые функция предпринимает, чтобы найти совпадающие пары точек. Установка более высокого значения заставляет функцию выполнять дополнительные расчеты, что увеличивает вероятность нахождения инлиеров.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Доверие в нахождении максимального количества инкрустаторов, заданная как разделенная разделенными запятой парами, состоящая из 'Confidence' и положительный числовой скаляр в области значений (0, 100). Увеличение этого значения заставляет функцию выполнять дополнительные расчеты, что увеличивает вероятность нахождения большего количества инлиеров.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Максимальное расстояние от точки до проекции соответствующей точки, заданное как разделенная разделенными запятой парами, состоящая из 'MaxDistance' и положительный числовой скаляр. 'MaxDistance' задает максимальное расстояние в пикселях, которое точка может отличаться от проективного местоположения соответствующей точки, которая должна считаться inlier. Соответствующая проекция основана на оцененном преобразовании.

Функция проверяет преобразование из matchedPoints1 на matchedPoints2, а затем вычисляет расстояние между совпадающими точками в каждой паре после применения преобразования. Если расстояние между совпадающими точками в паре больше, чем 'MaxDistance' значение, затем пара рассматривается как выбросы для этого преобразования. Если расстояние меньше 'MaxDistance', тогда пара рассматривается как inlier.

A matched point show in image 1 and image 2. Image one shows the point from image 2 projected back onto image 1.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Выходные аргументы

свернуть все

Геометрическое преобразование, возвращенное как affine3d или rigid3d объект.

Возвращенная геометрическая матрица преобразования отображает inliers в matchedPoints1 к инкрустаторам в matchedPoints2. Функция возвращает объект, специфичный для типа преобразования, заданного transformType входной параметр.

transformTypetform
'rigid'rigid3d
'similarity'affine3d

Код состояния, возвращенный как 0, 1, или 2. Код состояния указывает, могла ли функция оценить преобразование, и, если нет, почему это не удалось.

ЗначениеОписание
0Нет ошибки
1matchedPoints1 и matchedPoints2 входы не содержат достаточного количества точек
2Недостаточно найденных инлиеров

Если вы не задаете status code output, функция возвращает ошибку, если она не может привести к результатам.

Типы данных: int32

Inliers, возвращается как M -by-1 логический вектор M пар точек. Каждый элемент содержит либо логическое значение true, 1, чтобы указать, что пара точек является inlier или логическим false, 0, чтобы указать, что пара точек является выбросами.

Алгоритмы

Функция исключает выбросы, используя алгоритм консенсуса выборки M-estimator (MSAC). Алгоритм MSAC является вариантом алгоритма консенсуса случайной выборки (RANSAC). Результаты могут не быть идентичными между запусками из-за рандомизированного характера алгоритма MSAC.

Ссылки

[1] Хартли, Ричард и Эндрю Зиссерман. Несколько видов геометрии в Компьютерное Зрение. 2-й эд. Кембридж, Великобритания; Нью-Йорк: Cambridge University Press, 2003.

[2] Торр, P.H.S., и А. Циссерман. MLESAC: новый робастный оценщик с приложением для оценки геометрии изображения. Компьютерное зрение и понимание изображений 78, № 1 (апрель 2000): 138-56. https://doi.org/10.1006/cviu.1999.0832.

Расширенные возможности

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2020b