pcd、jpg、raw、txt、二进制文件的读写操作

本文介绍了PCD点云数据文件格式,详细讲解了jpg图片文件,以及如何使用C++的fstream库进行txt文本文件和二进制文件的读写操作,包括txt文件的>>和<<操作,二进制文件的get和put方法,以及read和write函数。此外,还提及了raw文件的特性。
摘要由CSDN通过智能技术生成

1. pcd文件

PCD:point cloud data点云数据文件格式(三维点坐标)。
参考:https://blog.csdn.net/qq_22170875/article/details/84785261

// 实现功能:两幅点云icp配准
//(PCL库文件中)pcd文件的读和写操作
#include <iostream>
using namespace std;
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/registration/icp.h> //ICP(iterative closest point)配准
#include <pcl/filters/voxel_grid.h>//体素滤波
using namespace pcl;

int main() {
   
	typedef PointXYZ PointT;
	typedef PointCloud<PointT> pointCloud;
	pointCloud::Ptr cloud1(new pointCloud), cloud2(new pointCloud), cloud3(new pointCloud), cloud4(new pointCloud), cloud5(new pointCloud), cloud6(new pointCloud);
	PCLPointCloud2::Ptr pcloud(new PCLPointCloud2), pcloud1(new PCLPointCloud2);
	//读pcd文件
	PCDReader reader;
	reader.read("D:\\visual studio learning\\test_pointcloudmatch\\12滤.pcd", *cloud1);
	reader.read("D:\\visual studio learning\\test_pointcloudmatch\\34滤.pcd", *cloud2);

	IterativeClosestPoint<PointT, PointT> icp; //创建ICP对象,用于ICP配准
	icp.setInputSource(cloud1); //设置输入点云
	icp.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
	//icp 参数设置
	icp.setMaximumIterations(100);  //最大迭代次数
	icp.setEuclideanFitnessEpsilon(0.01);//设置收敛条件是均方误差和小于阈值,停止迭代
	icp.setTransformationEpsilon(1e-10); //设置两次变化矩阵之间的差值;
	//icp.setMaxCorrespondenceDistance(0.7); //设置对应点对之间的最大距离;对配准影响较大
	//保存配准后的点
	icp.align(*cloud3);
	//icp匹配后的转换矩阵及得分
	cout << "has converged: " << icp.hasConverged() << endl
		<< "score: " << icp.getFitnessScore() << endl
		<< "迭代次数:"<<icp.nr_iterations_ << endl;
	cout << icp.getFinalTransformation() << endl;//icp.hasConverged()=1说明本次配准成功;icp.getFinalTransformation()可输出变换矩阵;icp.nr_iterations_显示迭代的次数; icp.getFitnessScore() 两幅点云拟合(配准)程度的好坏
	//写pcd文件
	PCDWriter writer;
	writer.write("D:\\visual studio learning\\test_pointcloudmatch\\12粗配准.pcd", *cloud3);

	IterativeClosestPoint<PointT, PointT> icp1; //创建ICP对象,用于ICP配准
	icp1.setInputSource(cloud3); //设置输入点云
	icp1.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
	//icp 参数设置
	icp1.setMaximumIterations(100);  //最大迭代次数
	icp1.setEuclideanFitnessEpsilon(0.001);//前后两次迭代误差的差值
	icp1.setTransformationEpsilon(1e-12); //上次转换与当前转换的差值;
	icp1.setMaxCorrespondenceDistance(20); //忽略在此距离之外的点,对配准影响较大
	//保存配准后的点
	icp1.align(*cloud4);
	//icp匹配后的转换矩阵及得分
	cout << "has converged: " << icp1.hasConverged() << endl
		<< "score: " << icp1.getFitnessScore() << endl
		<< "迭代次数:" << icp1.nr_iterations_ << endl;
	cout << icp1.getFinalTransformation() << endl;
	writer.write("D:\\visual studio learning\\test_pointcloudmatch\\12精粗配准.pcd", *cloud4);

	IterativeClosestPoint<PointT, PointT> icp2; //创建ICP对象,用于ICP配准
	icp2.setInputSource(cloud4); //设置输入点云
	icp2.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
	//icp 参数设置
	icp2.setMaximumIterations(100);  //最大迭代次数
	icp2.setEuclideanFitnessEpsilon(0.0001);//前后两次迭代误差的差值
	icp2.setTransformationEpsilon(1e-14); //上次转换与当前转换的差值;
	icp2.setMaxCorrespondenceDistance(5); //忽略在此距离之外的点,对配准影响较大
	//保存配准后的点
	icp2.align(*cloud5);
	//icp匹配后的转换矩阵及得分
	cout << "has converged: " << icp2.hasConverged() << endl
		<< "score: " << icp2.getFitnessScore() << endl
		<< "迭代次数:" << icp2.nr_iterations_ << endl;
	cou
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值