处理点云数据 点云与生成前视图

2023-11-11

创建点云数据中的前视图
前视图投影
为了将激光雷达传感器的前视图平面化为二维图像,必须将三维空间中的点投影到可以展开的圆柱形表面上,以将其平面化。下面公式见论文Vehicle Detection from 3D Lidar Using Fully Convolutional Network

# h_res = 激光雷达的水平分辨率
# v_res = 激光雷达的垂直分辨率
x_img = arctan2(y_lidar, x_lidar)/ h_res 
y_img = np.arctan2(z_lidar, np.sqrt(x_lidar**2 + y_lidar**2))/ v_res



问题是这样做的方式将图像的方向直接放在汽车的右侧。 将方向定位在汽车的后部是更有意义的,因此前面和侧面的更重要的区域是不中断的。 使这些重要区域不间断将使卷积神经网络更容易识别这些重要区域中的整个对象。 以下代码修复了这个问题。

x_img = np.arctan2(-y_lidar, x_lidar)/ h_res # seam in the back
y_img = np.arctan2(z_lidar, np.sqrt(x_lidar**2 + y_lidar**2))/ v_res
1
2
沿着每个轴配置刻度
h_res 和 v_res 非常依赖于所使用的雷达传感器。在KITTI数据集中,使用的传感器是Velodyne HDL 64E。它具有以下重要特性:
1、垂直视角为26.9度,分辨率为0.4度。垂直视野被分成传感器上方+2度和传感器下方-24.9度。
2、360度的水平视野,分辨率为0.08-0.35(取决于旋转速度)
3、旋转速度可以选择在5-20Hz之间。

# 激光雷达传感器的分辨率和视场
h_res = 0.35         # 水平分辨率,假设使用20HZ的旋转速率
v_res = 0.4          # 垂直分辨率
v_fov = (-24.9, 2.0) # 沿着垂直轴的视野范围(-ve, +ve)
v_fov_total = -v_fov[0] + v_fov[1] 

# 转换为弧度
v_res_rad = v_res * (np.pi/180)
h_res_rad = h_res * (np.pi/180)

# 投影到图像坐标
x_img = np.arctan2(-y_lidar, x_lidar)/ h_res_rad
y_img = np.arctan2(z_lidar, d_lidar)/ v_res_rad



然而,这导致大约一半的点位于负x坐标上,而大多数位于负y坐标上。为了投影到2D图像,我们需要将最小值设为(0, 0)。所以我们需要转换:

# 转换坐标使得(0,0)是最小的
x_min = -360.0/h_res/2    # 基于传感器规格的最小x值
x_img = x_img - x_min     # 转换
x_max = 360.0/h_res       # 转换后最大x值

y_min = v_fov[0]/v_res    # 基于传感器规格的最小y值
y_img = y_img - y_min     # 转换
y_max = v_fov_total/v_res # 转换后最大x值
y_max = y_max + 5         # UGLY:Fudge因素,因为基于规格表的计算似乎与
                          # 传感器在数据中收集的角度范围不匹配。



绘制二维图像

pixel_values = -d_lidar # 使用深度数据编码每个像素的值 
cmap = "jet"            # 使用彩色图
dpi = 100               # 图像分辨率
fig, ax = plt.subplots(figsize=(x_max/dpi, y_max/dpi), dpi=dpi)
ax.scatter(x_img,y_img, s=1, c=pixel_values, linewidths=0, alpha=1, cmap=cmap)
ax.set_axis_bgcolor((0, 0, 0)) # 将没有点的区域设置成黑色
ax.axis('scaled')              # {equal, scaled}
ax.xaxis.set_visible(False)    # 不画轴刻度线
ax.yaxis.set_visible(False)    # Do not draw axis tick marks
plt.xlim([0, x_max])   # 防止在水平FOV之外绘制空白空间
plt.ylim([0, y_max])   # prevent drawing empty space outside of vertical FOV
fig.savefig("/tmp/depth.png", dpi=dpi, bbox_inches='tight', pad_inches=0.0)



完整代码

def lidar_to_2d_front_view(points,
                           v_res,
                           h_res,
                           v_fov,
                           val="depth",
                           cmap="jet",
                           saveto=None,
                           y_fudge=0.0
                           ):
    """ Takes points in 3D space from LIDAR data and projects them to a 2D
        "front view" image, and saves that image.

    Args:
        points: (np array)
            The numpy array containing the lidar points.
            The shape should be Nx4
            - Where N is the number of points, and
            - each point is specified by 4 values (x, y, z, reflectance)
        v_res: (float)
            vertical resolution of the lidar sensor used.
        h_res: (float)
            horizontal resolution of the lidar sensor used.
        v_fov: (tuple of two floats)
            (minimum_negative_angle, max_positive_angle)
        val: (str)
            What value to use to encode the points that get plotted.
            One of {"depth", "height", "reflectance"}
        cmap: (str)
            Color map to use to color code the `val` values.
            NOTE: Must be a value accepted by matplotlib's scatter function
            Examples: "jet", "gray"
        saveto: (str or None)
            If a string is provided, it saves the image as this filename.
            If None, then it just shows the image.
        y_fudge: (float)
            A hacky fudge factor to use if the theoretical calculations of
            vertical range do not match the actual data.

            For a Velodyne HDL 64E, set this value to 5.
    """

    # DUMMY PROOFING
    assert len(v_fov) ==2, "v_fov must be list/tuple of length 2"
    assert v_fov[0] <= 0, "first element in v_fov must be 0 or negative"
    assert val in {"depth", "height", "reflectance"}, \
        'val must be one of {"depth", "height", "reflectance"}'


    x_lidar = points[:, 0]
    y_lidar = points[:, 1]
    z_lidar = points[:, 2]
    r_lidar = points[:, 3] # Reflectance
    # Distance relative to origin when looked from top
    d_lidar = np.sqrt(x_lidar ** 2 + y_lidar ** 2)
    # Absolute distance relative to origin
    # d_lidar = np.sqrt(x_lidar ** 2 + y_lidar ** 2, z_lidar ** 2)

    v_fov_total = -v_fov[0] + v_fov[1]

    # Convert to Radians
    v_res_rad = v_res * (np.pi/180)
    h_res_rad = h_res * (np.pi/180)

    # PROJECT INTO IMAGE COORDINATES
    x_img = np.arctan2(-y_lidar, x_lidar)/ h_res_rad
    y_img = np.arctan2(z_lidar, d_lidar)/ v_res_rad

    # SHIFT COORDINATES TO MAKE 0,0 THE MINIMUM
    x_min = -360.0 / h_res / 2  # Theoretical min x value based on sensor specs
    x_img -= x_min              # Shift
    x_max = 360.0 / h_res       # Theoretical max x value after shifting

    y_min = v_fov[0] / v_res    # theoretical min y value based on sensor specs
    y_img -= y_min              # Shift
    y_max = v_fov_total / v_res # Theoretical max x value after shifting

    y_max += y_fudge            # Fudge factor if the calculations based on
                                # spec sheet do not match the range of
                                # angles collected by in the data.

    # WHAT DATA TO USE TO ENCODE THE VALUE FOR EACH PIXEL
    if val == "reflectance":
        pixel_values = r_lidar
    elif val == "height":
        pixel_values = z_lidar
    else:
        pixel_values = -d_lidar

    # PLOT THE IMAGE
    cmap = "jet"            # Color map to use
    dpi = 100               # Image resolution
    fig, ax = plt.subplots(figsize=(x_max/dpi, y_max/dpi), dpi=dpi)
    ax.scatter(x_img,y_img, s=1, c=pixel_values, linewidths=0, alpha=1, cmap=cmap)
    ax.set_axis_bgcolor((0, 0, 0)) # Set regions with no points to black
    ax.axis('scaled')              # {equal, scaled}
    ax.xaxis.set_visible(False)    # Do not draw axis tick marks
    ax.yaxis.set_visible(False)    # Do not draw axis tick marks
    plt.xlim([0, x_max])   # prevent drawing empty space outside of horizontal FOV
    plt.ylim([0, y_max])   # prevent drawing empty space outside of vertical FOV

    if saveto is not None:
        fig.savefig(saveto, dpi=dpi, bbox_inches='tight', pad_inches=0.0)
    else:
        fig.show()



使用示例

import matplotlib.pyplot as plt
import numpy as np

lidar = np.loadtxt('0000000000.txt')

HRES = 0.35         # horizontal resolution (assuming 20Hz setting)
VRES = 0.4          # vertical res
VFOV = (-24.9, 2.0) # Field of view (-ve, +ve) along vertical axis
Y_FUDGE = 5         # y fudge factor for velodyne HDL 64E

lidar_to_2d_front_view(lidar, v_res=VRES, h_res=HRES, v_fov=VFOV, val="depth",
                       saveto="D:\\天翼云盘同步盘\\project\\PythonProject\\pointcloud\\tmp/lidar_depth.png", y_fudge=Y_FUDGE)

lidar_to_2d_front_view(lidar, v_res=VRES, h_res=HRES, v_fov=VFOV, val="height",
                       saveto="D:\\天翼云盘同步盘\\project\\PythonProject\\pointcloud\\tmp/lidar_height.png", y_fudge=Y_FUDGE)

lidar_to_2d_front_view(lidar, v_res=VRES, h_res=HRES, v_fov=VFOV,
                       val="reflectance", saveto="D:\\天翼云盘同步盘\\project\\PythonProject\\pointcloud\\tmp/lidar_reflectance.png",
                       y_fudge=Y_FUDGE)



使用numpy创建

def scale_to_255(a, min, max, dtype=np.uint8):
    """ Scales an array of values from specified min, max range to 0-255
        Optionally specify the data type of the output (default is uint8)
    """
    return (((a - min) / float(max - min)) * 255).astype(dtype)


# ==============================================================================
#                                                        POINT_CLOUD_TO_PANORAMA
# ==============================================================================
def point_cloud_to_panorama(points,
                            v_res=0.42,
                            h_res = 0.35,
                            v_fov = (-24.9, 2.0),
                            d_range = (0,100),
                            y_fudge=3
                            ):
    """ Takes point cloud data as input and creates a 360 degree panoramic
        image, returned as a numpy array.

    Args:
        points: (np array)
            The numpy array containing the point cloud. .
            The shape should be at least Nx3 (allowing for more columns)
            - Where N is the number of points, and
            - each point is specified by at least 3 values (x, y, z)
        v_res: (float)
            vertical angular resolution in degrees. This will influence the
            height of the output image.
        h_res: (float)
            horizontal angular resolution in degrees. This will influence
            the width of the output image.
        v_fov: (tuple of two floats)
            Field of view in degrees (-min_negative_angle, max_positive_angle)
        d_range: (tuple of two floats) (default = (0,100))
            Used for clipping distance values to be within a min and max range.
        y_fudge: (float)
            A hacky fudge factor to use if the theoretical calculations of
            vertical image height do not match the actual data.
    Returns:
        A numpy array representing a 360 degree panoramic image of the point
        cloud.
    """
    # Projecting to 2D
    x_points = points[:, 0]
    y_points = points[:, 1]
    z_points = points[:, 2]
    r_points = points[:, 3]
    d_points = np.sqrt(x_points ** 2 + y_points ** 2)  # map distance relative to origin
    #d_points = np.sqrt(x_points**2 + y_points**2 + z_points**2) # abs distance

    # We use map distance, because otherwise it would not project onto a cylinder,
    # instead, it would map onto a segment of slice of a sphere.

    # RESOLUTION AND FIELD OF VIEW SETTINGS
    v_fov_total = -v_fov[0] + v_fov[1]

    # CONVERT TO RADIANS
    v_res_rad = v_res * (np.pi / 180)
    h_res_rad = h_res * (np.pi / 180)

    # MAPPING TO CYLINDER
    x_img = np.arctan2(y_points, x_points) / h_res_rad
    y_img = -(np.arctan2(z_points, d_points) / v_res_rad)

    # THEORETICAL MAX HEIGHT FOR IMAGE
    d_plane = (v_fov_total/v_res) / (v_fov_total* (np.pi / 180))
    h_below = d_plane * np.tan(-v_fov[0]* (np.pi / 180))
    h_above = d_plane * np.tan(v_fov[1] * (np.pi / 180))
    y_max = int(np.ceil(h_below+h_above + y_fudge))

    # SHIFT COORDINATES TO MAKE 0,0 THE MINIMUM
    x_min = -360.0 / h_res / 2
    x_img = np.trunc(-x_img - x_min).astype(np.int32)
    x_max = int(np.ceil(360.0 / h_res))

    y_min = -((v_fov[1] / v_res) + y_fudge)
    y_img = np.trunc(y_img - y_min).astype(np.int32)

    # CLIP DISTANCES
    d_points = np.clip(d_points, a_min=d_range[0], a_max=d_range[1])

    # CONVERT TO IMAGE ARRAY
    img = np.zeros([y_max + 1, x_max + 1], dtype=np.uint8)
    img[y_img, x_img] = scale_to_255(d_points, min=d_range[0], max=d_range[1])

    return img



使用 Velodyne HDL 64E 配置的示例

import matplotlib.pyplot as plt
import numpy as np

points = np.loadtxt('0000000000.txt')

im = point_cloud_to_panorama(points,
                             v_res=0.42,
                             h_res=0.35,
                             v_fov=(-24.9, 2.0),
                             y_fudge=3,
                             d_range=(0,100))


特别说明:本文为本人学习所做笔记。
具体参考:http://ronny.rest/tutorials/module/pointclouds_01/point_cloud_birdseye/
————————————————
版权声明:本文为CSDN博主「听说你爱吃芒果」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33801763/article/details/78924265

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理点云数据 点云与生成前视图 的相关文章

  • 自动驾驶多边形iou计算Shapely库笔记

    参考 https cloud tencent com developer ask 42755 https blog csdn net u014421797 article details 89501572 https www itransl
  • PCL学习笔记,区域生长分割(region growing segmentation)

    在本博文中 我主要介绍如何在pcl RegionGrowing类中调用区域增长算法 首先注意一点 这里是region growing segmentation 不是color based region growing segmentatio
  • 3D车道线单目检测方法ONCE-3DLanes

    3D车道线检测论文 ONCE 3DLanes Building Monocular 3D Lane Detection 上传arXiv于2022年5月 是华为诺亚和复旦大学的工作 由于道路不平 传统的单目图像2D车道线检测在自动驾驶的跟踪规
  • opengl多重采样技术

    检查是否支持多重采样技术 if not glGetString GL EXTENSIONS find b GL ARB multisample gt 0 print Multi sampling not available else pri
  • CVPR 2022

    作者 cocoon 编辑 3D视觉开发者社区 前言 FAIR又出新作了 一篇 2020年代的卷积网络 的横空出世 让国内外CV圈的眼光都聚焦于此 不少大牛都纷纷下场参与讨论 研究团队以Transformer的一些设计原则以及训练技巧为标 尽
  • 3D Vision--生成空间任意圆柱及任意直线

    contents 写在前面 几何原理 圆柱的方程 用于拟合已有圆柱 圆柱空间参数方程 用于生成圆柱 python代码 生成结果 完 写在前面 1 内容 如何生成空间任意圆柱体点云及其轴线 任意直线的生成也就是本文轴线的生成方式 2 环境 o
  • blender 入门教程

    目录 blender软件安装 blender python模块 blender 调用python脚本 调用成功 结果不对 blender渲染3d对象 加载背景图不显示的解决方法 背景图不显示原因 关节运动教程 自身旋转动画 导入模型 再导出
  • openmvg2.0编译与使用

    目录 写在前面 获取代码 github 网盘 编译 使用 稠密重建 参考 完 写在前面 1 openmvg是一个用于实现structure from motion的开源库 实现了完整的sfm pipeline 并有说明文档 https op
  • blender bpy入门笔记

    目录 bpycv 加载 渲染demo 可以导出图片 但是图片为空 导出obj模型 随机旋转 录制常见脚本 渲染属性 胶片 gt 透明 其他命令 bpycv https github com DIYer22 bpycv 加载 渲染demo i
  • Open3D:Win10 + VS2017配置Open3D(C++、python)

    累了就要打游戏 2020 08 25 15 13 10 3350 收藏 25 分类专栏 Open3D 文章标签 点云 Open3D C 版权 Open3D 专栏收录该内容 5 篇文章1 订阅 订阅专栏 20200825 今天七夕 呱呱呱 O
  • 标定工具箱 OpenCalib: 自动驾驶多传感器的一个开源标定工具箱

    2022年5月30日上传arXiv的论文 OpenCalib A Multi sensor Calibration Toolbox for Autonomous Driving 作者来自商汤科技和上海AI实验室 准确的传感器标定是实现智能车
  • 英伟达新方法入选CVPR 2023:对未知物体的6D姿态追踪和三维重建

    普通手机 随手 拍的雕像 一下就变成了精细的三维重建图 水杯来回动的动态场景下 细节清晰可见 静态场景效果也同样nice 狗狗突出的肋骨都被还原了出来 对比来看其他方法 效果是酱婶的 这就是英伟达最新提出的方法BundleSDF 这是一种可
  • 3ddfa v2 实测 笔记

    目录 2d人脸关键点opencv 演示代码 不带smooth emoca 3d生成 官方开源代码相关 学习笔记
  • 处理点云数据 点云与生成前视图

    创建点云数据中的前视图 前视图投影 为了将激光雷达传感器的前视图平面化为二维图像 必须将三维空间中的点投影到可以展开的圆柱形表面上 以将其平面化 下面公式见论文Vehicle Detection from 3D Lidar Using Fu
  • 3D点云重建原理及Pytorch实现

    3D点云重建原理及Pytorch实现 Pytorch Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruction 一种Pytorch实现方法 学习
  • 点云数据生成鸟瞰图笔记

    参考博客 处理点云数据 一 点云与生成鸟瞰图 灰信网 软件开发博客聚合 点云数据 点云数据一般表示为N行 至少三列的numpy数组 每行对应一个单独的点 所以使用至少3个值的空间位置点 X Y Z 来表示 如果点云数据来自于激光雷达传感器
  • 3dmax KeyError: ‘ Alphabet_S‘

    python opengl加载3d模型 报错 原因 mtl文件的name改了 更新一下就可以了 KeyError Alphabet S
  • 点云检测笔记2022

    目录 激光雷达综述 2022以前的点云检测 自动驾驶中的坐标系 Complex YOLOv4 激光雷达综述 百度安全验证
  • 3D点云处理:Opencv Pcl实现深度图转点云(附源码)

    文章目录 0 测试效果 1 代码实现 文章目录 3D视觉个人学习目录 0 测试效果 处理结果 1 代码实现 文章中提供的深度图像 深度图像一般以 tiff和 png保存 可以通过Opencv中的 c v i m r
  • 自动驾驶多传感器融合学习笔记

    目录 BevFusion liar radar BevFusion BevFusion是一种多传感器融合技术 它可以将来自不同传感器 如LiDAR和相机 的数据融合到一个统一的BEV表示中 BevFusion的优点在于它能够结合多种传感器的

随机推荐

  • 数据结构之KMP算法

    一 首先求next值 例如 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next数组的求解方法是 第一位的next值为0 第二位的next值为1 后面求解每一位的next值时 根据前一位进行比较 首先
  • 一文让你明了P NP NPC 问题

    这或许是众多OIer最大的误区之一 你会经常看到网上出现 这怎么做 这不是NP问题吗 这个只有搜了 这已经被证明是NP问题了 之类的话 你要知道 大多数人此时所说的NP问题其实都是指的NPC问题 他们没有搞清楚NP问题和NPC问题的概念 N
  • 第14.2节 HTML知识简介

    一 HTML语言 HTML 指的是超文本标记语言 Hyper Text Markup Language 它不是一种编程语言 而是一种使用一套标记标签 markup tag 来标记元素作用的标记语言 标记语言使用标记标签来描述网页的内容 标记
  • 如何在linux中打印程序堆栈信息

    如何在linux中打印程序堆栈信息 用于调试 有时候在写完代码之后需要自己手动测试功能 在linux环境中往往需要gdb调试打断点查看堆栈 往往公司的服务器一般是多人同时使用的 往往性能不是太强 gdb调试的时候载入的时候Reading s
  • Java 中 try-catch,throw和throws的使用

    Java 中的异常有很多 这种异常机制 可以帮助处理程序中未知的错误 关于异常的处理有try catch 程序块 throw throws 以下分别对这三种进行介绍 一 try catch try catch用来捕获代码段的异常并做出处理
  • SQL语句知识大全

    目录导航 一 SQL简介 1 什么是数据库 2 数据库分类 3 SQL 是什么 4 SQL 能做什么 5 RDBMS 二 基础语法 1 创建数据库 2 删除数据库 3 创建表 4 删除新表 5 增加一个列 6 添加主键 7 创建索引 8 创
  • python实现物体定位

    前段时间利用实验室的器材写了一个小小的项目 简单的整理了一下 并不完善 现在分享一下 实验的内容是 使用卫星定位信息接收器 接收物体的位置信息 包括经度纬度等等 然后解析这些数据 然后根据经度纬度等信息通关百度地图API获取物体的具体位置信
  • 分享常用JDBC连接参数

    oracle 驱动 oracle jdbc driver OracleDriver URL jdbc oracle thin
  • 依靠自我

    必读网 http www beduu com 整理 依靠自我 我们需要爱默生式的思想家 当所有的编译工作都完成之后 我突然发现自己在编译过程中经常出现的 为什么要编译爱默生的文章 的疑问都变得多余了 也就是说 我突然认为 在中国重提爱默生是
  • iOS:如何在iphone、ipad上安装一些常用命令行命令

    iOS 如何在iphone ipad上安装一些常用命令行命令 相信对Linux Unix比较熟悉的朋友 在iphone或 ipad越狱后发现通过Cydia可以安装OpenSSH 一定都想安装上并且通过ssh登录上去看看 但是登录后却发现几乎
  • jsch jar包连接不上ssh报Algorithm negotiation fail 错误

    参考 JSchException Algorithm negotiation fail问题解决之路 GreatQing的个人页面 OSCHINA 中文开源技术交流社区 1 jsch jar包连接不上ssh报Algorithm negotia
  • python 报错error193_WindowsError:[错误193]%1不是在Python有效的Win32应用程序

    I wish to import liblas module in Python 2 7 on window 64bit If I import the module with IDLE Python GUI I have no probl
  • 相较稳定的红包算法实现/c语言实现

    红包的分配分布 个人认为能够运用到正态分布是极好 运气好的人少 运气差的人也少 但是本篇算法并不打算利用正态分布的特性来实现分配红包算法 本人太菜 而是一个产生红包相对稳定 一定程度上也算一个是符合正太分布特性的算法 世间很多事物的分布一定
  • 爬虫的请求参数字典中含有相同的键该怎么办?

    目录 针对GET方法 针对POST方法 针对GET方法 比如一个网站get方法的链接是 https www baidu com assist test get name test age 20 class age 18 可以看出该方法传递的
  • 计算机网络 学习摘要(8) - 音视频服务/IPv6协议

    概述 音视频常用的协议 实时流RTSP协议 实时运输协议RTP 实时传送控制协议RTCP H 323 以及会话发起协议SIP 声音采用的是PCM编码 不同的是数据率影响音质 互联网本身是非等时的 音视频传输需要时间间隔等时 互联网提供的音频
  • BigDecimal精度丢失,给前端返回String类型,ToStringSerializer。

    bigDecimal长度太长 返回给前端 精度会丢失 即后几位都会变成0 解决办法 给前端返回字符串类型 加注解 JsonSerialize using ToStringSerializer class JsonSerialize usin
  • 蓝桥杯历届-带分数

    蓝桥杯历届 带分数 标题 带分数 100 可以表示为带分数的形式 100 3 69258 714 还可以表示为 100 82 3546 197 注意特征 带分数中 数字1 9分别出现且只出现一次 不包含0 类似这样的带分数 100 有 11
  • 使用Chrome调试JavaScript的断点设置和调试技巧

    使用Chrome调试JavaScript的断点设置和调试技巧 投稿 hebedich 字体 增加 减小 类型 转载 时间 2014 12 16 这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧 需要的朋友可以参
  • centos7 开机启动流程

    开机启动流程 开机启动流程的意义 1 掌握让某个软件开机自动运行 2 开机不能正常启动 是什么原因 或者哪个环节出现了问题 3 防止黑客植入木马 去查询黑客会把木马放到哪些地方 POST 上电自检 gt 加载BIOS Basic Input
  • 处理点云数据 点云与生成前视图

    创建点云数据中的前视图 前视图投影 为了将激光雷达传感器的前视图平面化为二维图像 必须将三维空间中的点投影到可以展开的圆柱形表面上 以将其平面化 下面公式见论文Vehicle Detection from 3D Lidar Using Fu