(曲率系列2:)Paper6:Curvature Estimation of 3D Point Cloud Surfaces Through the Fitting of Normal
文獻下載鏈接:https://download.csdn.net/download/m0_37957160/12919965
簡單說明原理就是:用一個點鄰域內點的法向量計算該點的法曲率,根據歐拉公式得法曲率與主曲率的關系,最后用最小二乘優化得到主曲率。(通過擬合正截面曲率估算三維點云曲面的曲率,正截面曲率就是法曲率)
不管他概念說的有多抽象,反正最終處理的只是數學上定義的xyz的三維坐標而已。
問:就這個啊,i表示p點周圍的鄰域是從1到m,那么n沒有具體含義就是表示與法線有關的計算?,n是法線我知道,我的意思就是這里的下標n沒有變化,不像i一樣從1到m的變化,n就一直是n,是為了說明法曲率的計算是與法線有關的?
答:是的。
問:一個P點和其鄰域內的一個點計算出來的是法曲率,這個計算出來的法曲率是P點的還是怎么理解?
答:是P點的。
問:表示p與鄰域內的第1個點的法曲率,表示k與鄰域第二個點的法曲率,即就是p有多少個鄰域,那么p點就有多少個法曲率?
答:原理上是用鄰域的一個點就可以表示p點的法曲率,因為有誤差之類的存在,所以用鄰域內k個點進行最小二成優化來得到p點的曲率。
選鄰域內多個點主要就是為了最小二乘尋優。
問:法曲率是p點的,那么k1和k2分別是哪個點的?
答:P點的。
問:最后獲得的特征值k1和k2就是主曲率?為啥有兩個主曲率?k1xk2是高斯曲率,一個高斯曲率?
答:數學上就是這么定義的!!!所以計算的k1和k2就是分別表示最大主曲率和最小主曲率
????? ??
#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/principal_curvatures.h>
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>("A3 - Cloud.pcd", *cloud); //讀取點云cout << "Loaded " << cloud->points.size() << " points." << endl;//顯示讀取點云的個數// 計算點云的法線pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;n.setInputCloud(cloud);//設置鄰域點搜索方式pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);n.setSearchMethod(tree);//設置KD樹搜索半徑// n.setRadiusSearch (0.03);n.setKSearch(10);//定義一個新的點云儲存含有法線的值pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//計算出來法線的值n.compute(*normals);// 建立主曲率計算pcl::PrincipalCurvaturesEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> p;// 提供原始點云(沒有法線)p.setInputCloud(cloud);// 為點云提供法線p.setInputNormals(normals);// 使用與法線估算相同的KdTreep.setSearchMethod(tree);//p.setRadiusSearch(1.0);p.setKSearch(10);// 計算主曲率pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr pri(new pcl::PointCloud<pcl::PrincipalCurvatures>());p.compute(*pri);cout << "output points.size: " << pri->points.size() << endl;// 顯示和檢索第0點的主曲率。cout << "最大曲率;" << pri->points[0].pc1 << endl;//輸出最大曲率cout << "最小曲率:" << pri->points[0].pc2 << endl;//輸出最小曲率//輸出主曲率方向(最大特征值對應的特征向量)cout << "主曲率方向;" << endl;cout << pri->points[0].principal_curvature_x << endl;cout << pri->points[0].principal_curvature_y << endl;cout << pri->points[0].principal_curvature_z << endl;return 0;
}
PCL庫連接:https://pointclouds.org/documentation/classpcl_1_1_principal_curvatures_estimation.html
總結
以上是生活随笔為你收集整理的(曲率系列2:)Paper6:Curvature Estimation of 3D Point Cloud Surfaces Through the Fitting of Normal的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++:随笔9----模板/内联函数/容
- 下一篇: (曲率系列3:)PCL:PCL库中的两种