Я использую 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();
}
Имеет ли этот код в его нынешнем виде даже скомпилировать? Например, строка номер 2 должна принимать указатель, а не тип значения. – Arunmu
К сожалению нет, я не могу понять, что на самом деле положить в скобки метода setIndices. Я вижу, что он должен быть указателем, и я пробовал такие вещи, как & (it-> index), потому что я думал, что это даст мне адрес самих индексов ... Особенно раздражает тот факт, что «это» является const_iterator, и я понятия не имею, как с этим бороться. –
Единственное, что выходит из строя с кодом, - setIndicess, потому что для этого требуется IndicesPtr &, и я не уверен, что именно, как правильно его предоставить. –