findNearestNeighbors

Найти ближайших соседей точки в облаке точек

Описание

пример

[indices,dists] = findNearestNeighbors(ptCloud,point,K) возвращает indices для K-ближайших соседей точки запроса во входном облаке точек. ptCloud может быть неорганизованным или организованным облаком точек. Ближайшие К соседи точки запроса вычисляются с помощью алгоритма поиска на основе Kd-дерева.

пример

[indices,dists] = findNearestNeighbors(ptCloud,point,K,camMatrix) возвращает K-ближайшие соседи точки запроса во входном облаке точек. Входное облако точек является организованным облаком точек, сгенерированным камерой глубины. K-ближайшие соседи точки запроса определяются с помощью быстрого аппроксимационного алгоритма поиска K-ближайших соседей.

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

Примечание

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

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

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

Примеры

свернуть все

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

load('xyzPoints.mat');

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

ptCloud = pointCloud(xyzPoints);

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

point = [0,0,0];
K = 220;

Получите индексы и расстояния K ближайших соседних точек.

[indices,dists] = findNearestNeighbors(ptCloud,point,K);

Отобразите облако точек. Постройте график точки запроса и их ближайших соседей.

figure
pcshow(ptCloud)
hold on
plot3(point(1),point(2),point(3),'*r')
plot3(ptCloud.Location(indices,1),ptCloud.Location(indices,2),ptCloud.Location(indices,3),'*')
legend('Point Cloud','Query Point','Nearest 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, Nearest 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];
K = 20;

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

[indices,dists] = findNearestNeighbors(ptCloud,point,K,camMatrix);
ptCloudB = select(ptCloud,indices);

Отображение облака точек и ближайших соседей точки запроса.

figure
pcshow(ptCloud)
hold on
pcshow(ptCloudB.Location,'ob')
legend('Point Cloud','Nearest 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, Nearest Neighbors.

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

свернуть все

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

Примечание

Функция поддерживает организованные данные облака точек, сгенерированные только с датчиков RGB-D.

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

Количество ближайших соседей, заданное как положительное целое число.

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

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

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

Пример: findNearestNeighbors(ptCloud,point,k,'Sort',true)

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

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

Примечание

Аргумент имя-значение 'MaxLeafChecks' действителен только с методом поиска на основе Kd-дерева.

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

свернуть все

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

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

Ссылки

[1] Muja, M. and David G. Lowe. «Быстрая аппроксимация ближайших соседей с автоматическим строением алгоритма». Международная конференция VISAPP по теории и применению компьютерного зрения. 2009. стр 331–340.

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

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