C++利用PCL点云库操作txt文件详解

 更新时间:2024年01月23日 10:39:13   作者:玖玉ww  
这篇文章主要为大家详细介绍了C++如何利用PCL点云库操作txt文件,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下

读取txt点云文件

#include <fstream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

// 从txt文件中读取三维坐标
void create_cloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	std::ifstream file(file_path.c_str());
	std::string line;
	pcl::PointXYZ point;
	while (getline(file, line)) {
		std::stringstream ss(line);
		ss >> point.x;
		ss >> point.y;
		ss >> point.z;
		cloud->push_back(point);
	}
	file.close();
}

int main() {
	/******* 加载点云 ********/
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	create_cloud_from_txt("拉伸.txt", cloud);
	return 0;
}

读取txt点云文件&点云可视化

CloudViewer和PCLVisualizer 是 PCL 中两个不同的类,都用于创建和管理点云数据的可视化窗口。

CloudViewer头文件:<pcl/visualization/cloud_viewer.h>

PCLVisualizer头文件:<pcl/visualization/pcl_visualizer.h>

pcl::visualization::PCL_VISUALIZER_POINT_SIZE是点云属性之点的大小。

#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>

void create_cloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	std::ifstream file(file_path.c_str());
	std::string line;
	pcl::PointXYZ point;
	while (getline(file, line)) {
		std::stringstream ss(line);
		ss >> point.x;
		ss >> point.y;
		ss >> point.z;
		cloud->push_back(point);
	}
	file.close();
}


// 可视化,使用PCLVisualizer类
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("viewer"));
	// 添加需要显示的点云数据
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 50, 127, 220);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "example");
	// 设置显示点云时,点的大小为2(以大小为2的点显示点云)
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "example");

	while (!viewer->wasStopped()) { // 直到窗口关闭才结束循环
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}
void visualization2(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("viewer"));
	// 添加需要显示的点云数据
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 50, 127, 220);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "example");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "example");

	while (!viewer->wasStopped()) {
		viewer->spinOnce(); // 调用内部的重绘函数
	}
}
void visualization3(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	// pcl::visualization::PCLVisualizer viewer;  // 不设置窗口的名字
	// pcl::visualization::PCLVisualizer viewer("viewer3");
	pcl::visualization::PCLVisualizer viewer;
	viewer.setWindowName("viewer3");
	// 添加需要显示的点云数据
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 50, 127, 220);
	viewer.addPointCloud<pcl::PointXYZ>(cloud, single_color, "example");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "example");

	while (!viewer.wasStopped()) {
		//viewer.spinOnce(); // 重绘函数
		viewer.spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}
// 可视化,使用CloudViewer类
void  visualization_cv(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	pcl::visualization::CloudViewer viewer("simple cloud viewer");
	viewer.showCloud(cloud);
	while (!viewer.wasStopped())
	{
		// todo::
	}
}

int main() {
	// 加载点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
	create_cloud_from_txt("拉伸.txt", cloud1);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
	create_cloud_from_txt("拉伸2.txt", cloud2);

	// 可视化点云
	visualization(cloud1);
	visualization_cv(cloud2);

	return 0;
}

读取彩色txt点云&可视化

使用PCLVisualizer 类进行可视化。

#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>


/*
* 从txt文件中读取三维坐标、rgb颜色
* 要注意txt文件中坐标数据 和 颜色数据 的位置,以不同方式保存的txt文件其数据顺序可能不同
* 以坐标在前,坐标(x,y,z)、颜色在后,颜色(r,g,b)为例
*/
void create_cloud_from_txt_rgb(const std::string& file_path, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud)
{
	std::ifstream file(file_path.c_str());
	std::string line;
	pcl::PointXYZRGB point;
	while (getline(file, line)) {
		std::stringstream ss(line);
		ss >> point.x;
		ss >> point.y;
		ss >> point.z;
		float f;
		std::uint8_t r = 0, g = 0, b = 0;    // Example: Red color
		ss >> f; r = f;
		ss >> f; g = f;
		ss >> f; b = f;
		std::uint32_t rgb = ((std::uint32_t)r << 16 | (std::uint32_t)g << 8 | (std::uint32_t)b);
		point.rgb = *reinterpret_cast<float*>(&rgb);
		// 可以使用下面注释的三行,替换上面两行
		/*point.r = r;
		point.g = g;
		point.b = b;*/
		cloud->push_back(point);
	}
	file.close();
}


// 可视化
void visualization_rgb(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud)
{
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("viewer"));
	/** 添加需要显示的点云数据 **/
	//pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 50, 100, 255);
	//viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "example");
	// 下面一行以点云本身的颜色进行显示,上面两行修改点云颜色进行显示
	viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "example");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "example");

	while (!viewer->wasStopped()) {
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}


int main(int argc, char** argv) {
	// 加载点云
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	create_cloud_from_txt_rgb("拉伸2 - Cloud - red.txt", cloud);
	// 可视化点云
	visualization_rgb(cloud);

	return 0;
}

截面 - Cloud - red.txt是从一个点云截取的一部分,以红色(255, 0, 0)保存到txt文件。

显示结果:

到此这篇关于C++利用PCL点云库操作txt文件详解的文章就介绍到这了,更多相关C++ PCL操作txt内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++解决回调地狱问题的方法小结

    C++解决回调地狱问题的方法小结

    “地狱回调”(Callback Hell)是指在编程中使用过多嵌套回调函数,导致代码难以阅读和维护,本文给大家介绍了C++解决回调地狱问题的方法小结,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-07-07
  • 详解C++中future和promise的使用

    详解C++中future和promise的使用

    future和promise的作用是在不同线程之间传递数据,这篇文章主要为大家详细介绍了C++中future和promise的具体使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • C++如何实现简易扫雷游戏

    C++如何实现简易扫雷游戏

    这篇文章主要为大家详细介绍了C++如何实现简易扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 了解C++编程中指定的异常和未经处理的异常

    了解C++编程中指定的异常和未经处理的异常

    这篇文章主要介绍了C++中指定的异常和未经处理的异常,介绍了有关noexcept和terminate的作用,并结合了C++11标准的新特性,需要的朋友可以参考下
    2016-01-01
  • c++中string类型和int类型相互转换的几种常用方法

    c++中string类型和int类型相互转换的几种常用方法

    我们在编写程序时,经常涉及到int与string之间的类型转换,本文主要介绍了c++中string类型和int类型相互转换的几种常用方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • C++ 如何实现顺序栈(使用模板类)

    C++ 如何实现顺序栈(使用模板类)

    这篇文章主要介绍了C++ 如何实现顺序栈(使用模板类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++结构体中变长数组的使用问题分解刨析

    C++结构体中变长数组的使用问题分解刨析

    变长数组在C++中指的是集合(也叫容器)如vector就是C语言中,所有的数组都不定长,没有下标越界的概念,数组实质就是一个指针(由数组名充当)因此C语言中数组的长度没有任何意义平常在C语言中讲的不定长数组,其实就是指针
    2022-08-08
  • 用C语言判断字符是否为空白字符或特殊字符的方法

    用C语言判断字符是否为空白字符或特殊字符的方法

    这篇文章主要介绍了用C语言判断字符是否为空白字符或特殊字符的方法,分别为isspace()函数的使用和ispunct()函数的使用,需要的朋友可以参考下
    2015-08-08
  • C语言实现散列表(哈希Hash表)实例详解

    C语言实现散列表(哈希Hash表)实例详解

    这篇文章主要介绍了C语言实现散列表(哈希Hash表)实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言实现多项式的相加

    C语言实现多项式的相加

    这篇文章主要为大家介绍了C语言实现多项式的相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论