栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python读取pcd点云/转numpy(python2+python3,非ROS环境)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python读取pcd点云/转numpy(python2+python3,非ROS环境)

0.引言

qquad ROS的PCL库支持python读取点云,ROS1关联的是python2(2.7),ROS2关联的是python3(>=3.5),但这对于windows的用户和没装ROS的ubuntu用户似乎不够友好。下面就介绍两种不需要ros的方法。
qquad 点云的fileds有好几种,XYZ,XYZI,XYZRGB,XYZRGBA,本文以XYZI为例讲解,如果是RGB类型的参考以下链接:

https://blog.csdn.net/qq_35565669/article/details/106687208

1.python2读取点云

在python2的环境下:

pip2 install pypcd

注意,python3不能安装这个包

参考代码:

#!/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)  # 读取时np.load(file)

Windows用户可删除第一行注释,并切换到python2环境运行此脚本。

2.python3读取点云

需要python3.6的环境,安装pclpy

pip3 install pclpy

python3.6环境用户直接跳过以下内容


原github网址:

https://github.com/davidcaron/pclpy

注:原github网址提示兼容的版本:

若不是python3.6则不能直接通过pip安装(无pypi的二进制文件),需要通过conda安装:
conda install -c conda-forge -c davidcaron pclpy不建议使用,安装了10分钟仍然在等待,而且是强制安装。


参考代码:

import pclpy
from pclpy import pcl
import numpy as np
obj = pclpy.pcl.PointCloud.PointXYZI()
pcl.io.loadPCDFile('PC2_CVpcdPointXYZI_001.pcd',obj)
np_xyz = obj.xyz
insty = obj.intensity[:,None]
print(np_xyz.shape,insty.shape)

输出:

(28800, 3) (28800, 1)

一个是XYZ坐标,一个是intensity强度。
另外,这个库还可以像pcl一样展示点云

参考:https://www.codeleading.com/article/19791179164/

import pclpy
from pclpy import pcl
obj=pclpy.pcl.PointCloud.PointXYZI()
pcl.io.loadPCDFile('PC2_CVpcdPointXYZI_001.pcd',obj)
viewer=pcl.visualization.PCLVisualizer('pcd-viewer')
viewer.addPointCloud(obj)
while(not viewer.wasStopped()):
    viewer.spinOnce(100)

不怎么好看,但是可以随便旋转。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号