使用 PCL 时私有函数的 C++ 继承
C++ inheritance of private functions while using PCL
我一直在尝试在 C++ 中使用 PCL 中的 PCA 模块,但这很痛苦。有一次我想切换需要使用 setIndices() 函数操作的点的当前索引,但要实际进行更新,有一个私有继承函数,必须使用它,称为 initCompute() 否则它不会'改变它们(或者至少我是这么理解的)。尽管如此,由于某种原因,代码原样不会更新索引。这是 class 的文档,一切正常,但我不知道如何为他们打算用于这些目的的此功能制定解决方法:
http://docs.pointclouds.org/trunk/classpcl_1_1_p_c_a.html
如何处理?这是编译时的错误。
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;
不管怎样,过了一会儿我很生气,做了以下事情。
我在 for 循环的开始使用指针创建了一个 pca 对象,然后在循环结束时使用 delete 将其删除。那里正在进行一些分配和解除分配,这很可能不是最佳的,但它确实起到了作用。 PCA 对象本身只有 144 字节大,因为它主要使用指针来寻址必要的元素。
我一直在尝试在 C++ 中使用 PCL 中的 PCA 模块,但这很痛苦。有一次我想切换需要使用 setIndices() 函数操作的点的当前索引,但要实际进行更新,有一个私有继承函数,必须使用它,称为 initCompute() 否则它不会'改变它们(或者至少我是这么理解的)。尽管如此,由于某种原因,代码原样不会更新索引。这是 class 的文档,一切正常,但我不知道如何为他们打算用于这些目的的此功能制定解决方法: http://docs.pointclouds.org/trunk/classpcl_1_1_p_c_a.html
如何处理?这是编译时的错误。
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;
不管怎样,过了一会儿我很生气,做了以下事情。 我在 for 循环的开始使用指针创建了一个 pca 对象,然后在循环结束时使用 delete 将其删除。那里正在进行一些分配和解除分配,这很可能不是最佳的,但它确实起到了作用。 PCA 对象本身只有 144 字节大,因为它主要使用指针来寻址必要的元素。