? ? ? ? 最近一直在搞點云相關的操作,有時候在處理點云數據時需要查看處理后的數據是否滿足需求,所以就想著寫一套展示點云的代碼。之前已經分享過如何可視化點云了,感興趣的可以自己去看下:【Lidar】基于Python的Open3D庫可視化點云數據。但是這個是3維展示,不滿足我的項目需求,我要看的是x,y平面上的效果,所以今天給大家分享一下如何使用Python將三維點云數據投影至二維平面,并進行點云圖的繪制。
1 代碼邏輯
? ? ? ? 網上有很多資源都是構建投影方程、計算距離、角度啥的進行投影,我個人覺得沒多大必要,我們只需要在讀取/處理時只選擇自己想要平面的點即可,至少我的項目可以滿足。
2 完整代碼
? ? ? ? 這里創建一個一行兩列的散點圖,用來顯示3D和2D的效果,點云保存的代碼我沒有加進去。看我之前的文章:【Lidar】基于Python的Open3D庫、Laspy庫保存點云文件/點云格式轉換
# -*- coding: utf-8 -*-
"""
@Time : 2023/12/7 9:33
@Auth : RS迷途小書童
@File :Projection of point cloud to 2D.py
@IDE :PyCharm
@Purpose:點云數據投影至平面并顯示
"""
import matplotlib # 導入 matplotlib 庫,主要用于繪圖
import numpy as np # 導入 numpy 庫,主要用于處理數組
import open3d as o3d # 導入 Open3D 庫,用于處理點云數據
import matplotlib.pyplot as plt # 導入 matplotlib.pyplot 庫,用于創建圖像和畫圖def point_show(path, save_path):# 定義一個函數 point_show,輸入參數是點云文件的路徑 path 和要保存圖像的路徑 save_pathmatplotlib.use('tkAgg')# 在這里指定GUI后端,這里選擇 tkAgg 作為圖形用戶界面后端pcd = o3d.io.read_point_cloud(path)# 使用 Open3D 讀取點云數據print(pcd) # 輸出點云的個數points = np.asarray(pcd.points)# 將點云數據轉化為 numpy 數組# print(points.shape) # 輸出數組的形狀(行列數)fig = plt.figure(figsize=(16, 10)) # 創建一個新的圖形窗口,設置其大小為8x4ax1 = fig.add_subplot(121, projection='3d') # 在圖形窗口中添加一個3D繪圖區域ax1.scatter(points[:, 0], points[:, 1], points[:, 2], c='g', s=0.01,alpha=0.5) # 在這個區域中繪制點云數據的散點圖,設置顏色為綠色,點的大小為0.01,透明度為0.5ax2 = fig.add_subplot(122) # 在圖形窗口中添加一個2D繪圖區域# 1行2列的圖形布局,其中該子圖是第2個子圖ax2.scatter(points[:, 1], points[:, 2], c='g', s=0.01, alpha=0.5) # 在這個區域中繪制點云數據的散點圖,設置顏色為綠色,點的大小為0.01,透明度為0.5ax1.set_title('3D')ax2.set_title('2D')plt.show() # 顯示圖形窗口中的所有內容plt.savefig(save_path)# 將圖形窗口中的內容保存到指定的路徑if __name__ == "__main__":# 如果這個文件被直接運行而不是被導入作為模塊,那么執行以下代碼point_path = "1 - Cloud.pcd"# 定義一個變量 point_path,值為字符串 "1 - Cloud.pcd"out_path = r"G:\彭俊喜/1.png"# 定義一個變量 out_path,值為一個Windows文件路徑point_show(point_path, out_path)# 調用 point_show 函數,輸入參數是 point_path 和 out_path
效果圖:
3 總結
? ? ? ? 代碼中的plt.savefig保存散點圖時,我的是一片空白不知道啥原因也懶得去改了。大家可以在繪制的散點圖上直接點保存即可。總的來說這種思路實現的三維轉二維完全夠用,至少我的需求這段代碼可以實現,具體為什么其他博主用方程解算啥的,就看你們的需求了。