void FeatureEval::pca(){ boost::shared_ptr<PointCloud> cloud = core_->cl_->active_; if(cloud == nullptr) return; std::vector<int> sub_idxs; pcl::PointCloud<pcl::PointXYZI>::Ptr smaller_cloud = octreeDownsample(cloud.get(), subsample_res_, sub_idxs); t_.start(); qDebug() << "Timer started (PCA)"; boost::shared_ptr<std::vector<Eigen::Vector3f> > pca = getPCA(smaller_cloud.get(), search_radius_, max_nn_); qDebug() << "PCA in " << (time_ = t_.elapsed()) << " ms"; computeCorrelation(reinterpret_cast<float *>(pca->data()), 3, pca->size(), sub_idxs, sizeof(Eigen::Vector3f)/sizeof(float)); if(!visualise_on_) return; // // Draw // boost::shared_ptr<std::vector<Eigen::Vector3f> > grid = boost::make_shared<std::vector<Eigen::Vector3f> >(grid_to_cloud->size(), Eigen::Vector3f(0.0f, 0.0f, 0.0f)); // for(int i = 0; i < grid_to_cloud->size(); i++) { // int idx = (*grid_to_cloud)[i]; // if(idx != -1) // (*grid)[i] = (*pca)[idx]; // } // drawVector3f(grid, cloud); }
void FeatureEval::eigen_plane_consine_similarity(){ boost::shared_ptr<PointCloud> cloud = core_->cl_->active_; if(cloud == nullptr) return; std::vector<int> sub_idxs; pcl::PointCloud<pcl::PointXYZI>::Ptr smaller_cloud = octreeDownsample(cloud.get(), subsample_res_, sub_idxs); t_.start(); qDebug() << "Timer started (eigen_plane_consine_similarity)"; boost::shared_ptr<std::vector<Eigen::Vector3f> > pca = getPCA(smaller_cloud.get(), 0.05f, 20); boost::shared_ptr<std::vector<float>> plane_likelyhood = boost::make_shared<std::vector<float>>(pca->size(), 0.0f); Eigen::Vector3f ideal_plane(1.0f, 0.0f, 0.0f); ideal_plane.normalize(); for(uint i = 0; i < pca->size(); i++) { Eigen::Vector3f & val = (*pca)[i]; // Not enough neighbours if(val[1] < val[2]) { (*plane_likelyhood)[i] = 0; continue; } float similarity = cosine(val, ideal_plane); (*plane_likelyhood)[i] = similarity; } qDebug() << "eigen_plane_consine_similarity in " << (time_ = t_.elapsed()) << " ms"; // Correlate computeCorrelation(plane_likelyhood->data(), 1, plane_likelyhood->size(), sub_idxs); if(!visualise_on_) return; // Draw int h = cloud->scan_width(); int w = cloud->scan_height(); /* boost::shared_ptr<std::vector<Eigen::Vector3f> > grid = boost::make_shared<std::vector<Eigen::Vector3f> >(grid_to_cloud->size(), Eigen::Vector3f(0.0f, 0.0f, 0.0f)); for(int i = 0; i < grid_to_cloud->size(); i++) { int idx = (*grid_to_cloud)[i]; if(idx != -1) (*grid)[i] = (*pca)[idx]; } drawVector3f(grid, cloud); */ boost::shared_ptr<const std::vector<float>> img = cloudToGrid(cloud->cloudToGridMap(), w*h, plane_likelyhood); drawFloats(img, cloud); }
void TLinearCombBoxCox::calcSimDataPCA(double* simData){ //first transform stats via boxcox int stat=0; for(int i=0; i<numStats; ++i){ if(statIsUsed[i]>=0){ simData[i]=getBoxCox(simData[i], stat); ++stat; } } for(int i=0; i<numLinearComb; ++i){ simPCA[i]=getPCA(i, simData); } }
//------------------------------------------------------------------------------ void TLinearCombBoxCox::calcObsLineraComb(vector<double> obsData){ //order has to be the same as the names passed to the constructor!!! obs=new double[numStats]; for(int i=0; i<numStats; ++i){ if(statIsUsed[i]>=0){ obs[statIsUsed[i]]=getBoxCox(obsData[i], i);; } } //calculate pca for obsData obsPCA=new double[numLinearComb]; for(int i=0; i<numLinearComb; ++i){ obsPCA[i]=getPCA(i, obs); } }
// PCA for each point, ratio of eigen values void FeatureEval::pca_eigen_value_ratio(){ boost::shared_ptr<PointCloud> cloud = core_->cl_->active_; if(cloud == nullptr) return; // Downsample std::vector<int> sub_idxs; pcl::PointCloud<pcl::PointXYZI>::Ptr smaller_cloud = octreeDownsample(cloud.get(), subsample_res_, sub_idxs); // Compute PCA t_.start(); qDebug() << "Timer started (PCA and speculaion)"; boost::shared_ptr<std::vector<Eigen::Vector3f> > pca = getPCA(smaller_cloud.get(), search_radius_, max_nn_); // Compute ratio boost::shared_ptr<std::vector<float>> likely_veg = boost::make_shared<std::vector<float>>(pca->size(), 0.0f); for(uint i = 0; i < pca->size(); i++) { Eigen::Vector3f eig = (*pca)[i]; // Not enough neighbours if(eig[1] < eig[2]) { (*likely_veg)[i] = 0; continue; } /* float eig_sum = eig.sum(); eig /= eig_sum; float fudge_factor = 5.0f; bool is_planar = eig[1] < 0.05 * fudge_factor || eig[2] < 0.01 * fudge_factor; if(!is_planar) { (*likely_veg)[i] = 0; } else { (*likely_veg)[i] = 1; } */ float curvature; if(eig[0] > eig[2]) curvature = eig[1] / (eig[0]); else curvature = 1; (*likely_veg)[i] = curvature; } qDebug() << "PCA in " << (time_ = t_.elapsed()) << " ms"; computeCorrelation(likely_veg->data(), 1, likely_veg->size(), sub_idxs); if(!visualise_on_) return; // Draw int h = cloud->scan_width(); int w = cloud->scan_height(); boost::shared_ptr<std::vector<float>> likely_veg2 = boost::make_shared<std::vector<float>>(cloud->size(), 0.0f); for(uint i = 0; i < cloud->size(); i++) { uint subidx = sub_idxs[i]; (*likely_veg2)[i] = (*likely_veg)[subidx]; } boost::shared_ptr<const std::vector<float>> img = cloudToGrid(cloud->cloudToGridMap(), w*h, likely_veg2); drawFloats(img, cloud); }