2016-04-17 10 views
0

Хорошо, поэтому у меня есть один файл OBJ, который я прочитал в PCLpointcloud2. Теперь я хочу накормить его в K-dTree. Что не принимает PCLPointCloud2 в качестве входных данных. Я хочу запросить любую общую точку, если она лежит на поверхности моего OBJ-файла. Мне сложно понять их документацию. Так как это можно сделать? Плюс, любезно назовите меня хорошей ссылкой, легко интерпретируемой. А что такое «PointT» BTW? Является ли этот пользовательский тип сборки определенным нами? пожалуйста, дополните.Как реализовать KdTree с использованием PCLPointCloud2, используемого в loadOBJfile в облачной библиотеке точек?

+0

Загружает ли файл OBJ, который вы загружаете, все точки, которые у вас есть на поверхности вашего объекта, или только вершины, между которыми вы надеетесь, облачная библиотека точек будет интерполировать? –

+0

Так что я надеюсь, что PCL должен интерполировать точки, если это возможно. Это можно сделать? –

ответ

0

Посмотрите на код в предоставленном инструменте pcl_mesh_sampling (в каталоге кода PCL под кодом tools/mesh_sampling.cpp). Это относительно просто. Он загружает модель из PLY или OBJ, тогда для каждого треугольника он отображает случайные точки из треугольника. Точка конечной точки затем подвергается образцу воксельной сетки, чтобы сделать точки относительно однородными. Кроме того, вы можете просто запустить программу pcl_mesh_sampling в вашем obj-файле, чтобы получить выходной PCD, который вы можете визуализировать с помощью pcl_viewer, прежде чем загружать файл PCD в свой собственный код.

После того, как у вас есть последнее облако точек, вы можете создавать и использовать KD-дерево, как на http://pointclouds.org/documentation/tutorials/kdtree_search.php

PointT является аргументом шаблона. Библиотека точечных облаков может обрабатывать различные типы точек: от простых PointXYZ (имеющих только x, y, z) до более сложных точек, таких как PointXYZRGBNormal (с x, y, z, normal_x, normal_y, normal_z, кривизна, r, g, и b каналов). Каждый алгоритм настраивается на тип точки, который вы хотите использовать. Вероятно, было бы проще, если бы вы использовали PointXYZ с вашим OBJ-файлом, поэтому используйте pcl :: PointXYZ для всех ваших аргументов шаблона. Подробнее о шаблонах см. http://www.tutorialspoint.com/cplusplus/cpp_templates.htm и http://pointclouds.org/documentation/tutorials/adding_custom_ptype.php.

Update (ответ на последние комментарии)

Добавлен здесь, потому что этот ответ слишком долго для комментария.

Думаю, я вижу, к чему вы клоните. Поэтому, когда вы выбираете точки из облака точек &, создайте KD-дерево поверхности объекта, и для каждой точки вы будете отслеживать, какие грани находятся рядом с этой точкой (вероятно, все грани, смежные с гранью, с которой была взята точка, должны быть достаточно? Одно лицо явно недостаточно). Затем, когда задана точка запроса, вы найдете ближайшую точку в KD-дереве и проверяете, находится ли точка запроса на «вне» или внутри полного списка соседних лиц, связанных с этой точкой в ​​дереве KD. Если это «внутри» всех из них, возможно, это внутренняя точка. Но я не могу гарантировать, что это правда. Это мое размышление по этому вопросу на данный момент. Но я действительно задаюсь вопросом, нужен ли вам подход на основе сетки. Кстати, если вы разбиваете свою сетку на выпуклые части, тогда вы можете иметь хорошие гарантии при обработке каждой выпуклой части.

+0

Еще одна вещь, если я запрашиваю kd-дерево и извлекаю набор точек, теперь для контрольной точки мы должны проверить, находится ли она внутри или вне нашего объекта, просто просматривая эти извлеченные точки. –

+0

Чтобы быть понятным, у вас есть дополнительное требование, которое вы хотите проверить, чтобы увидеть, находится ли заданная точка запроса внутри или снаружи объекта? Это в дополнение к поиску близлежащих точек на поверхности, не так ли? У меня есть другой вопрос: почему вы конвертируете свой объект в облако точек, а не просто сравниваете точку запроса с каждой гранью? –

+0

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