点云法线估计
PCL中的所有点云的法线都是指向视点的,视点坐标默认为(0,0,0),对视点进行设置,则可对法线进行定向。如图1与图2所示,分别为斯坦福兔子在视点坐标为(10,10,10)与(-10,-10,-10)时的法线显示情况。
图1 视点坐标为(10,10,10)时的法线显示
图2 视点坐标为(-10,-10,-10)时的法线显示
法线估计代码如下:
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d_omp.h>
#include <omp.h>
#include <pcl/visualization/cloud_viewer.h>
#include <string>
#include <atlstr.h>
using namespace std;
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("rabbit.pcd", *cloud);
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
ne.setNumberOfThreads(omp_get_max_threads());
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
ne.setViewPoint(10, 10, 10);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setKSearch(20);
ne.compute(*cloud_normals);
CString strFilePath(_T("D:\\Desktop\\点云法线.pcd"));
string saveFileName = CStringA(strFilePath);
pcl::PCDWriter savePCDFile;
savePCDFile.write(saveFileName, *cloud_normals);
boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer(new pcl::visualization::PCLVisualizer());
int v1(0);
m_viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
m_viewer->addCoordinateSystem(0.1, v1);
m_viewer->setBackgroundColor(128.0 / 255.0, 138.0 / 255.0, 135.0 / 255.0, v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud, 0, 255, 0);
m_viewer->addPointCloud(cloud, color, "cloud1", v1);
int v2(0);
m_viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
m_viewer->addCoordinateSystem(0.1, v2);
m_viewer->setBackgroundColor(128.0 / 255.0, 138.0 / 255.0, 135.0 / 255.0, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> Cap_Cloud_Point(cloud, 255, 0, 0);
m_viewer->addPointCloud(cloud, Cap_Cloud_Point, "cloud2", v2);
m_viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals, 2, 0.01, "normals", v2);
while (!m_viewer->wasStopped())
{
m_viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)