1. 程式人生 > >點雲的曲面法向量估計(此例輸出點雲法向資訊,沒視覺化)(2018.10.15)

點雲的曲面法向量估計(此例輸出點雲法向資訊,沒視覺化)(2018.10.15)

表面法線是幾何體表面的重要屬性,在很多領域都有大量應用,例如:在進行光照渲染時產生符合可視習慣的效果時需要表面法線資訊才能正常進行,對於一個已知的幾何體表面,根據垂直於點表面的向量,因此推斷表面某一點的法線方向通常比較簡單。然而,由於我們獲取的點雲資料集在真實物體的表面表現為一組定點樣本,這樣就會有兩種解決方法:

使用曲面重建技術,從獲取的點雲資料集中得到取樣點對應的曲面,然後從曲面模型中計算表面法線;

直接從點雲資料集中近似推斷表面法線。

本文將針對後一種情況進行講解,已知一個點雲資料集,在其中的每個點處直接近似計算表面法線。

確定表面一點法線的問題近似於估計表面的一個相切面法線的問題,因此轉換過來以後就變成一個最小二乘法平面擬合估計問題。

因此估計表面法線的解決方案就變成了分析一個協方差矩陣的特徵向量和特徵值(或者PCA—主成分分析),這個協方差矩陣從查詢點的近鄰元素中建立。更具體地說,對於每一個點Pi,對應的協方差矩陣C,如下:

此處,k是點Pi鄰近點的數目,表示最近鄰元素的三維質心,是協方差矩陣的第個特徵值,是第j個特徵向量。

下面利用PCL庫編寫程式計算一平面上各點的法向量和曲率,在三維空間座標系中,平面的一般方程是A*x + B*y + C*z + D = 0,該平面的法向量是(A, B, C), 曲率為0。下面我們針對平面方程x + y + z = 1,求出其法向量及曲率,具體程式碼如下:

 #include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
 
int main(int argc, char* argv[])
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr inCloud(new pcl::PointCloud<pcl::PointXYZ>);
        //construct a plane, the equation is x + y + z = 1
    for (float x = -1.0; x <= 1.0; x += 0.005)
    {
        for (float y = -1.0; y <= 1.0; y += 0.005)
        {
            pcl::PointXYZ cloud;
 
            cloud.x = x;
            cloud.y = y;
            cloud.z = 1 - x - y;
            inCloud->push_back(cloud);
        }
    }
 
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    pcl::PointCloud<pcl::Normal>::Ptr pcNormal(new pcl::PointCloud<pcl::Normal>);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    tree->setInputCloud(inCloud);
    ne.setInputCloud(inCloud);
    ne.setSearchMethod(tree);
    ne.setKSearch(50);
    //ne->setRadiusSearch (0.03); 
    ne.compute(*pcNormal);    
 
    pcl::PointCloud<pcl::PointXYZINormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointXYZINormal>);
    pcl::concatenateFields(*inCloud, *pcNormal, *cloud_with_normals);
 
    pcl::io::savePCDFile("plane_cloud_out.pcd", *cloud_with_normals);
 
    return 0;
}
 
檢視輸出的plane_cloud_out.pcd檔案內容為:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity normal_x normal_y normal_z curvature
SIZE 4 4 4 4 4 4 4 4
TYPE F F F F F F F F
COUNT 1 1 1 1 1 1 1 1
WIDTH 160801
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 160801
DATA ascii
-1 -1 3 0 -0.5790202 -0.57987827 -0.57312894 0.0013660738
-1 -0.995 2.9949999 0 -0.57917476 -0.58019817 -0.57264876 0.0012099775
-1 -0.99000001 2.99 0 -0.57867402 -0.58019888 -0.57315409 0.0013703115
-1 -0.98500001 2.9850001 0 -0.57548422 -0.57727969 -0.57928079 0
-1 -0.98000002 2.98 0 -0.57794726 -0.57705164 -0.57705146 0
-1 -0.97500002 2.9749999 0 -0.57838076 -0.57838166 -0.57528275 0.001083424
-1 -0.97000003 2.97 0 -0.57816029 -0.57827228 -0.57561421 0.0015886575
-1 -0.96500003 2.9650002 0 -0.57379341 -0.57841575 -0.57982439 0
-1 -0.96000004 2.96 0 -0.57350898 -0.57807595 -0.5804444 0
-1 -0.95500004 2.9549999 0 -0.57611471 -0.57911509 -0.57681662 0.00042304679
-1 -0.95000005 2.95 0 -0.5727694 -0.57773441 -0.58151358 0
-1 -0.94500005 2.9450002 0 -0.57519817 -0.57795346 -0.57889283 4.5525081e-005
-1 -0.94000006 2.9400001 0 -0.58162284 -0.57636297 -0.5740388 0.0012163053
-1 -0.93500006 2.9349999 0 -0.57649004 -0.57789612 -0.5776636 0.00061652815
-1 -0.93000007 2.9300001 0 -0.57858562 -0.57561904 -0.57784206 0.00059395749
-1 -0.92500007 2.9250002 0 -0.57974231 -0.57732123 -0.57497734 0.00094183162
-1 -0.92000008 2.9200001 0 -0.57631654 -0.57710737 -0.57862443 0
-1 -0.91500008 2.915 0 -0.58175957 -0.57761562 -0.57263952 0.0016304118
-1 -0.91000009 2.9100001 0 -0.57800007 -0.57729512 -0.57675499 0.00068382424
-1 -0.90500009 2.9050002 0 -0.57667315 -0.5772509 -0.57812595 0
-1 -0.9000001 2.9000001 0 -0.57496548 -0.57826763 -0.57881016 0
-1 -0.8950001 2.895 0 -0.57701188 -0.57737064 -0.57766801 0
-1 -0.8900001 2.8900001 0 -0.57927179 -0.57629073 -0.57648361 8.9984467e-005
-1 -0.88500011 2.8850002 0 -0.57844573 -0.57763427 -0.57596803 9.304475e-005
-1 -0.88000011 2.8800001 0 -0.57647377 -0.576976 -0.5785988 0
-1 -0.87500012 2.875 0 -0.57559562 -0.57702911 -0.57941955 0
 
可以看出一共輸出160801個點的資訊,這裡只列舉前面若干個,可以清晰的看出每個點的法向量與(1, 1, 1)共線,曲率為0或接近於0。

文章參考於點選開啟連結
--------------------- 
原文:https://blog.csdn.net/lming_08/article/details/18360329?utm_source=copy