PCL 计算点云的高斯曲率


内容抄自CSDN点云侠:2024最新版】PCL点云处理算法汇总(C++长期更新版)。质量无忧,可放心复制粘贴。

一、概述

   高斯曲率是点云表面几何特性的一个重要指标,表明点云局部区域的弯曲程度。其计算公式为:
K = k 1 ∗ k 2 K=k_1*k_2 K=k1k2
k 1 , k 2 k_1,k_2 k1,k2分别为最大或最小主曲率。

二、代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/principal_curvatures.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

using namespace std;

int main(int argc, char** argv)
{
    // 读取点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("dragon.pcd", *cloud);

    // 计算法向量
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    ne.setInputCloud(cloud);              // 设置输入点云
    ne.setSearchMethod(tree);             // 设置搜索方法
    ne.setRadiusSearch(0.03);             // 设置搜索半径
    ne.compute(*normals);                 // 计算法向量

    // 计算主曲率和高斯曲率
    pcl::PrincipalCurvaturesEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> pce;
    pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>);
    pce.setInputCloud(cloud);             // 设置输入点云
    pce.setInputNormals(normals);         // 设置法向量
    pce.setSearchMethod(tree);            // 设置搜索方法
    pce.setRadiusSearch(0.03);            // 设置搜索半径
    pce.compute(*curvatures);             // 计算主曲率
	// 计算高斯曲率
	for (size_t i = 0; i < curvatures->size(); ++i) 
	{
    	float k1 = curvatures->points[i].pc1;  // 最大曲率
    	float k2 = curvatures->points[i].pc2;  // 最小曲率
    	float gaussian_curvature = k1 * k2;    // 高斯曲率
   	 gauss_curvature_cloud->points[i].curvature = gaussian_curvature;
	}

    // 可视化
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Gaussian Curvature Viewer"));
    int vp_1, vp_2;

    // 第一个视口:显示原始点云
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(0.0, 0.0, 0.0, vp_1);
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0);  // 红色
    viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);

    // 第二个视口:显示法向量与主曲率,同时显示点云
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(0.08, 0.08, 0.08, vp_2);
    viewer->addText("Normals and Principal Curvatures", 10, 10, "vp2_text", vp_2);

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler_2(cloud, 0, 255, 0);  // 绿色
    viewer->addPointCloud(cloud, cloud_color_handler_2, "cloud_with_curvature", vp_2);

    // 添加法向量,控制显示间隔和长度
    viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 20, 0.02, "normals", vp_2);

    // 添加主曲率,控制显示间隔和长度
    viewer->addPointCloudPrincipalCurvatures<pcl::PointXYZ, pcl::Normal>(cloud, normals, curvatures, 10, 0.02, "Curvatures", vp_2);

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}

三、结果

在这里插入图片描述

PCL中可以使用NormalEstimation类来估计点云中每个点的法向量,然后使用CurvatureEstimation类计算每个点的曲率。下面是一个简单的示例代码: ```cpp #include <pcl/point_types.h> #include <pcl/features/normal_3d.h> #include <pcl/features/curvature.h> int main() { // 创建点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 填充点云 // ... // 估计法向量 pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setInputCloud(cloud); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); ne.setSearchMethod(tree); pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); ne.setRadiusSearch(0.03); // 设置搜索半径 ne.compute(*normals); // 计算曲率 pcl::CurvatureEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> ce; ce.setInputCloud(cloud); ce.setInputNormals(normals); ce.setSearchMethod(tree); pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>); ce.setRadiusSearch(0.03); // 设置搜索半径 ce.compute(*curvatures); // 输出每个点的曲率 for (int i = 0; i < curvatures->size(); ++i) { std::cout << "Curvature of point " << i << ": " << (*curvatures)[i].pc1 << std::endl; } return 0; } ``` 该示例代码首先创建了一个点云对象,然后使用NormalEstimation类估计每个点的法向量,接着使用CurvatureEstimation类计算每个点的曲率。最后,遍历每个点的曲率并输出。需要注意的是,搜索半径的大小需要根据实际点云的密度进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值