2016-06-19 10 views
1

Я использую PCL с C++ и хочу выполнить PCA на уже сгруппированном pointcloud (то есть на каждом отдельном кластере). Идея состоит в том, чтобы устранить все кластеры, которые слишком велики/малы, измеряя их размер вдоль собственных векторов. Таким образом, предполагаемый алгоритм: Получить собственные векторы каждого кластера, проецировать точки кластера на соответствующие собственные векторы, чтобы измерить максимальные расстояния точек вдоль этих размеров, и оттуда устранить все кластеры, которые имеют «плохие» размеры/отношение размеров. У меня возникают трудности с реализацией. Чем больше вы поможете, тем веселее. Это как мои данные организованы (только, чтобы быть ясно, это фрагменты, cluster_indices уже извлечены правильно, который проверяется), и то, что я начал:Анализ основных компонентов на PCL

std::vector<pcl::PointIndices> cluster_indices; 
pcl::PCA<pcl::PointXYZ> cpca = new pcl::PCA<pcl::PointXYZ>; 
cpca.setInputCloud(input); 
Eigen::Vector3f pca_vector(3,3); 
// and now iterating with a for loop over the clusters, but having issues using setIndices already 
for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it, n++) 
{ 
    cpca.setIndices(it->indices); //not sure what to put in brackets, everything I thought of returns an error! 
    pca_vector = cpca.getEigenVectors(); 
} 
+0

Имеет ли этот код в его нынешнем виде даже скомпилировать? Например, строка номер 2 должна принимать указатель, а не тип значения. – Arunmu

+0

К сожалению нет, я не могу понять, что на самом деле положить в скобки метода setIndices. Я вижу, что он должен быть указателем, и я пробовал такие вещи, как & (it-> index), потому что я думал, что это даст мне адрес самих индексов ... Особенно раздражает тот факт, что «это» является const_iterator, и я понятия не имею, как с этим бороться. –

+0

Единственное, что выходит из строя с кодом, - setIndicess, потому что для этого требуется IndicesPtr &, и я не уверен, что именно, как правильно его предоставить. –

ответ

0

Кажется, что существует общая проблема с этим , Поэтому я нашел это решение: Вместо повторения с помощью указателей используйте обычный итератор, а затем используйте эту формулировку. PointIndicesPtr pi_ptr (новые PointIndices); pi_ptr-> indices = cluster_indices [i] .indices; // теперь можно использовать pi_ptr как вход

 Смежные вопросы

  • Нет связанных вопросов^_^