“错误 C3861 “pop_t”: 找不到标识符 ”

基于统计分析的StatisticalOutlierRemoval滤波器

该滤波器主要用于移除离群点,那么什么样的点是离群点呢?计算点云中每个点与其所有临近点的平均距离,并假设其结果为一形状由均值和标准差决定的高斯分布,若有某点平均距离在标准范围(由全局距离平均值和方差定义)之外,则定义为离群点,并将其从数据集中去除掉,这也是本滤波器的内在处理逻辑,即对每个点的邻域进行一个统计分析。
激光扫描通常会产生密度不均匀的点云数据,另外,测量中的误差也会产生稀疏的离群点。
代码如下

#include <iostream> 
#include <pcl/io/pcd_io.h>
 #include <pcl/point_types.h> 
 #include <pcl/filters/statistical_outlier_removal.h>  i
 nt main(int argc, char** argv) 
 { 	
	 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 	
	 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);  
 	pcl::PCDReader reader;   // 定义读取对象 	
 	reader.read<pcl::PointXYZ>("table_scene_lms400.pcd", *cloud);  // 读取点云文件  	
 	std::cerr << "Cloud before filtering: " << std::endl; 	std::cerr << *cloud << std::endl;  	
 	/*创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1  这意味着如果一 	个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来*/ 	
 	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建滤波器对象 	
 	sor.setInputCloud(cloud);                          //设置待滤波的点云 	
 	sor.setMeanK(50);                                  //设置在进行统计时考虑查询点临近点数 
	sor.setStddevMulThresh(1.0);                       //设置判断是否为离群点的阀值 	sor.filter(*cloud_filtered);                      
 	 //执行滤波处理保存内点到在cloud_filtered  
 	//打印滤波后的数据 
	std::cerr << "Cloud after filtering: " << std::endl; 	
	std::cerr << *cloud_filtered << std::endl;
	//将过滤后得到的剩余内部点存入磁盘 	
 	pcl::PCDWriter writer; 	
 	writer.write<pcl::PointXYZ>("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
 	//使用同样的参数再次调用该滤波器,但是利用函数setNegative设置使输出取外点,以获取离群点,并存储 	
 	sor.setNegative(true); 	
 	sor.filter(*cloud_filtered); 
 	writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd", *cloud_filtered, false);  	
 	return (0);
 } 

在这里插入图片描述
参见https://github.com/mariusmuja/flann/issues/386

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
非常抱歉,我之前的回答有误。Windows API 中并没有提供名为 `GetSystemCpuUsage` 的函数,所以编译器提示找不到该标识符,导致编译错误。 如果需要获取系统 CPU 占用率,可以使用性能数据助手(Performance Data Helper,简称 PDH)API。PDH API 是一个用于获取计算机性能数据的 API,可以获取包括 CPU 占用率在内的各种性能数据。 以下是一个使用 PDH API 获取系统 CPU 占用率的示例程序: ```c++ #include <iostream> #include <Windows.h> #include <Pdh.h> #pragma comment(lib, "Pdh.lib") int main() { PDH_STATUS status; PDH_HQUERY hQuery; PDH_HCOUNTER hCounter; DWORD dwCounterType; PDH_FMT_COUNTERVALUE counterVal; // 打开一个 PDH 查询 status = PdhOpenQuery(NULL, NULL, &hQuery); if (status != ERROR_SUCCESS) { std::cerr << "PdhOpenQuery failed with error code " << status << std::endl; return 1; } // 添加一个计数器到查询中,用于获取 CPU 占用率 status = PdhAddCounter(hQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &hCounter); if (status != ERROR_SUCCESS) { std::cerr << "PdhAddCounter failed with error code " << status << std::endl; PdhCloseQuery(hQuery); return 1; } // 收集查询数据 status = PdhCollectQueryData(hQuery); if (status != ERROR_SUCCESS) { std::cerr << "PdhCollectQueryData failed with error code " << status << std::endl; PdhCloseQuery(hQuery); return 1; } // 获取计数器值 status = PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwCounterType, &counterVal); if (status != ERROR_SUCCESS) { std::cerr << "PdhGetFormattedCounterValue failed with error code " << status << std::endl; PdhCloseQuery(hQuery); return 1; } // 输出 CPU 占用率 std::cout << "CPU Usage: " << counterVal.doubleValue << "%" << std::endl; // 关闭查询 PdhCloseQuery(hQuery); return 0; } ``` 在该程序中,首先使用 `PdhOpenQuery` 函数打开一个 PDH 查询,然后使用 `PdhAddCounter` 函数添加一个计数器用于获取 CPU 占用率。接着使用 `PdhCollectQueryData` 函数收集查询数据,再使用 `PdhGetFormattedCounterValue` 函数获取计数器值。最后输出 CPU 占用率,再使用 `PdhCloseQuery` 函数关闭查询。 需要注意的是,该程序使用了 PDH API,需要在程序中包含 `Pdh.h` 头文件,并链接 `Pdh.lib` 库。在 Visual Studio 等集成开发环境中,可以在项目属性中设置链接库文件,或者在代码中使用 `#pragma comment(lib, "Pdh.lib")` 显示地指定链接库文件。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值