IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> PCL可视化八叉树格网 -> 正文阅读

[C++知识库]PCL可视化八叉树格网

1 原理

八叉树其实是一种特殊的由上至下的体素,其构造原理在这里不再进行赘述,详细的构造方式可参考博客:https://blog.csdn.net/qq_32867925/article/details/109094719

有时候为了将点云、构造的层次八叉树需要进行可视化,便于人理解以及检查构造八叉树是否合理。如下图示,可以看见其构建了2次八叉树,即蓝色框和黄色框所示,每一个体素内包含的点各不相同。更多层次的八叉树,如3层、4层等都是类似的。

2 可视化

PCL支持将上述可视化结果进行显示,下面代码示例了其可视化过程,也包括了八叉树的构建,但侧重于如何将八叉树进行可视化。

//可视化体素
void main()
{
	IO IOject;
	char *inputpath = "test.txt";
	//char *inputpath = "D:\\LL\\individual_build.txt";
	vector<pcl::PointXYZ> cloud = IOject.ReadPointXYZIntoVector(inputpath);

	vector<grid> gridcluster;
	double gridsize = 2.5;

	gridpoint(cloud, gridcluster, gridsize);
	//gridcluster 为格网化后的点集
	vector<Cubic>allcubic;
	vector<vector<pcl::PointXYZ>> multisegs;

	for (int i = 0; i < gridcluster.size(); i++)
	{
		if (gridcluster[i].points.size()>0)
		{
			pcl::PointXYZ leftbottom, rightup;
			GetMinBoundingCubic(gridcluster[i].points, leftbottom, rightup);

			OctreeNode *root = new OctreeNode();
			BuildOctree(root, leftbottom, rightup, gridcluster[i].points, 0.05);
			vector<Cubic> cubics;
			GetleafCubic(root, cubics);
			for (int k = 0; k < cubics.size(); k++)
			{
				allcubic.push_back(cubics[k]);
			}

			//再添加点云数据
			vector<vector<pcl::PointXYZ>> planecluster, nonplanecluster;
			FalseCluster(root, planecluster, nonplanecluster);
			for (int j = 0; j < planecluster.size(); j++)
			{
				multisegs.push_back(planecluster[j]);
			}

		}
	}

	pcl::visualization::PCLVisualizer viewer("voxel viewer");
	viewer.setBackgroundColor(0, 0, 0);

	struct myRGB
	{
		myRGB(double a, double b, double c)
		{
			this->R = a;
			this->G = b;
			this->B = c;
		}
		double R;
		double G;
		double B;
	};


	vector<myRGB> colors;
	myRGB c1(255, 0, 0), c2(0, 255, 0), c3(0, 0, 255), c4(255, 255, 0), c5(0, 255, 255);

	for (int i = 0; i < allcubic.size(); i++)
	{
		stringstream ss;
		ss << i + 1;
		string str;
		ss >> str;
		double length = allcubic[i].Upright.x - allcubic[i].Buttomleft.x;
		if (length < gridsize/16)
		{
			viewer.addCube(allcubic[i].Buttomleft.x, allcubic[i].Upright.x, allcubic[i].Buttomleft.y, allcubic[i].Upright.y, allcubic[i].Buttomleft.z, allcubic[i].Upright.z, c1.R, c1.G, c1.B, str, 0);
		}
		else if (length >= gridsize / 16 && length < gridsize/8)
		{
			viewer.addCube(allcubic[i].Buttomleft.x, allcubic[i].Upright.x, allcubic[i].Buttomleft.y, allcubic[i].Upright.y, allcubic[i].Buttomleft.z, allcubic[i].Upright.z, c2.R, c2.G, c2.B, str, 0);
		}
		else if (length >= gridsize / 8 && length <gridsize/4)
		{
			viewer.addCube(allcubic[i].Buttomleft.x, allcubic[i].Upright.x, allcubic[i].Buttomleft.y, allcubic[i].Upright.y, allcubic[i].Buttomleft.z, allcubic[i].Upright.z, c3.R, c3.G, c3.B, str, 0);
		}
		else if (length >= gridsize / 4 && length < gridsize/2)
		{
			viewer.addCube(allcubic[i].Buttomleft.x, allcubic[i].Upright.x, allcubic[i].Buttomleft.y, allcubic[i].Upright.y, allcubic[i].Buttomleft.z, allcubic[i].Upright.z, c4.R, c4.G, c4.B, str, 0);
		}
		else
		{
			viewer.addCube(allcubic[i].Buttomleft.x, allcubic[i].Upright.x, allcubic[i].Buttomleft.y, allcubic[i].Upright.y, allcubic[i].Buttomleft.z, allcubic[i].Upright.z, c5.R, c5.G, c5.B, str, 0);
		}
		
		viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, str);
		//viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LUT_HSV, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, str);
	}
	//  addCube (float x_min, float x_max, float y_min, float y_max, float z_min, float z_max,
	//double r = 1.0, double g = 1.0, double b = 1.0, const std::string &id = "cube", int viewport = 0);
	srand((int)time(0));
	for (int i = 0; i < multisegs.size(); i++)
	{
		pcl::PointCloud<pcl::PointXYZ>::Ptr cloudptr(new pcl::PointCloud<pcl::PointXYZ>);
		cloudptr = IOject.PointXYZ2Ptr(multisegs[i]);
		stringstream ss;
		ss << i + 1000;
		string str;
		ss >> str;
		int R = rand() % 255;
		int G = rand() % 255;
		int B = rand() % 255;
		pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloudptr, R, G, B);//第二个平面颜色设置成蓝色 single_color_02
		viewer.addPointCloud<pcl::PointXYZ>(cloudptr, single_color, str);//将single_color在viewer中进行显示
		viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, str);
	}

	

	while (!viewer.wasStopped())
	{
		viewer.spinOnce(1);
	}
	
}

QQ录屏20220302110015

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:50:34  更:2022-03-03 15:51:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:32:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码