python读取pcd点云/转numpy(python2+python3,非ROS环境)
0.引言
\qquadROS的PCL庫(kù)支持python讀取點(diǎn)云,ROS1關(guān)聯(lián)的是python2(2.7),ROS2關(guān)聯(lián)的是python3(>=3.5),但這對(duì)于windows的用戶和沒裝ROS的ubuntu用戶似乎不夠友好。下面就介紹兩種不需要ros的方法。
\qquad點(diǎn)云的fileds有好幾種,XYZ,XYZI,XYZRGB,XYZRGBA,本文以XYZI為例講解,如果是RGB類型的參考以下鏈接:
https://blog.csdn.net/qq_35565669/article/details/106687208
1.python2讀取點(diǎn)云
在python2的環(huán)境下:
pip2 install pypcd
注意,python3不能安裝這個(gè)包
參考代碼:
#!/usr/bin/python2 import pypcd import numpy as np import os from tqdm import tqdm pcd_dir = '/data3/data/SemiAuto_Calib/PC2_CV3/PC2_CV/pcd' out_pcd_dir = "data/pcd" pcd_files = [file for file in os.listdir(pcd_dir) if os.path.splitext(file)[1]=='.pcd'] pcd_files.sort() os.makedirs(out_pcd_dir) for file in tqdm(pcd_files,desc="pcd"):cloud = pypcd.PointCloud.from_path(os.path.join(pcd_dir,file))pcd_array = cloud.pc_data.view(np.float32).reshape(cloud.pc_data.shape+(-1,)) # numpy.ndarray (N,4)np.save(os.path.join(out_pcd_dir,os.path.splitext(file)[0]+".npy"),pcd_array) # 讀取時(shí)np.load(file)Windows用戶可刪除第一行注釋,并切換到python2環(huán)境運(yùn)行此腳本。
2.python3讀取點(diǎn)云
2.1. pclpy
需要python3.6的環(huán)境,安裝pclpy
pip3 install pclpy
python3.6環(huán)境用戶直接跳過(guò)以下內(nèi)容
原github網(wǎng)址:
https://github.com/davidcaron/pclpy
注:原github網(wǎng)址提示兼容的版本:
若不是python3.6則不能直接通過(guò)pip安裝(無(wú)pypi的二進(jìn)制文件),需要通過(guò)conda安裝:
conda install -c conda-forge -c davidcaron pclpy不建議使用,安裝了10分鐘仍然在等待,而且是強(qiáng)制安裝。
參考代碼:
import pclpy from pclpy import pcl import numpy as np obj = pclpy.pcl.PointCloud.PointXYZI() pcl.io.loadPCDFile('PC2_CV\pcd\PointXYZI_001.pcd',obj) np_xyz = obj.xyz insty = obj.intensity[:,None] print(np_xyz.shape,insty.shape)輸出:
(28800, 3) (28800, 1)一個(gè)是XYZ坐標(biāo),一個(gè)是intensity強(qiáng)度。
另外,這個(gè)庫(kù)還可以像pcl一樣展示點(diǎn)云
參考:https://www.codeleading.com/article/19791179164/
import pclpy from pclpy import pcl obj=pclpy.pcl.PointCloud.PointXYZI() pcl.io.loadPCDFile('PC2_CV\pcd\PointXYZI_001.pcd',obj) viewer=pcl.visualization.PCLVisualizer('pcd-viewer') viewer.addPointCloud(obj) while(not viewer.wasStopped()):viewer.spinOnce(100)不怎么好看,但是可以隨便旋轉(zhuǎn)。
2.2. open3d讀取
open3d庫(kù)相較于pclpy要大很多,但是對(duì)不同版本的python均兼容,也是直接通過(guò)pip安裝。
【pcl官網(wǎng)教程鏈接】
numpy轉(zhuǎn)open3d格式
import open3d as o3d import numpy as np xyz = numpy.random.rand(10,3) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(xyz) o3d.io.write_point_cloud("test.ply", pcd)open3d轉(zhuǎn)numpy格式
import open3d as o3d import numpy as np pcd_load = o3d.io.read_point_cloud("test.ply") xyz_load = np.asarray(pcd_load.points)本文教程展示的是ply格式的點(diǎn)云,實(shí)際上,pcd、ply、obj格式的諸多格式點(diǎn)云open3d均可以隨意讀寫,所以只需要學(xué)會(huì)將numpy轉(zhuǎn)為open3dd的pointcloud格式,即可保存為任何一種形式的點(diǎn)云。以下是一個(gè)官網(wǎng)教程的案例
# examples/Python/Basic/file_io.pyimport open3d as o3dif __name__ == "__main__":print("Testing IO for point cloud ...")pcd = o3d.io.read_point_cloud("../../TestData/fragment.pcd")print(pcd)o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)print("Testing IO for meshes ...")mesh = o3d.io.read_triangle_mesh("../../TestData/knot.ply")print(mesh)o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)print("Testing IO for textured meshes ...")textured_mesh = o3d.io.read_triangle_mesh("../../TestData/crate/crate.obj")print(textured_mesh)o3d.io.write_triangle_mesh("copy_of_crate.obj",textured_mesh,write_triangle_uvs=True)copy_textured_mesh = o3d.io.read_triangle_mesh('copy_of_crate.obj')print(copy_textured_mesh)print("Testing IO for images ...")img = o3d.io.read_image("../../TestData/lena_color.jpg")print(img)o3d.io.write_image("copy_of_lena_color.jpg", img)附:本人在安裝open3d時(shí)還遇到了一個(gè)奇怪的問(wèn)題
Cannot uninstall ‘terminado’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
若有遇到同樣問(wèn)題的伙伴,可以參考以下解決方案:
pip install terminado==0.9.1 --ignore-installed
總結(jié)
以上是生活随笔為你收集整理的python读取pcd点云/转numpy(python2+python3,非ROS环境)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 按钮button加超链接
- 下一篇: linq to entity常用操作