点云TXT与PCD格式之间的转换

2023-11-02

开发环境为win10+vstudio2019。

注:.txt形式的点云文件没有header,存储的全是xyz数据。如下图:

这个点云数据中不仅包含有x、y、z的位置信息,还包含其他的位置信息,因此我们只需要提取前三列的信息,并忽略前两行。提取后的数据如下图:

 提取后的点云并完成可视化,可视化效果如下图:

源码如下:
extrat_txt.hpp

#include <iostream>
#include <vector>
#include <iomanip>
#include <fstream>
#include <sstream>

using namespace std;

class ExtraTXT
{
public:
	void processing(string a,string b)
	{
		//从txt文件中获取指定列的内容
		ifstream ifs;
		ifs.open(a, ios::in);
		if (!ifs.is_open())
		{
			cout << "打开文件失败!!!";
		}
		cout << "数据读取中" << endl;
		vector<double> x, y, z;
		vector<string> item;				
		string temp;						
		while (getline(ifs, temp))          
		{
			item.push_back(temp);
		}
		for (auto it = item.begin() + 2; it != item.end(); it++)
		{
			istringstream istr(*it);                 
			string str;
			int count = 0;							 
			while (istr >> str)                      
			{
				if (count == 0)
				{
					double r = atof(str.c_str());       
					x.push_back(r);
				}
				else if (count == 1)
				{
					double r = atof(str.c_str());
					y.push_back(r);
				}
				else if (count == 2)
				{
					double r = atof(str.c_str());
					z.push_back(r);
				}
				count++;
			}
		}
		cout << "数据读取完成,正在生成新的txt文件" << endl;
		ofstream ofs;
		ofs.open(b, std::ios::out | std::ios::app);
		for (int i = 0; i < x.size(); i++)
		{
			ofs << x[i] << " " << y[i] << " " << z[i] << endl;
		}
		ofs.close();
		cout << "新的txt生成完成" << endl;
	}
};

main.cpp:

#pragma warning(disable:4996)
#include "extrat_txt.hpp"
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include<pcl/visualization/cloud_viewer.h>
#include<boost/thread/thread.hpp>

using namespace std;
using namespace pcl;

typedef struct tagPOINT_3D
{
	double x;  //mm world coordinate x
	double y;  //mm world coordinate y
	double z;  //mm world coordinate z
	double r;
}POINT_WORLD;

int main()
{
	ExtraTXT extra_txt;
	extra_txt.processing("未处理的txt/6.txt", "处理过的txt/6.txt");
   
	//加载txt数据
	int number_Txt;
	FILE* fp_txt;
	tagPOINT_3D TxtPoint;
	vector<tagPOINT_3D> m_vTxtPoints;
	fp_txt = fopen("处理过的txt/6.txt", "r");//这个地方填文件的位置
	cout << "txt正在转换为pcd" << endl;
	if (fp_txt)
	{
		while (fscanf(fp_txt, "%lf %lf %lf", &TxtPoint.x, &TxtPoint.y, &TxtPoint.z) != EOF)
		{
			m_vTxtPoints.push_back(TxtPoint);
		}
	}
	else
		cout << "txt数据加载失败!" << endl;
	number_Txt = m_vTxtPoints.size();
	pcl::PointCloud<pcl::PointXYZ> cloud;

	// Fill in the cloud data
	cloud.width = number_Txt;
	cloud.height = 1;
	cloud.is_dense = false;
	cloud.points.resize(cloud.width * cloud.height);
	for (size_t i = 0; i < cloud.points.size(); ++i)
	{
		cloud.points[i].x = m_vTxtPoints[i].x;
		cloud.points[i].y = m_vTxtPoints[i].y;
		cloud.points[i].z = m_vTxtPoints[i].z;
	}
	pcl::io::savePCDFileASCII("pcd/6.pcd", cloud);//这个地方填输出的路径
	std::cerr << "Saved " << cloud.points.size() << " data points to txt2pcd.pcd." << std::endl;
	cout << "txt转换pcd完成" << endl;

	//将pcl::PointCloud转换为pcl::PointCloud::Ptr类型
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud < pcl::PointXYZ>);
	cloudPointer = cloud.makeShared();

	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud viewer"));
	viewer->setBackgroundColor(0, 0, 0);
	viewer->addPointCloud<pcl::PointXYZ>(cloudPointer, "sample cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 0.5, "sample cloud");
	viewer->addCoordinateSystem(1.0);
	viewer->initCameraParameters();
	while (!viewer->wasStopped()) {
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	system("pause");
	return 0;
}

需注意:

加了ptr的是指针类型,两者可以相互转换,在上边可视化的过程中需要先将pcl::PointCloud转换为pcl::PointCloud::Ptr,所以总结以下的转换代码
(1)pcl::PointCloud转换为pcl::PointCloud::Ptr

//将pcl::PointCloud转换为pcl::PointCloud::Ptr类型
	pcl::PointCloud<pcl::PointXYZ> cloud;
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud < pcl::PointXYZ>);
	cloudPointer = cloud.makeShared();

(2)pcl::PointCloud::Ptr转换为pcl::PointCloud

pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud<pcl::PointXYZ>);
cloud=*cloudPointer;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

点云TXT与PCD格式之间的转换 的相关文章

随机推荐

  • CSDN获取积分办法

    下载积分攻略 1 个人设置里进行手机绑定CSDN账户 奖励50分 右上角设置 账户安全 手机绑定 2 完成任务送若干分积分 CSDN有奖任务 3 上传有效资源获取积分 上传非法 广告资源用户 将被扣除一定积分 严重者封号 上传自己设分资源被
  • 华为云云耀云服务器L实例评测| ultralytics最先进模型YOLOv8深度学习AI训练

    目录 前言 登录服务器 安装pyhton 部署yolov8 安装Pytorch 下载权重文件 训练模型 模型使用 前言 前几期我们在云耀云服务器L实例上分别使用docker和直接在centos上部署了yolov5识别API 前端项目vue
  • 方法的定义和格式

    方法 什么是方法 方法是程序中最小的执行单元 定义 把一些代码打包在一起 该过程称为方法 实际开发过程中 什么时候用到方法 重复的代码 具有独立功能的代码可以抽取到方法中 实际开发中 方法的好处 提高代码的复用性 提高代码的可维护性 方法的
  • C++内存泄漏和内存碎片的产生及避免策略

    1 内存泄漏的定义 一般我们常说的内存泄漏是指堆内存的泄漏 堆内存是指程序从堆中分配的 大小任意的 内存块的大小可以在程序运行期决定 使用完后必须显示释放的内存 应用程序一般使用malloc realloc new等函数从堆中分配到一块内存
  • AirTest自动化测试

    目录 一 AirTest简介 二 AirTest与模拟器进行连接 三 图像库 touch 运行 报告 一 AirTest简介 AirTest是一个基于图像识别原理的跨平台UI自动化测试框架 适用于游戏和应用程序 1 特点 a 跨平台 Air
  • windows10(1903) VMware(虚拟机)不能正常安装操作系统

    win10虚拟机不能正常安装操作系统 前言 一 问题现象 二 解决方案 1 停止hv主机服务 2 重启计算机 3 开启虚拟机的全局虚拟打印功能 4 正常工作了 参考 前言 最近公司搬家 重新搭环境 事儿有点多哈 我们win10 操作系统被运
  • vue-router基本使用方法

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 动态路由匹配 我们可以在 vue router 的路由路径中使用 动态路径参数 d
  • EMC-MLCC电容反谐振点引起的RE辐射超标

    MLCC电容反谐振点引起的RE辐射超标 对待RE辐射问题 可以按照干扰源 干扰路径 被干扰源 入手较多的是干扰源和干扰路径 解决干扰源可以从展频 调频 屏蔽干扰源 增加RC snabber吸收干扰源等方向入手 解决干扰路径的 可以分为差模干
  • 网络互连基础的实验

    拓扑 需求 某网络整体结构如图所示 根据如图的IP规划 为设备配置IP地址 在各路由器上配置静态路由 要求实现全网互联 在DNS服务器上增加一条域名解析记录 域名可自定义 当通过PC端用域名访问Web服务器时 PC端浏览器能够返回web服务
  • Python使用免费天气API,获取全球任意地区的天气情况

    需求背景 公司是做外贸服装的 在亚马逊平台上有多个地区店铺运营 运营人员需要参考地区的天气情况 上新的服装 所以需要能够获取全球任意地区的天气情况 还需要预测未来10 15天的天气情况 选型API 天气API中有大把免费的api 如 国内的
  • 基于元学习的红外弱小点状目标跟踪算法

    基于元学习的红外弱小点状目标跟踪算法 人工智能技术与咨询 昨天 本文来自 激光技术 作者热孜亚 艾沙等 引言 红外点状目标的跟踪是红外搜索和跟踪 infrared search and track IRST 系统中的关键技术之一 1 在红外
  • vue手机端的调试神器eruda

    前言 分享一款神奇 可以在手机上实现 跟pc端f12打开调试一样的效果 官方地址 入口 实现效果 实现步骤 1 cdn使用 打开public index html加入 2 node使用 cnpm install eruda save
  • 配置Apache2.4.46

    解压后打开 Apache24 conf 的httpd conf 定位Define SRVROOT并将后面的 SRVROOT 改为自己解压后的Apache24文件夹路径 下一行ServerRoot后面的 SRVROOT 相同操作 在cmd输入
  • SpringBoot整合AMQP

    SpringBoot整合AMQP 文章目录 SpringBoot整合AMQP 前言 一 JMS AMQP概念以及区别 二 RabbitMQ简介 三 互联网大厂为什么选择RabbitMQ 四 RabbitMQ的一些核心概念 五 RabbitM
  • 推荐系统系列——推荐算法评价指标

    文章目录 同步读书之 菜根谭 9 静坐观心 真妄毕现 10 得意早回头 拂心莫停手 推荐算法评价指标 1 评分预测指标 1 1 符号定义 1 2 平均绝对误差 1 3 均方根误差 1 4 覆盖率 2 集合推荐指标 2 1 混淆矩阵 2 2
  • 微信小程序事件传参

    微信小程序事件传参 微信小程序怎么事件传参 dataset 对象 事件对象 目标对象 总结 两步骤 微信小程序怎么事件传参 dataset 对象 每个虚拟dom身上都拥有一个dataset对象 给虚拟 dom 绑定上 data 自定义键 值
  • Docker服务的重启服务命令(systemctl restart docker)

    重启Docker服务 重启docker服务 systemctl restart docker 非root用户使用 重启docker服务 sudo systemctl restart docker
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近2年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • nginx配置域名访问

    1 本地开发好的demo程序 target目录下 把META INF WEB INF index jsp 所有文件打成zip包 如下图 2 Linux服务器下 部署到Tomcat下 清空ROOT目录下所有文件 把1中nginx zip文件放
  • 点云TXT与PCD格式之间的转换

    开发环境为win10 vstudio2019 注 txt形式的点云文件没有header 存储的全是xyz数据 如下图 这个点云数据中不仅包含有x y z的位置信息 还包含其他的位置信息 因此我们只需要提取前三列的信息 并忽略前两行 提取后的