PCL:getMeanStd ---- 计算点云均值与标准差

1 函数原型

pcl::getMeanStd (const std::vector<float> &values, double &mean, double &stddev)

或者

pcl::getMeanStdDev(const std::vector<float> &values, double &mean, double &stddev);

2 代码实现

给定float类型的向量,输出均值和标准差

#include <pcl/io/pcd_io.h>
#include <pcl/common/common.h>	

using namespace std;

typedef pcl::PointXYZ PointT;

int main()
{
	//---------------------------- 加载点云 --------------------------
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
	if (pcl::io::loadPCDFile("test.pcd", *cloud) < 0)
	{
		PCL_ERROR("->点云文件不存在!\a\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud->points.size() << " 个数据点" << endl;
	//================================================================


	//------------------------ 计算点云均值与标准差 --------------------
	double mean;	//点云均值
	double stddev;	//点云标准差
	vector<float> vec_x;
	for (size_t i = 0; i < cloud->points.size(); i++)
	{
		vec_x.push_back(cloud->points[i].x);
	}

	pcl::getMeanStd(vec_x, mean, stddev);
	cout << "\n->点云X坐标的均值为:" << endl;
	cout << mean << endl;
	cout << "\n->点云X坐标的标准差为:" << endl;
	cout << stddev << endl;
	//================================================================

	return 0;
}

源码:

pcl::getMeanStd (const std::vector<float> &values, double &mean, double &stddev)
{
  double sum = 0, sq_sum = 0;

  for (size_t i = 0; i < values.size (); ++i)
  {
    sum += values[i];
    sq_sum += values[i] * values[i];
  }
  mean = sum / static_cast<double>(values.size ());
  double variance = (sq_sum - sum * sum / static_cast<double>(values.size ())) / (static_cast<double>(values.size ()) - 1);
  stddev = sqrt (variance);
}

3 输出结果

->加载了 1348 个数据点

->点云X坐标的均值为:
6.86964

->点云X坐标的标准差为:
4.48687

4 源码

inline void
pcl::getMeanStd (const std::vector<float> &values, double &mean, double &stddev)
{
  double sum = 0, sq_sum = 0;

  for (size_t i = 0; i < values.size (); ++i)
  {
    sum += values[i];
    sq_sum += values[i] * values[i];
  }
  mean = sum / static_cast<double>(values.size ());
  double variance = (sq_sum - sum * sum / static_cast<double>(values.size ())) / (static_cast<double>(values.size ()) - 1);
  stddev = sqrt (variance);
}

相关链接

PCL点云数据处理基础❤️❤️❤️目录


版权声明:本文为weixin_46098577原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。