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

Figure contains an axes. The axes contains 3 objects of type scatter, line. These objects represent Point Cloud, Query Point, Radial Neighbors.

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

Загрузите организованные данные облака точек в рабочую область. Облако точек генерируется с помощью датчика глубины 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;

Найдите 2-D координаты изображения, соответствующие 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;

Figure contains an axes. The axes contains 2 objects of type scatter. These objects represent Point Cloud, Radial Neighbors.

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

свернуть все

Облако точек, заданное как pointCloud объект.

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

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

Матрица проекции камеры, заданная как матрица 4 на 3, которая сопоставляет 3-D мировые точки с 2-D точками изображения. Вы можете найти 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. and David G. Lowe. «Быстрая аппроксимация ближайших соседей с автоматическим строением алгоритма». Международная конференция VISAPP по теории и применению компьютерного зрения. 2009. стр 331–340.

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

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