findNeighborsInRadius

Найдите соседей в радиусе точки в облаке точек

Описание

пример

[indices,dists] = findNeighborsInRadius(ptCloud,point,radius) возвращает indices из соседей в радиусе точки запроса в облаке точки ввода. ptCloud может быть неорганизованное или организованное облако точек. Соседи в радиусе точки запроса вычисляются при помощи основанного на Kd-дереве алгоритма поиска.

пример

[indices,dists] = findNeighborsInRadius(ptCloud,point,radius,camMatrix) возвращает соседей в радиусе точки запроса в облаке точки ввода. Облако точки ввода является организованным облаком точек, сгенерированным камерой глубины. Соседи в радиусе точки запроса определяются с помощью быстро аппроксимированный соседний алгоритм поиска.

Функция использует матрицу проекции камеры camMatrix чтобы знать отношение между смежными точками и следовательно, ускоряет поиск. Однако результаты имеют более низкую точность по сравнению с основанным на Kd-дереве подходом.

Примечание

  • Этот синтаксис только поддерживает организованные данные об облаке точек, произведенные датчиками RGB-D.

  • Можно использовать estimateCameraMatrix оценить матрицу проекции камеры для данных данных об облаке точек.

[indices,dists] = findNeighborsInRadius(___,Name,Value) задает опции с помощью одного или нескольких аргументов пары "имя-значение" в дополнение к входным параметрам в предыдущих синтаксисах.

Примеры

свернуть все

Загрузите набор 3-D координатных точек в рабочую область.

load('xyzPoints.mat');

Создайте объект облака точек.

ptCloud = pointCloud(xyzPoints);

Задайте точку запроса и радиус, в котором должны быть идентифицированы соседи.

point = [0,0,3];
radius = 0.5;

Получите индексы и расстояния точек, которые лежат в заданном радиусе.

[indices,dists] = findNeighborsInRadius(ptCloud,point,radius);

Поймите данные об облаке радиальных соседей.

ptCloudB = select(ptCloud,indices);

Отобразите облако точек. Постройте точку запроса и соответствующих радиальных соседей.

figure
pcshow(ptCloud)
hold on
plot3(point(1),point(2),point(3),'*')
pcshow(ptCloudB.Location,'r')
legend('Point Cloud','Query Point','Radial Neighbors','Location','southoutside','Color',[1 1 1])
hold off

Найдите радиальных соседей точки запроса в организованных данных об облаке точек при помощи матрицы проекции камеры. Вычислите матрицу проекции камеры из произведенных точек данных облака точек и их соответствующих координат точки изображений.

Загрузите организованные данные об облаке точек в рабочую область. Облако точек сгенерировано при помощи датчика глубины Kinect.

ld = load('object3d.mat');
ptCloud = ld.ptCloud;

Задайте размер шага для выборки данных об облаке точек.

stepSize = 100;

Произведите облако точки ввода и сохраните произведенные 3-D координаты точки как объект облака точек.

indices = 1:stepSize:ptCloud.Count;
tempPtCloud = select(ptCloud,indices);

Удалите недопустимые точки из произведенного облака точек.

[tempPtCloud,validIndices] = removeInvalidPoints(tempPtCloud);

Задайте 3-D мировые координаты точки облака точки ввода.

worldPoints = tempPtCloud.Location;

Найдите 2D координаты изображений, соответствующие 3-D координатам точки облака точки ввода.

[Y,X] = ind2sub([size(ptCloud.Location,1),size(ptCloud.Location,2)],indices);
imagePoints = [X(validIndices)' Y(validIndices)'];

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

camMatrix = estimateCameraMatrix(imagePoints,worldPoints);

Задайте точку запроса и радиус, в котором должны быть идентифицированы соседи.

point = [0.4 0.3 0.2];
radius = 0.05;

Получите индексы и расстояния радиальных соседей. Используйте метод облака точек select понять данные об облаке соседних точек.

[indices,dists] = findNeighborsInRadius(ptCloud,point,radius,camMatrix);
ptCloudB = select(ptCloud,indices);

Отобразите облако точек и радиальных соседей, найденных приблизительно точкой запроса.

figure
pcshow(ptCloud);
hold on;
pcshow(ptCloudB.Location, 'b');
legend('Point Cloud','Radial Neighbors','Location','southoutside','Color',[1 1 1] )
hold off;

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

свернуть все

Облако точек в виде pointCloud объект.

Точка запроса в виде трехэлементного вектора формы [x,y,z].

Поисковый радиус в виде скаляра. Функция находит соседей в заданном radius приблизительно точка запроса в облаке точки ввода.

Матрица проекции камеры в виде 4 3 матрицы, которая сопоставляет 3-D мировые точки с 2D точками изображений. Можно найти camMatrix при помощи estimateCameraMatrix функция.

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

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

Пример: findNeighborsInRadius(ptCloud,point,radius,'Sort',true)

Сортировка индексов в виде разделенной запятой пары 'Sort' и логический скаляр. Когда вы устанавливаете Sort к true, возвращенные индексы сортируются в порядке по возрастанию на основе расстояния от точки запроса. Чтобы выключить сортировку, установите Sort к false.

Количество вершин в виде разделенной запятой пары, состоящей из 'MaxLeafChecks' и целое число. Когда вы устанавливаете это значение к Inf, целое дерево ищется. Когда целое дерево ищется, оно производит точные результаты поиска. Увеличение числа вершин, чтобы проверять точность увеличений, но уменьшает КПД.

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

свернуть все

Индексы сохраненных точек, возвращенных как вектор-столбец. Вектор содержит линейные индексы радиальных соседей, сохраненных в облаке точек.

Расстояния до точки запроса, возвращенной как вектор-столбец. Вектор содержит Евклидовы расстояния между точкой запроса и ее радиальными соседями.

Ссылки

[1] Muja, M. и Дэвид Г. Лоу. "Быстро Аппроксимируйте Самых близких Соседей Автоматической Настройкой Алгоритма". На Международной конференции VISAPP по вопросам Теории Компьютерного зрения и Приложений. 2009. стр 331–340.

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

Смотрите также

| |

Представленный в R2015a