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...