2016-06-21 2 views
2

Я пытался использовать модуль PCA из PCL на C++, но это было больно. В какой-то момент я хочу переключить текущие индексы точек, которые нужно использовать при использовании функции setIndices(), но для фактического обновления в нем есть частная унаследованная функция, которую HAS использовать для использования initCompute(), иначе она не будет Не меняйте их (или, по крайней мере, так я это понял). Тем не менее, код как есть, по какой-то причине не обновляет индексы. Это документация для класса, и все работает, но я понятия не имею, как сделать обходной путь для этой функции, которую они намеревались использовать для этих целей: http://docs.pointclouds.org/trunk/classpcl_1_1_p_c_a.htmlНаследование C++ частных функций при использовании PCL

Как справиться с этим? Это ошибка при компиляции.

In function ‘void clustering(pcl::PointCloud<pcl::PointXYZ>::ConstPtr, pcl::PointCloud<pcl::PointXYZL>::Ptr, pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::PointCloud<pcl::PointXYZ>::Ptr, float)’: 
/usr/include/pcl-1.7/pcl/common/impl/pca.hpp:64:1: error: ‘bool pcl::PCA<PointT>::initCompute() [with PointT = pcl::PointXYZ]’ is private 
pcl::PCA<PointT>::initCompute() 

Это код:

pcl::PCA<pcl::PointXYZ> cpca = new pcl::PCA<pcl::PointXYZ>; 
cpca.setInputCloud(input); 
std::cout << "We're now performing the cluster elimination!" << endl; 
Eigen::Matrix3f pca_matrix; //serves to hold the eigenvectors, and never got updated...hence the couts for checking. 

for (int i = 0; i < nclusters; ++i, n++) 
{ 
    // the next two lines had to be done so, I found that in a forum, the library just behaves a bit strange. 
    pcl::PointIndices::Ptr pi_ptr(new pcl::PointIndices); 
    pi_ptr->indices = cluster_indices[i].indices; 
    cout << "Current size is: " << pi_ptr->indices.size() << endl;//this shows different sizes on every turn 
    //now can use pi_ptr 
    cpca.setIndices(pi_ptr); 
    pca_matrix = cpca.getEigenVectors(); 
    // but here I get the same vectors every time 
    std::cout << "vector " << n << " " << pca_matrix(0,0) << " " << pca_matrix(0,1) << " " << pca_matrix(0,2) << endl; 
    std::cout << "vector " << n << " " << pca_matrix(1,0) << " " << pca_matrix(1,1) << " " << pca_matrix(1,2) << endl; 
    std::cout << "vector " << n << " " << pca_matrix(2,0) << " " << pca_matrix(2,1) << " " << pca_matrix(2,2) << endl; 
+0

Незначительное обновление, только что проверили, будет ли то, что я даю в качестве входных данных для функции, получает обновления, и это происходит, поэтому проблемы там нет. –

+0

Не могли бы вы просто вызвать, скажем, '' getMean() '] (http://docs.pointclouds.org/trunk/pca_8h_source.html#l00189), который будет вызывать' initCompute() 'для вас? – mindriot

+0

Как ни странно, нет. Я использую позже getEigenVectors(), который делает то же самое, о чем вы думали, но результаты остаются неизменными. Теперь я отредактирую вопрос с помощью кода. –

ответ

0

Во всяком случае, я раздражался через некоторое время и сделал следующее. Я создал объект pca в начале цикла for с помощью указателя, а затем удалил его в конце цикла с удалением. Это некоторая выделение и освобождение, которая, скорее всего, не оптимальна, но это сделало трюк. Сам объект PCA был только 144 байта, потому что он в основном использует указатели для адресации необходимых элементов.