Пример #1
0
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);


}
Пример #2
0
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);
}
Пример #3
0
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);
	}
}
Пример #4
0
//------------------------------------------------------------------------------
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);
	}
}
Пример #5
0
// 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);
}