3d激光雷达开发(法向量预测)

Posted 费晓行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3d激光雷达开发(法向量预测)相关的知识,希望对你有一定的参考价值。

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        法向量在3d点云当中扮演很重要的一个角色。一个三维数据点的特征,不仅和它自己有关,还和它周围的点有关。而法向量,正是基于这一点所提出来的特征属性。参考代码原来的出处在这,https://blog.csdn.net/datase/article/details/84960497

1、准备normal_estimation.cpp文件

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char* argv[])

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

	if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1)
	
		PCL_ERROR("Could not read file\\n");
		return -1;
	

	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	tree->setInputCloud(cloud);
	n.setInputCloud(cloud);
	n.setSearchMethod(tree);
	n.setKSearch(20);
	n.compute(*normals);

	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer"));
	//viewer->initCameraParameters();

	int v1(0), v2(1), v3(2), v4(3);
	viewer->createViewPort(0.0, 0.0, 0.5, 0.5, v1);
	viewer->createViewPort(0.5, 0.0, 1.0, 0.5, v2);
	viewer->createViewPort(0.0, 0.5, 0.5, 1.0, v3);
	viewer->createViewPort(0.5, 0.5, 1.0, 1.0, v4);

	viewer->setBackgroundColor(5, 55, 10, v1);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 225, 0);

	viewer->addCoordinateSystem(0.5,"reference", v1);

	viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud", v1);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud0", v2);
	viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 50, 0.01, "normals", v2);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud1", v3);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud3", v4);

	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud3", 4);

	while (!viewer->wasStopped())
	
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	

	return 0;

2、准备CMakeLists.txt文件

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)

project(normal_estimation)

find_package(PCL 1.2 REQUIRED)

include_directories($PCL_INCLUDE_DIRS)
link_directories($PCL_LIBRARY_DIRS)
add_definitions($PCL_DEFINITIONS)

add_executable (normal_estimation normal_estimation.cpp)
target_link_libraries (normal_estimation $PCL_LIBRARIES)

3、生成sln文件,准备编译

4、执行normal_estimation.exe文件

        注意执行的时候,需要添加pcd点云文件,比如normal_estimation.exe bunny.pcd,

        其中,右下角这副图片里面的兔子,看上去身上有很多的“刺”。这其实是对应的法向量数值,放大一点看,是这样的,

以上是关于3d激光雷达开发(法向量预测)的主要内容,如果未能解决你的问题,请参考以下文章

3d激光雷达开发(字符串输出和实体绘制)

3d激光雷达开发(八叉树)

3d激光雷达开发(入门)

3d激光雷达开发(平面映射)

3d激光雷达开发(sift关键点)

3d激光雷达开发(绘制长方体)