一、算法原理
我们将学习如何将点投影到参数模型(例如平面、球体等)上。参数模型通过一组系数给出——在平面的情况下,通过其方程:ax + by + cz + d = 0
。
二、代码
from pclpy import pcl
import numpy as np
def CloudShow(cloud1, cloud2):
"""
Args:在一个窗口可视化多个点云
cloud1: 点云数据1
cloud2: 点云数据2
"""
viewer = pcl.visualization.PCLVisualizer("viewer") # 建立可刷窗口对象 窗口名 viewer
v0 = 1 # 设置标签名(0, 1标记第一个窗口)
viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v0) # 创建一个可视化的窗口
viewer.setBackgroundColor(0.0, 0.0, 0.0, v0) # 设置窗口背景为黑色
single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud1, 255.0, 0, 0.0) # 将点云设置为红色
viewer.addPointCloud(cloud1, # 要添加到窗口的点云数据。
single_color, # 指定点云的颜色
"sample cloud1", # 添加的点云命名
v0) # 点云添加到的视图
v1 = 2 # 设置标签名(2代表第二个窗口)
viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v1) # 创建一个可视化的窗口
viewer.setBackgroundColor(255.0, 255.0, 255.0, v1) # 设置窗口背景为白色
single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud2, 0.0, 255.0, 0.0) # 将点云设置为绿色
viewer.addPointCloud(cloud2, # 要添加到窗口的点云数据。
single_color, # 指定点云的颜色
"sample cloud2", # 添加的点云命名
v1) # 点云添加到的视图
# 设置点云窗口(可移除对点云可视化没有影响)
viewer.setPointCloudRenderingProperties(0, # 设置点云点的大小
1, # 点云像素
"sample cloud1", # 识别特定点云
v0) # 在那个窗口可视化
viewer.setPointCloudRenderingProperties(0, # 设置点云点的大小
1, # 点云像素
"sample cloud2", # 识别特定点云
v1) # 在那个窗口可视化
viewer.addCoordinateSystem(1.0) # 设置坐标轴 坐标轴的长度为1.0
# 窗口建立
while not viewer.wasStopped():
viewer.spinOnce(10)
if __name__ == '__main__':
# 生成点云数据
cloud_size = 1000
a = np.random.ranf(cloud_size * 3).reshape(-1, 3) * 1024
cloud = pcl.PointCloud.PointXYZ.from_array(a)
print('打印之前点云数据:')
for point in cloud.points:
print(point.x, ' ',
point.y, ' ',
point.z, ' ')
# 创建了一个垂直于 Z 轴的平面,且经过原点,系数为:ax+by+cz+d=0
coeffs = pcl.ModelCoefficients() # 创建了一个模型系数对象
coeffs.values.append(0.0) # a = 0.0
coeffs.values.append(0.0) # b = 0.0
coeffs.values.append(1.0) # c = 1.0
coeffs.values.append(0.0) # d = 0.0
# 创建滤波器
proj = pcl.filters.ProjectInliers.PointXYZ() # 过滤器对象 proj,用于将点云投影到一个模型上。
proj.setModelType(0) # 模型类型被设为 0,代表使用平面模型。
proj.setInputCloud(cloud) # 将cloud点云数据进行处理
proj.setModelCoefficients(coeffs) # 处理参数coeffs
cloud_projected = pcl.PointCloud.PointXYZ() # 建立保存点云
proj.filter(cloud_projected) # 将投影结果保存
print('打印投影后点云数据:')
for point in cloud_projected.points:
print(point.x, ' ',
point.y, ' ',
point.z, ' ')
# 主循环
CloudShow(cloud, cloud_projected) # 可视化点云
三、结果
左边窗口是原点云,右边是投影后的点云
四、相关数据
pclpy
设置多个窗口可视化点云:pclpy 设置多个窗口可视化点云-CSDN博客
官方投影模型学习: SacModel
proj.setModelType(0)
参数可选如下: