当前位置: 首页 > news >正文

PCL常用的点云操作

PCL常用的点云操作

  • 1、PCL有序点云分析
  • 2、PCL绘制直线
  • 3、获取点云质心
  • 4、判断点云是否是非数
  • 5、移除无效点
  • 6、PCL计算两点之间的欧式距离

1、PCL有序点云分析

在这里插入图片描述
对于有序点云可以通过 at 的方式访问,但是,需要注意的是,正确的访问方式是 at(w, h)。

//读写
#include <pcl/io/pcd_io.h> 
#include <pcl/point_types.h>  

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
//读取点云示例
int main()
{
	PointCloudT::Ptr mpCloudSource;
	mpCloudSource.reset(new(PointCloudT));
	pcl::PCDReader reader;
	int sucess = reader.read(PointPath, *mpCloudSource);
	if (sucess == -1)
	{
		std::cout << "read point file failure!..." << std::endl;
		return -1;
	}
	//访问有序点云数据
	for (int i = 0; i < mpCloudSource->width; i++)
	{
		for (int j = 0; j < mpCloudSource->height; j++)
		{
			pcl::PointXYZ pointcloud = mpCloudSource->at(width, height);
		}
	}
}

2、PCL绘制直线

绘制直线(每条线段1个唯一的id符,不然的话只能画出一条线):

//cloudOut->points.size():所有的直线点
for (int i = 0; i < cloudOut->points.size() - 1; i++)
{
    std::string id = "line_" + std::to_string(i);
    viewer.addLine(cloudOut->points[i], cloudOut->points[i + 1], 0.0, 0.0, 1.0, id, v1);
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 6, id);
}
viewer.addText("points trajectory line", 10, 920, 16, bckgr_gray_level, bckgr_gray_level, txt_gray_lvl, "line", v1);

3、获取点云质心

获取点云的质心有两种方式,一种是pcl自带的API:pcl::compute3DCentroid(*cloud, centroid);,另一种是用数学的方式求所有点坐标的平均值。下面的代码实现了这两种方式。

#include <iostream>
#include <Eigen/Core>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/centroid.h>
#include <pcl/common/transforms.h>
 
using namespace std;
typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
int main(int argc, char **argv)
{
    // 生成一个正方形点云
    Cloud::Ptr cloud(new Cloud);
    cloud->width = 10000;
    cloud->height = 1;
    cloud->is_dense = false;
    cloud->points.resize(cloud->width * cloud->height);  
    
    for (int i = 0; i < cloud->points.size(); i++)
    {
        cloud->points[i].x=1000* (rand() / (RAND_MAX + 1.0f));
        cloud->points[i].y=1000* (rand() / (RAND_MAX + 1.0f));
        cloud->points[i].z=0;
    }
    
    // 方式1:利用PCL函数计算质心
    Eigen::Vector4f centroid;                    // 质心
    pcl::compute3DCentroid(*cloud, centroid);    // 齐次坐标,(c0,c1,c2,1)
 
    // 方式2:利用公式计算质心
    pcl::PointXYZ p_c;
    p_c.x = 0; p_c.y = 0; p_c.z = 0;
    for (auto p : cloud->points) {
        p_c.x += p.x;
        p_c.y += p.y;
        p_c.z += p.z;
    }
 
    p_c.x /= cloud->points.size();
    p_c.y /= cloud->points.size();
    p_c.z /= cloud->points.size();
 
    // 结果对比
    cout << "pcl 函数计算点云质心结果:(" << centroid(0)<<","<<centroid(1)<<","<<centroid(2)<<")" << endl;
    cout << "按照公式计算点云质心结果:" << p_c<< endl;
    
    return 0;
}

4、判断点云是否是非数

pcl::PointXYZ pointcloud = cloudDownSampling->points[idx];
if (!isFinite(pointcloud)) //不是有效点
    continue;

5、移除无效点

// Object for storing the point cloud.
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
// Read a PCD file from disk.
if (pcl::io::loadPCDFile<pcl::PointXYZRGB>(argv[1], *cloud) != 0)
{
    return -1;
}
// The mapping tells you to what points of the old cloud the new ones correspond,
// but we will not use it.
std::vector<int> mapping;
pcl::removeNaNFromPointCloud(*cloud, *cloud, mapping);

6、PCL计算两点之间的欧式距离

for(int i=0;i<cloud->points.size()-1;i++)
{
     float dis=pcl::euclideanDistance(cloud->points[i],cloud->points[i+1]);
}

###################################未完待续###################################

相关文章:

  • RedisTemplate重写的一些模板
  • html的列表标签
  • 实习日志15
  • 操作系统——内存管理(附带Leetcode算法题LRU)
  • Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)
  • proxy配置
  • 移动端App自动化之触屏操作自动化
  • 冒泡排序及其优化
  • 机器学习和统计学的区别?
  • python基本语法
  • git错误整理
  • 深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录
  • Django学习全纪录:Django开发环境的搭建
  • uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
  • DS:八大排序之归并排序、计数排序
  • PyCharm 取消所有断点
  • 数据模型概念
  • unity学习(20)——客户端与服务器合力完成注册功能(2)调试注册逻辑
  • 计算机专业必看《编程之神》
  • 7.1 Qt 中输入行与按钮
  • 国新办发布《关于新冠疫情防控与病毒溯源的中方行动和立场》白皮书
  • 准80后湖北省财政厅副厅长徐晶华已调任襄阳市副市长
  • 宁波银行一季度净利74.17亿元增5.76%,不良率持平
  • 中介在网上非法贩婴“一个孩子8.5万元”?丹阳警方介入
  • 流浪猫给车主造成困扰,长春一小区拟投药应对?律师:此举欠妥
  • 普京发表声明感谢协助俄军收复库尔斯克州的朝鲜军人