使用PCLPY进行点云图像融合

使用PCLPY进行点云图像融合

pclpy简介

pclpy是点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。
这个库正在积极开发中,api可能会发生变化。所包含的模块确实可以工作,但测试还不完整。目前只支持Windows和python 3.6 x64。

许多其他python库尝试绑定PCL。最流行的是python-pcl,它使用Cython。虽然Cython非常强大,但绑定c++模板并不是它的强项(PCL大量使用模板)。python-pcl有大量的代码重复,维护和添加特性都非常难,而且对PCL的类和点类型绑定不完整。使用pybind11绑定,我们可以直接使用c++,模板、boost::smart_ptr和缓冲区协议都比较容易实现。

GitHub:https://github.com/davidcaron/pclpy

pypi: https://pypi.org/project/pclpy/

pybind11:https://pybind11.readthedocs.io/en/stable/

下载:

Release下载:https://github.com/davidcaron/pclpy/releases

安装

建议使用Anconda创建多个虚拟环境进行测试

conda create -n pclpy11 python=3.6 # 创建新的虚拟环境
conda activate pclpy11	# 激活环境

0.12.0版下载安装:

conda install -c conda-forge -c davidcaron pclpy`

注意:最新版的0.12.0里面移除了可视化模块,所以想要可视化看点云效果的,可以下载0.12.0之前的版本:

比如下载安装0.11.0版本,注意使用pip下载,使用国内镜像下载更快:

pip install pclpy==0.11.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

测试

from pclpy import pcl

# 读取pcd格式点云数据
pc = pcl.PointCloud.PointXYZ()
reader = pcl.io.PCDReader()
reader.read("bunny.pcd", pc)
# 可视化点云
viewer = pcl.visualization.CloudViewer("viewer")
viewer.showCloud(pc, "hi")
while not viewer.wasStopped(10):
    pass

点云与图像融合

点云、图像之间的坐标变换相关基础知识参考链接:一文看懂自动驾驶中的坐标变换

使用文件

本文的点云和图像的融合用到了相机内外参、激光雷达外参的yaml文件,相机采集的图像以及对应的激光雷达采集的点云数据.pcd文件。

image-20221005163926509

image-20221005164118275

内外参yaml文件内容

外参文件内容如下所示,包含了旋转矩阵的四元数rotation以及偏置translation。

# From front camera to vechicle coordinate
header:
  frame_id: vechicle
child_frame_id: front
transform:
  rotation:
    x: -0.716810
    y: 0.000349
    z: -0.005084
    w: 0.697250
  translation:
    x: 0.046892
    y: 1.845396
    z: 1.189992

内参文件内容如下所示,包含相机所采集图像的宽、高,以及矩阵的失真系数D和相机内参矩阵K。

height: 1080
width: 1920
distortion_model: plumb_bob
D: [-0.3713391106016114, 0.1439459925562498, -9.793218981776926e-05, 0.0014091097954690595, 0.0]
K: [2029.1089355290503, 0.0, 961.105118299655, 0.0, 2029.404084256603, 585.5222597066615, 0.0, 0.0, 1.0]

坐标变换程序

参数加载以及利用激光雷达外参将点云映射到车身坐标系。

# 加载外参文件
config = YamlReader(lidar_extrinsic_config_file)

# 读取rotation矩阵
rotation = config.read(["transform", "rotation"])
quat = [rotation['x'], rotation['y'], rotation['z'], rotation['w']]
R_matrix = R.from_quat(quat).as_matrix()
E_lidar = R.from_quat(quat).as_euler('ZYX', degrees='True') # 计算欧拉角
translation = config.read(["transform", "translation"])  # 读取translation矩阵
T_matrix = [translation["x"], translation["y"], translation["z"]]
# 点云坐标从lidar坐标系变换到Vehicle坐标系
points = origin_cloud.to_list()
new_points = []
for point in points:
new_points.append(np.dot(R_matrix, point) + T_matrix)
vehicle_cloud = pcl.PointCloud()
vehicle_cloud.from_list(new_points)
# 彩色点云可视化
vs = pcl.pcl_visualization.PCLVisualizering
viewer = pcl.pcl_visualization.PCLVisualizering()
visualcolor1 = pcl.pcl_visualization.PointCloudColorHandleringCustom(origin_cloud, 0, 250, 0)  # 设置颜色
pcl.pcl_visualization.PCLVisualizering.AddPointCloud_ColorHandler(viewer, origin_cloud, visualcolor1, id=b'cloud1', viewport=0)  # 添加点云及标签
visualcolor2 = pcl.pcl_visualization.PointCloudColorHandleringCustom(vehicle_cloud, 0, 0, 250)  # 设置颜色
pcl.pcl_visualization.PCLVisualizering.AddPointCloud_ColorHandler(viewer, vehicle_cloud, visualcolor2, id=b'cloud2', viewport=0)  # 添加点云及标签
viewer.Spin()

可视化结果如图所示:

绿色的是原始点云的可视化结果,蓝色的是使用激光雷达外参将点云坐标转换到车身坐标系后的点云数据可视化结果。

image-20221005165043239

同理,使用相机外参对点云进行逆映射到相机坐标系,可视化结果如下:

红色的为映射到相机坐标系下的点云可视化结果。

image-20221005165246506

image-20221005165424621

利用相机内参筛选出可以映射到图像上的点云,程序如下,可视化结果如下图。

# 图像进行畸变矫正
undistort_image = copy.deepcopy(origin_image)
undistort_image = cv2.undistort(origin_image, K_arr, D_arr, None)

# 点云映射到图像
points = img_cloud.to_list()
pixel_points = []  # 筛选出可以映射到图像上的点云
uvz_list = []
for point in points:
p_result = np.dot(K_arr, point)
z = point[2]
u = int(p_result[0] / z)
v = int(p_result[1] / z)
if 0 <= u < width and 0 <= v < height and z >= 0:
pixel_points.append(point)
uvz_list.append((u, v, z))
pixel_cloud = pcl.PointCloud()
pixel_cloud.from_list(pixel_points)

image-20221005165651739

image-20221005165701109

将可以映射到图像上的点云的深度信息给到图像,并进行可视化

    final_image = cloud_2_image(undistort_image, pixel_cloud, uvz_list)
    cv2.imshow("Image window3", final_image)
    cv2.waitKey(0)

在这里插入图片描述

利用图像的色彩信息对点云进行着色:

image-20221005170039089

image-20221005170047979

程序及所用文件下载链接:使用PCLPY进行点云图像融合代码及所用文件

参考链接

点云处理工具——pclpy安装

一文看懂自动驾驶中的坐标变换

相机参数DKRP的解释

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
pclpy是一个基于Python的Point Cloud Library(点云库)接口,它提供了许多用于处理点云数据的功能。在pclpy中,要提取点云的边缘,可以使用边缘提取算法。 边缘提取是点云处理中的一个重要任务,它用于识别点云中物体的边界或边缘。通过提取边缘,可以帮助我们更好地理解点云的形状和结构。 在pclpy中,提取点云边缘的一种常用方法是使用法线估计和边缘提取算法结合。首先,我们需要估计点云中每个点的法线向量。通过计算每个点周围的邻居点,可以估计出点的法线向量。这可以使用pclpy中的NormalEstimation类来实现。 一旦我们获得了点云中每个点的法线向量,我们就可以使用边缘提取算法来提取点云中的边缘。在pclpy中,常用的边缘提取算法是使用深度边缘估计(DepthEdgeEstimation)类。该算法会根据点云的深度信息和法线向量,确定哪些点属于边缘。 使用pclpy进行点云边缘提取的基本步骤如下: 1. 从点云数据中估计法线向量,使用NormalEstimation类。 2. 使用深度边缘估计算法,根据深度和法线向量提取边缘,使用DepthEdgeEstimation类。 3. 指定边缘提取算法的参数,例如阈值等。 4. 执行边缘提取算法,获取点云中的边缘点。 通过上述步骤,我们可以使用pclpy提取点云数据的边缘。边缘提取有助于我们理解点云中的物体形状和结构,对于许多点云应用非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值