點雲的法向量

2021-07-08 09:04:21 字數 4511 閱讀 9913

1.在這裡採用的是pcl點雲庫。pcl點雲庫可能存在配置問題,用cmake時候預設支援的是32位的處理,所以建議安裝pcl 32位的all-in-one。這樣不容易產生錯誤。

2. 下面試cmake的內容。

cmake_minimum_required(version 2.6 fatal_error)

project(my_normal_project)

find_package(pcl 1.3 required )

include_directories($)

link_directories($)

add_definitions($)

add_executable(normaltest normaltest.cpp)

target_link_libraries(normaltest $)

3.下面是no

rmal

test

.cpp

的內容

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef pcl::pointxyzrgb pointt;

typedef pcl::pointcloudpointcloudt;

//using namespace std;

intmain (int argc,

char *argv)

; sprintf(filename, "data%d.txt", jj);

/*fstream in(filename);*/

in.open(filename, fstream::in);

cout

<

/in.open("data0.txt", fstream::in);

in.seekg(0);

int numpoint;

//int nnnn=10000;

while (!in.eof())// while(nnnn--)

cout

<

<

// load point cloud from disk

pcl::pointcloud::ptr cloud (new pcl::pointcloud);

// fill in the cloud data

cloud->width = numpoint;

cloud->height = 1;

cloud->points.resize (cloud->width * cloud->height);

cout

points.size (); ++i)

for (size_t i = 0; i < cloud->points.size (); ++i)

//pointcloudt::ptr cloud (new pointcloudt);

pointcloudt::ptr cloud_centered (new pointcloudt);

// compute 3d centroid of the point cloud

eigen::vector4f centroid;

pcl::compute3dcentroid (*cloud, centroid);

std::cout

<< "centroid\n"

<< centroid.head<3>() << std::endl;

// translate point cloud centroid to origin

eigen::affine3f transformation (eigen::affine3f::identity());

transformation.translation() << -centroid.head<3>();

pcl::transformpointcloud(*cloud, *cloud_centered, transformation);

// normal estimation

pcl::pointcloud::ptr cloud_normals (new pcl::pointcloud);

pcl::pointcloud::ptr cloud_centered_normals (new pcl::pointcloud);

pcl::search::kdtree::ptr tree (new pcl::search::kdtree());

pcl::normalestimationne;

ne.setsearchmethod (tree);

ne.setradiussearch (0.0072);

ne.setviewpoint (0, 0, 1.0);

// compute normals on original cloud

ne.setinputcloud (cloud);

ne.compute (*cloud_normals);

// compute normals on centered cloud

ne.setinputcloud (cloud_centered);

ne.compute (*cloud_centered_normals);

//write file

char filename1[30] = ;

sprintf(filename1, "normal%d.asc", jj);

/*fstream in(filename);*/

std::fstream out1;

out1.open(filename1, fstream::out);

for (size_t i = 0; i < cloud->points.size (); ++i)

out1.close();

char filename2[50] = ;

sprintf(filename2, "normalcenter%d.asc", jj);

/*fstream in(filename);*/

std::fstream out2;

out2.open(filename2, fstream::out);

for (size_t i = 0; i < cloud->points.size (); ++i)

out2.close();

x_vector.clear();

y_vector.clear();

z_vector.clear();

r_vector.clear();

g_vector.clear();

b_vector.clear();

cout

<

/ visualization

pcl::visualization::pclvisualizer viewer ("normals visualizer");

int v1(0); int v2(1);

viewer.createviewport (0.0, 0.0, 0.5, 1.0, v1);

viewer.createviewport (0.5, 0.0, 1.0, 1.0, v2);

viewer.setbackgroundcolor(0.1, 0.1, 0.1, v2);

// add point clouds

viewer.addpointcloud (cloud, "cloud", v1);

viewer.addpointcloudnormals(cloud, cloud_normals, 1, 0.05, "normals", v1);

viewer.addpointcloud (cloud_centered, "cloud_centered", v2);

viewer.addpointcloudnormals(cloud_centered, cloud_centered_normals, 1, 0.05, "centered_normals", v2);

while (!viewer.wasstopped ())

viewer.spinonce ();

} return

0;}

4.這是輸入點雲的檔案

本人的點雲資料中一行包括了xy

zrgb

uv其實估算法向向量只要用到xy

5.通過cmake編譯了程式之後,在利用vs生成之後在debug檔案下,直接執行exe檔案就可以得到點雲的方向量

6.視覺化的結果

pcl計算點雲法向量

最近因為專案,需要計算點雲的法向量,所以在網上看了一些資料,然後知道pcl庫裡面有這些功能,pcl的法向量計算的原理 pcl裡面計算點雲 自己的理解 根據頂點取樣最近的區域性點雲 k個 根據自己的點雲擬合出乙個區域性平面,然後計算平面的法向量。就是頂點的向量。計算可以通過pca那種,可以計算頂點的三...

PCL中計算點雲的法向量並顯示

參考源 利用的是最小二乘估計的方法計算了點雲的法向量,並且提供了兩種法線的顯示方法,還設定了多個viewport,練習了點雲的顯示 include stdafx.h include include include include include include int main 計算法線 pcl n...

利用Eigen庫,PCA構建點雲法向量

疫情在家,想做科研,可是資料都在學校電腦裡面。只能看看能不能回想起什麼寫點什麼。這次主要是想把提取出的點雲patch單獨進行點雲法向量的計算,因為已經構成patch,則不需使用knn或者設定鄰域半徑。接下來手撕 pca 來構建點雲法向量。1 define crt secure no warnings...