PCL入門平面的法線

通常我們需要估計平面的方向,這就需要用到法線了,法線就是指垂直平面的線。

PCL中有自動求出法線的方法,我們來看一看,

首先假設我們有一個平面的點雲cloud_xyz

要求出法線首先我們先定義一個法線估計的對象ne

pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
然後把要求的平面點雲傳給他

ne.setInputCloud (cloud_xyz);
這個方法求出cloud_xyz上每個點的法線方向,他是根據每個點附近的點雲組成的平面求出的,所以我們需要設置一個半徑,用來估計附近多大的範圍取點來算平面,

ne.setRadiusSearch (0.05);
最後定義一個normal的對象來接受計算出來的法線

pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
計算並把結果保存在cloud_normals裏

ne.compute (*cloud_normals);
這時算出來的法線就在這個對象裏了,他裏面的元素是和點雲一一對應的,我們要訪問每個點的法線方向,可以這樣

for(int ix=0;ix<cloud_normals->points.size();ix++)
{
if(isnan(cloud_normals->points[ix].normal_x)||
isnan(cloud_normals->points[ix].normal_y)||
isnan(cloud_normals->points[ix].normal_z))
{
continue;
}
}
這裏的isnan是判斷法線是否爲nan,因爲如果一個點周圍找不到足夠的點計算平面,則法線中會賦值爲nan,如果需要直接當作數字來用的同學們一定要注意這一點,使用我這種方法來判斷。normal_x就是法線的x方向了,y z同理。然後PCL算出的法線是不知道正方向的,所以這點需要人爲去判斷正負。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章