从pcl删除点_PCL常用操作

  1. 如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型?
  2. 如何实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换?
  3. PointCloud和PCLPointCloud2类型如何相互转换?
  4. 如何加快ASCII格式存储,也就是记事本打开可以看到坐标数据的pcd文件读取速度?建议将pcd文件换成以Binary格式存储。
  5. 如何给pcl::PointXYZ类型的点云在显示时指定颜色?
  6. 如何查找点云的x,y,z的极值?
  7. 如何判断点云中的点为无效点,即坐标值为nan,以及如何将点设置为无效点?
  8. 如何将无效点从点云中移除?
  9. 如果知道需要保存点的序号,如何从原点云中拷贝点到新点云?
  10. 如何从点云里删除和添加点?
  11. 如何对点云进行全局或局部的空间变换?
  12. 链接两个点云字段(两点云大小必须相同)

1.如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型?

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
int main(int argc, char **argv)
{
	pcl::PCLPointCloud2 cloud;
	pcl::PCDReader reader;
	reader.readHeader("bun0.pcd", cloud);
	for (int i = 0; i < cloud.fields.size(); i++)
	{
		std::cout << cloud.fields[i].name;
	}
}

2.如何实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换?

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloudPointer;
cloudPointer = cloud.makeShared();

3.PointCloud和PCLPointCloud2类型如何相互转换?

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCLPointCloud2 cloud2;
pcl::io::loadPCDFile("C:office3-after21111.pcd", cloud2);
pcl::fromPCLPointCloud2(cloud2, *cloud);
pcl::toPCLPointCloud2(*cloud, cloud2);

4.如何加快ASCII格式存储,也就是记事本打开可以看到坐标数据的pcd文件读取速度?建议将pcd文件换成以Binary格式存储。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("C:office3-after1.pcd", *cloud);
pcl::io::savePCDFileBinary("C:office3-after21111.pcd", *cloud);

5.如何给pcl::PointXYZ类型的点云在显示时指定颜色?

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("C:office3-after21111.pcd", *cloud);
 
pcl::visualization::PCLVisualizer viewer("pointcloud viewer");
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sig(cloud, 0, 234, 0);
viewer.addPointCloud(cloud, sig, "cloud");
while (!viewer.wasStopped())
{
    viewer.spinOnce();
}

6.如何查找点云的x,y,z的极值?

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

int main(int argc, char **argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
	cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("bun0.pcd", *cloud);
	pcl::PointXYZ minPt, maxPt;
	pcl::getMinMax3D(*cloud, minPt, maxPt);
	std::cerr << " " << minPt.x << " " << minPt.y << " " << minPt.z << std::endl;
	std::cerr << " " << maxPt.x << " " << maxPt.y << " " << maxPt.z << std::endl;
}

7.如何判断点云中的点为无效点,即坐标值为nan,以及如何将点设置为无效点?

#include <pcl/point_types.h>

int main(int argc, char **argv)
{
	pcl::PointXYZ p_valid;
	p_valid.x = 0;
	p_valid.y = 0;
	p_valid.z = 0;
	std::cout << "Is p_valid valid? " << pcl::isFinite(p_valid) << std::endl;

	pcl::PointXYZ p_invalid;
	p_invalid.x = std::numeric_limits<float>::quiet_NaN();
	p_invalid.y = 0;
	p_invalid.z = 0;
	std::cout << "Is p_invalid valid? " << pcl::isFinite(p_invalid) << std::endl;

}

8.如何将无效点从点云中移除?

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/filter.h>

int main(int argc, char **argv)
{
	typedef pcl::PointCloud<pcl::PointXYZ> CloudType;
	CloudType::Ptr cloud(new CloudType);
	cloud->is_dense = false;
	CloudType::Ptr output_cloud(new CloudType);

	CloudType::PointType p_nan;
	p_nan.x = std::numeric_limits<float>::quiet_NaN();
	p_nan.y = std::numeric_limits<float>::quiet_NaN();
	p_nan.z = std::numeric_limits<float>::quiet_NaN();
	cloud->push_back(p_nan);

	CloudType::PointType p_valid;
	p_valid.x = 1.0f;
	cloud->push_back(p_valid);

	std::cout << "size: " << cloud->points.size() << std::endl;

	std::vector<int> indices;
	pcl::removeNaNFromPointCloud(*cloud, *output_cloud, indices);
	std::cout << "size: " << output_cloud->points.size() << std::endl;
}

9.如果知道需要保存点的序号,如何从原点云中拷贝点到新点云?

#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>

int main(int argc, char **argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("bun0.pcd", *cloud);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>);
	std::vector<int > indexs = { 1, 2, 5 };
	pcl::copyPointCloud(*cloud, indexs, *cloudOut);
}

10.如何从点云里删除和添加点?

#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
int main(int argc, char **argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("bun0.pcd", *cloud);
	pcl::PointCloud<pcl::PointXYZ>::iterator index = cloud->begin();
	cloud->erase(index);//删除第一个
	index = cloud->begin() + 5;
	cloud->erase(cloud->begin());//删除第5个
	pcl::PointXYZ point = { 1, 1, 1 };
	//在索引号为5的位置1上插入一点,原来的点后移一位
	cloud->insert(cloud->begin() + 5, point);
	cloud->push_back(point);//从点云最后面插入一点
	std::cout << cloud->points[5].x;//输出1
}

11.如何对点云进行全局或局部的空间变换?

#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
        pcl::io::loadPCDFile("path/.pcd",*cloud);
//全局变化
 //构造变化矩阵
        Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
        float theta = M_PI/4;   //旋转的度数,这里是45度
        transform_1 (0,0) = cos (theta);  //这里是绕的Z轴旋转
        transform_1 (0,1) = -sin(theta);
        transform_1 (1,0) = sin (theta);
        transform_1 (1,1) = cos (theta);
        //   transform_1 (0,2) = 0.3;   //这样会产生缩放效果
        //   transform_1 (1,2) = 0.6;
        //    transform_1 (2,2) = 1;
        transform_1 (0,3) = 25; //这里沿X轴平移
        transform_1 (1,3) = 30;
        transform_1 (2,3) = 380;
        pcl::PointCloud<pcl::PointXYZ>::Ptr transform_cloud1 (new pcl::PointCloud<pcl::PointXYZ>);
        pcl::transformPointCloud(*cloud,*transform_cloud1,transform_1);  //不言而喻
        
        //局部
        pcl::transformPointCloud(*cloud,pcl::PointIndices indices,*transform_cloud1,matrix); //第一个参数为输入,第二个参数为输入点云中部分点集索引,第三个为存储对象,第四个是变换矩阵。

12..链接两个点云字段(两点云大小必须相同)

pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_nomal (new pcl::PointCloud<pcl::PointNormal>);
pcl::concatenateFields(*cloud,*cloud_normals,*cloud_with_nomal);

转载:

点云库PCL学习--点云常用操作_C#_zzh_AI的博客-CSDN博客​blog.csdn.net
e35b5eb8f41cd2613897e42fd2f7e66f.png
pcl小知识(七)--增添点云、点云空间变换、点云链接、删除空值_C/C++_liukunrs的博客-CSDN博客​blog.csdn.net
65f6d363926f1be779e0448c24e06733.png
CSDN-专业IT技术社区-登录​blog.csdn.net
  • 18
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值