本人在香港某高校读研究生,头疼脑热的选择了Lidar方向。最后的论文方向是建筑物边界的提取。我并没有一点编程基础以及点云知识储备,所以要从头开始学起,就在这里每天记录一下学习过程以及遇到的问题和想法。
进入正题:在获取到新鲜的点云数据之后,想要获取单纯的建筑物点云,第一步就是去除地面点数据。经过我的学习,我最开始分别用了三种方法:区域增长学习法,SACsegmentation滤波器法以及渐进式形态学滤波器法。
一.三种方法的PCL代码(可直接复制使用)
1.1 region_growing_segmentation分离地面
#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/region_growing.h>
#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
void PrintMemoryInfo( )
{
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS pmc;
hProcess=GetCurrentProcess();
printf( "\nProcess ID: %u\n", hProcess );
// Print information about the memory usage of the process.
//输出进程使用的内存信息
if (NULL == hProcess)
return;
if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
printf( "\tPeakWorkingSetSize: 0x%08X\n",
pmc.PeakWorkingSetSize );
printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakPagedPoolUsage );
printf( "\tQuotaPagedPoolUsage: 0x%08X\n",
pmc.QuotaPagedPoolUsage );
printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakNonPagedPoolUsage );
printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaNonPagedPoolUsage );
printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage );
printf( "\tPeakPagefileUsage: 0x%08X\n",
pmc.PeakPagefileUsage );
}
CloseHandle( hProcess );
}
using namespace pcl::console;
int
main (int argc, char** argv)
{
if(argc<2)
{
std::cout<<".exe xx.pcd -kn 50 -bc 0 -fc 10.0 -nc 0 -st 30 -ct 0.05"<<endl;
return 0;
}//如果输入参数小于1个,输出提示
time_t start,end,diff[5],option;
start = time(0);
int KN_normal=50; //设置默认输入参数
bool Bool_Cuting=false;//设置默认输入参数
float far_cuting=10,near_cuting=0,SmoothnessThreshold=5,CurvatureThreshold=0.05;//设置默认输入参数
parse_argument (argc, argv, "-kn", KN_normal);
parse_argument (argc, argv, "-bc", Bool_Cuting);
parse_argument (argc, argv, "-fc", far_cuting);
parse_argument (argc, argv, "-nc", near_cuting);
parse_argument (argc, argv, "-st", SmoothnessThreshold);
parse_argument (argc, argv, "-ct", CurvatureThreshold);//设置输入参数方式
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointC