Calculating circumference of point cloud using convex hull

  3d, algorithm, c++, linear-algebra, point-cloud-library

I have the following point cloud enter image description here

That’s the result that I need to be done.

I have a point cloud where I calculated using PCA the major axis of it, and I have a center point, it’s shown here after translating it marked as yellow.

enter image description here

I would like to calculate a convex hull and its circumference.
I have tried to translate a the center point and create a displacement in X direction but the math is wrong.

std::vector<pcl::PointXYZ> convex_hull_pts;
    unsigned long id = 0;
    double eps = 0.03;
    std::stringstream stream1;

    for (size_t i = 0; i < 50; ++i) {
        const pcl::PointXYZ& pt = orientedGolden->at(i);
        
        pcl::PointXYZ pc;
        pc.x = center.x - 0.2 - eps;
        pc.z = center.z;
        pc.y = center.y;
        convex_hull_pts.push_back(pc);


        viewer->addSphere(pc, 0.01, 255, 255, 0, stream1.str());

        stream1 << id++;
    }
    pcl::PointCloud<pcl::PointXYZ>::Ptr convex_hull_cloud(new pcl::PointCloud<pcl::PointXYZ>);

    for (auto& pt : convex_hull_pts)
    {
        convex_hull_cloud->points.push_back(pt);


    }

    ModelCoefficients::Ptr plane_coefficients(new ModelCoefficients());
    plane_coefficients->values.resize(4);
    plane_coefficients->values[0] = 1;
    plane_coefficients->values[1] = 0;
    plane_coefficients->values[2] = 0;
    plane_coefficients->values[3] = 0;

    /// Project segmented object points onto plane
    ProjectInliers<PointXYZ> project_inliers_filter;
    project_inliers_filter.setInputCloud(convex_hull_cloud);
    project_inliers_filter.setModelType(SACMODEL_PLANE);
    project_inliers_filter.setModelCoefficients(plane_coefficients);
    PointCloud<PointXYZ>::Ptr convex_hull_projected(new PointCloud<PointXYZ>());
    project_inliers_filter.filter(*convex_hull_projected);

    ConvexHull<PointXYZ> convex_hull_2d;
    convex_hull_2d.setInputCloud(convex_hull_projected);
    pcl::PointCloud<pcl::PointXYZ>::Ptr  hull_2d(new pcl::PointCloud<pcl::PointXYZ>);
    convex_hull_2d.reconstruct(*hull_2d);
    std::cout << convex_hull_2d.getDimension();

Source: Windows Questions C++

LEAVE A COMMENT