点云库PCL学习笔记 -- 输入输出IO -- 1.从PCD文件中读取点云数据

点云库PCL学习笔记 -- 输入输出IO -- 1.从PCD文件中读取点云数据


PCD文件test_pcd.pcd

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 5
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 5
DATA ascii
1.28125 577.09375 197.9375
828.125 599.03125 491.375
358.6875 917.4375 842.5625
764.5 178.28125 879.53125
727.53125 525.84375 311.28125

使用pcl_viewer test_pcd.pcd查看该PCD文件,5个点的图像数据
在这里插入图片描述


读取PCD文件代码pcd_read.cpp

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

int
main(int argc,char** argv)
{
	//创建了一个名为cloud的指针,储存XYZ类型的点云数据
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
	
	//打开test_pcd.pcd的PCD文件
	if(pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd",*cloud) == -1)
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd\n");
		return(-1);
	}
	
	//PCD文件中: 点云数量 = width * height
	std::cout<<"Loaded "
			 <<cloud->width*cloud->height
			 <<" data points from test_pcd.pcd with the following fields: "
	<<std::endl;

	//打印PCD文件中的点云数据
	for(size_t i=0;i<cloud->points.size();++i)
		std::cout<<"    "<<cloud->points[i].x
				 <<" "<<cloud->points[i].y
				 <<" "<<cloud->points[i].z
		<<std::endl;

	return(0);
}

设置编译文件CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(pcd_read)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})	# 添加PCL头文件
link_directories(${PCL_LIBRARY_DIRS})	# 添加PCL库链接
add_definitions(${PCL_DEFINITIONS})

# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
# 添加可执行程序调用hello库中函数
# 将库文件链接到可执行程序上
add_executable(pcd_read pcd_read.cpp)
target_link_libraries(pcd_read ${PCL_LIBRARIES})

编译
mkdir build
cd build/
cmake ..
make

执行程序

cd ..
./build/pcd_read

结果如下
在这里插入图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码: ```c++ #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/surface/convex_hull.h> #include <pcl/surface/alpha_shape.h> int main(int argc, char** argv) { if (argc < 3) { std::cerr << "Usage: " << argv[0] << " input.pcd output.pcd" << std::endl; return -1; } // 加载点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1) { std::cerr << "Failed to load " << argv[1] << std::endl; return -1; } // 计算凸包 pcl::PointCloud<pcl::PointXYZ>::Ptr hull(new pcl::PointCloud<pcl::PointXYZ>); pcl::ConvexHull<pcl::PointXYZ> chull; chull.setInputCloud(cloud); chull.reconstruct(*hull); // 计算 alpha-shape pcl::PointCloud<pcl::PointXYZ>::Ptr alpha(new pcl::PointCloud<pcl::PointXYZ>); pcl::AlphaShape<pcl::PointXYZ> ashape; ashape.setInputCloud(cloud); ashape.setAlpha(0.1); // 设置 alpha 值 ashape.setMode(pcl::AlphaShape<pcl::PointXYZ>::Mode::REGULARIZED_ALPHA); ashape.setTrianglePixelSize(10); // 设置三角形像素大小 ashape.setAlphaLimits(0.01, 10000); // 设置 alpha 值的上下限 ashape.setCheckMinPts(true); // 是否检查最小点数 ashape.setMinPts(10); // 设置最小点数 ashape.getAlphaShape(*alpha); // 保存点云数据 pcl::io::savePCDFileASCII(argv[2], *alpha); std::cout << "Saved " << alpha->size() << " data points to " << argv[2] << std::endl; return 0; } ``` 这段代码使用了 PCL 的 `ConvexHull` 和 `AlphaShape` 算法来提取点云的边缘,并将结果保存到输出文件。在代码,需要替换输入文件和输出文件文件名。同时,还可以自定义 alpha 值、三角形像素大小和最小点数等参数来控制边缘提取的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值