您现在的位置是:首页 > 技术教程 正文

【Lidar】基于Python的三维点云数据转二维平面+散点图绘制

admin 阅读: 2024-03-24
后台-插件-广告管理-内容页头部广告(手机)

        最近一直在搞点云相关的操作,有时候在处理点云数据时需要查看处理后的数据是否满足需求,所以就想着写一套展示点云的代码。之前已经分享过如何可视化点云了,感兴趣的可以自己去看下:【Lidar】基于Python的Open3D库可视化点云数据。但是这个是3维展示,不满足我的项目需求,我要看的是x,y平面上的效果,所以今天给大家分享一下如何使用Python将三维点云数据投影至二维平面,并进行点云图的绘制。

1 代码逻辑

        网上有很多资源都是构建投影方程、计算距离、角度啥的进行投影,我个人觉得没多大必要,我们只需要在读取/处理时只选择自己想要平面的点即可,至少我的项目可以满足。

2 完整代码

        这里创建一个一行两列的散点图,用来显示3D和2D的效果,点云保存的代码我没有加进去。看我之前的文章:【Lidar】基于Python的Open3D库、Laspy库保存点云文件/点云格式转换

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/12/7 9:33
  4. @Auth : RS迷途小书童
  5. @File :Projection of point cloud to 2D.py
  6. @IDE :PyCharm
  7. @Purpose:点云数据投影至平面并显示
  8. """
  9. import matplotlib # 导入 matplotlib 库,主要用于绘图
  10. import numpy as np # 导入 numpy 库,主要用于处理数组
  11. import open3d as o3d # 导入 Open3D 库,用于处理点云数据
  12. import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 库,用于创建图像和画图
  13. def point_show(path, save_path):
  14. # 定义一个函数 point_show,输入参数是点云文件的路径 path 和要保存图像的路径 save_path
  15. matplotlib.use('tkAgg')
  16. # 在这里指定GUI后端,这里选择 tkAgg 作为图形用户界面后端
  17. pcd = o3d.io.read_point_cloud(path)
  18. # 使用 Open3D 读取点云数据
  19. print(pcd) # 输出点云的个数
  20. points = np.asarray(pcd.points)
  21. # 将点云数据转化为 numpy 数组
  22. # print(points.shape) # 输出数组的形状(行列数)
  23. fig = plt.figure(figsize=(16, 10)) # 创建一个新的图形窗口,设置其大小为8x4
  24. ax1 = fig.add_subplot(121, projection='3d') # 在图形窗口中添加一个3D绘图区域
  25. ax1.scatter(points[:, 0], points[:, 1], points[:, 2], c='g', s=0.01,
  26. alpha=0.5) # 在这个区域中绘制点云数据的散点图,设置颜色为绿色,点的大小为0.01,透明度为0.5
  27. ax2 = fig.add_subplot(122) # 在图形窗口中添加一个2D绘图区域
  28. # 1行2列的图形布局,其中该子图是第2个子图
  29. ax2.scatter(points[:, 1], points[:, 2], c='g', s=0.01, alpha=0.5) # 在这个区域中绘制点云数据的散点图,设置颜色为绿色,点的大小为0.01,透明度为0.5
  30. ax1.set_title('3D')
  31. ax2.set_title('2D')
  32. plt.show() # 显示图形窗口中的所有内容
  33. plt.savefig(save_path)
  34. # 将图形窗口中的内容保存到指定的路径
  35. if __name__ == "__main__":
  36. # 如果这个文件被直接运行而不是被导入作为模块,那么执行以下代码
  37. point_path = "1 - Cloud.pcd"
  38. # 定义一个变量 point_path,值为字符串 "1 - Cloud.pcd"
  39. out_path = r"G:\彭俊喜/1.png"
  40. # 定义一个变量 out_path,值为一个Windows文件路径
  41. point_show(point_path, out_path)
  42. # 调用 point_show 函数,输入参数是 point_path 和 out_path

效果图:

3 总结

        代码中的plt.savefig保存散点图时,我的是一片空白不知道啥原因也懒得去改了。大家可以在绘制的散点图上直接点保存即可。总的来说这种思路实现的三维转二维完全够用,至少我的需求这段代码可以实现,具体为什么其他博主用方程解算啥的,就看你们的需求了。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜