在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

點云處理——將激光雷達數(shù)據(jù)投影到二維圖像

新機器視覺 ? 來源:3D視覺開發(fā)者社區(qū) ? 2023-11-30 16:53 ? 次閱讀

“前視圖”投影

為了將激光雷達傳感器的“前視圖”展平為2D圖像,必須將3D空間中的點投影到可以展開的圓柱形表面上,以形成平面。

本文代碼參考自論文《Vehicle Detection from 3D Lidar Using Fully Convolutional Network》

論文鏈接:https://arxiv.org/pdf/1608.07916.pdf

b2e63ca4-8f5b-11ee-939d-92fbcf53809c.png

b3210438-8f5b-11ee-939d-92fbcf53809c.png

# h_res = horizontal resolution of the lidar sensor
# v_res = vertical resolution of the lidar sensor
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

問題在于這樣做會將圖像的接縫直接放在汽車的右側(cè)。將接縫定位在汽車的最后部更有意義,因此前部和側(cè)部更重要的區(qū)域是不間斷的。讓這些重要區(qū)域不間斷將使卷積神經(jīng)網(wǎng)絡(luò)更容易識別那些重要區(qū)域中的整個對象。
以下代碼解決了這個問題。

# h_res = horizontal resolution of the lidar sensor
# v_res = vertical resolution of the lidar sensor
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

沿每個軸配置刻度

變量h r e s h_{res}和v r e s v_{res}非常依賴于所使用的LIDAR傳感器。在KTTI數(shù)據(jù)集中,使用的傳感器是Velodyne HDL 64E。根據(jù)Velodyne HDL 64E的規(guī)格表,它具有以下重要特征:

  • 垂直視野為26.9度,分辨率為0.4度,垂直視野被分為傳感器上方+2度,傳感器下方-24.9度

  • 360度的水平視野,分辨率為0.08-0.35(取決于旋轉(zhuǎn)速度)

  • 旋轉(zhuǎn)速率可以選擇在5-20Hz之間

可以按以下方式更新代碼:

# Resolution and Field of View of LIDAR sensor
h_res = 0.35         # horizontal resolution, assuming rate of 20Hz is used 
v_res = 0.4          # vertical res
v_fov = (-24.9, 2.0) # Field of view (-ve, +ve) along vertical axis
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

然而,這導(dǎo)致大約一半的點在x軸負方向上,并且大多數(shù)在y軸負方向上。為了投影到2D圖像,需要將最小值設(shè)置為(0,0),所以需要做一些改變:

# SHIFT COORDINATES TO MAKE 0,0 THE MINIMUM
x_min = -360.0/h_res/2    # Theoretical min x value based on specs of sensor
x_img = 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 specs of sensor
y_img = y_img - y_min     # Shift
y_max = v_fov_total/v_res # Theoretical max x value after shifting
y_max = y_max + 5         # UGLY: Fudge factor because the calculations based on
                          # spec sheet do not seem to match the range of angles
#collectedbysensorinthedata.

繪制二維圖像

將3D點投影到2D坐標點,最小值為(0,0),可以將這些點數(shù)據(jù)繪制成2D圖像。

pixel_values = -d_lidar # Use depth data to encode the value for each pixel
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
fig.savefig("/tmp/depth.png",dpi=dpi,bbox_inches='tight',pad_inches=0.0)

完整代碼

把上面所有的代碼放在一個函數(shù)中。

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


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="/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="/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="/tmp/lidar_reflectance.png",
                       y_fudge=Y_FUDGE)

產(chǎn)生以下三個圖像:

Depth

b337b46c-8f5b-11ee-939d-92fbcf53809c.png

Height

b34fcb10-8f5b-11ee-939d-92fbcf53809c.png

Reflectance

b373655c-8f5b-11ee-939d-92fbcf53809c.png

后續(xù)操作步驟

目前創(chuàng)建每個圖像非常慢,可能是因為matplotlib,它不能很好地處理大量的散點。
因此需要創(chuàng)建一個使用numpy或PIL的實現(xiàn)。

測試

需要安裝python-pcl,加載PCD文件。

sudo apt-get install python-pip


sudo apt-get install python-dev


sudo pip install Cython==0.25.2


sudo pip install numpy


sudo apt-get install git


git clone https://github.com/strawlab/python-pcl.git


cd python-pcl/


python setup.py build_ext -i


python setup.py install

可惜,sudo pip install Cython==0.25.2這步報錯:

Cannot uninstall ‘Cython’. 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.”

換個方法,安裝pypcd:

pipinstallpypcd

查看 https://pypi.org/project/pypcd/ ,用例如下:

Example
-------


.. code:: python


import pypcd
# also can read from file handles.
pc = pypcd.PointCloud.from_path('foo.pcd')
# pc.pc_data has the data as a structured array
# pc.fields, pc.count, etc have the metadata


# center the x field
pc.pc_data['x'] -= pc.pc_data['x'].mean()


# save as binary compressed
pc.save_pcd('bar.pcd', compression='binary_compressed')

測試數(shù)據(jù)結(jié)構(gòu):

“ >>> lidar = pypcd.PointCloud.from_path(‘~/pointcloud-processing/000000.pcd’)

>>> lidar.pc_data

array([(18.323999404907227, 0.04899999871850014, 0.8289999961853027, 0.0),

(18.3439998626709, 0.10599999874830246, 0.8289999961853027, 0.0),

(51.29899978637695, 0.5049999952316284, 1.944000005722046, 0.0),

…,

(3.7139999866485596, -1.3910000324249268, -1.7330000400543213, 0.4099999964237213),

(3.9670000076293945, -1.4739999771118164, -1.8569999933242798, 0.0),

(0.0, 0.0, 0.0, 0.0)],

dtype=[(‘x’, ‘

>>> lidar.pc_data[‘x’]

array([ 18.3239994 , 18.34399986, 51.29899979, …, 3.71399999,

3.96700001, 0. ], dtype=float32) ”

加載PCD:

import pypcd


lidar=pypcd.PointCloud.from_path('000000.pcd')

x_lidar:

x_lidar=points[’x‘]

結(jié)果:

Depth

b38c146c-8f5b-11ee-939d-92fbcf53809c.png

Height

b39e1914-8f5b-11ee-939d-92fbcf53809c.png

Reflectance

b3b3e32a-8f5b-11ee-939d-92fbcf53809c.png


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2560

    文章

    52158

    瀏覽量

    761469
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    614

    瀏覽量

    28743
  • 激光雷達
    +關(guān)注

    關(guān)注

    970

    文章

    4142

    瀏覽量

    191533

原文標題:點云處理——將激光雷達數(shù)據(jù)投影到二維圖像

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    激光雷達是自動駕駛不可或缺的傳感器

    看到這種低成本的激光雷達,從研發(fā)、樣品商用,可能會比原來預(yù)想的周期更快。因為不是一家激光雷達公司在努力,而是整個產(chǎn)業(yè)鏈都在努力。是在同
    發(fā)表于 09-08 17:24

    激光雷達分類以及應(yīng)用

    激光雷達實際上是一種工作在光學(xué)波段(特殊波段)的雷達,它的優(yōu)點非常明顯:1、具有極高的分辨率:激光雷達工作于光學(xué)波段,頻率比微波高2~3個數(shù)量級以上,因此,與微波雷達相比,
    發(fā)表于 09-19 15:51

    激光雷達面臨的機遇與挑戰(zhàn)

    機遇激光雷達在智能機器生態(tài)系統(tǒng)中有很多機遇。與使用二維圖像相比,能夠更容易的被計算機使用,用于構(gòu)建物理環(huán)境的三
    發(fā)表于 09-26 14:30

    北醒固態(tài)設(shè)計激光雷達

    其他展位,兩臺固態(tài)雷達數(shù)據(jù)實現(xiàn)完美的融合,特別彰顯了北醒已經(jīng)解決了困擾flash Lidar已久的互相干擾的技術(shù)難題,更好地服務(wù)于大
    發(fā)表于 01-25 09:36

    固態(tài)設(shè)計激光雷達

    其他展位,兩臺固態(tài)雷達數(shù)據(jù)實現(xiàn)完美的融合,特別彰顯了北醒已經(jīng)解決了困擾flash Lidar已久的互相干擾的技術(shù)難題,更好地服務(wù)于大
    發(fā)表于 01-25 09:41

    激光雷達除了可以激光測距外,還可以怎么應(yīng)用?

    簡單的3D雷達,獲取三數(shù)據(jù)呢?目前市面上主流的有2種方式:1、采用線狀激光器,原先的一個
    發(fā)表于 05-11 15:33

    激光雷達知多少:從技術(shù)上講講未來前景

    地區(qū)三控制和數(shù)字地面模型的獲取提供了新的途徑,無論對于國防或是科學(xué)研究都具有十分重大意義。星載激光雷達還具有觀察整個天體的能力,美國進行的月球和火星等探測計劃中都包含了星載激光雷達
    發(fā)表于 07-14 07:56

    一種不依賴于棋盤格等輔助標定物體實現(xiàn)像素級相機和激光雷達自動標定的方法

    變換方式區(qū)分性能不好,提供的約束效果不好:進一步指出投影圖像平面再提取特征的問題主要在于
    發(fā)表于 09-01 07:42

    如何設(shè)計一款適合于果園應(yīng)用的激光雷達

    1、概述由于課題要求,需要設(shè)計一款適合于果園應(yīng)用的激光雷達。因此采用單線掃描激光雷達和角度傳感器來設(shè)計能采集二維數(shù)據(jù)激光雷達。關(guān)于
    發(fā)表于 11-12 08:15

    激光雷達數(shù)據(jù)分割算法的嵌入式平臺上的部署實現(xiàn)

    點擊上方“AI算法修煉營”,選擇“星標”公眾號精選作品,第一時間送達這篇文章是激光雷達數(shù)據(jù)分割算法的嵌入式平臺上的部署實現(xiàn)。主要的創(chuàng)新
    發(fā)表于 12-21 08:28

    激光雷達數(shù)據(jù)

    原來,這些都是激光雷達(LiDAR)數(shù)據(jù),每一個都包含了三坐標信息,也是我們常說的X、Y
    的頭像 發(fā)表于 09-24 12:29 ?1.3w次閱讀
    <b class='flag-5'>激光雷達</b><b class='flag-5'>點</b><b class='flag-5'>云</b><b class='flag-5'>數(shù)據(jù)</b>

    關(guān)于激光雷達傳感器如何投影二維圖像

    為了激光雷達傳感器的“前視圖”展平為2D圖像,必須將3D空間中的投影可以展開的圓柱形表面上
    的頭像 發(fā)表于 04-03 09:58 ?2615次閱讀
    關(guān)于<b class='flag-5'>激光雷達</b>傳感器如何<b class='flag-5'>投影</b>成<b class='flag-5'>二維</b><b class='flag-5'>圖像</b>

    詳解激光雷達數(shù)據(jù)處理過程

    隨著激光雷達的上車數(shù)量的不斷攀升,如何用好激光雷達成為了重中之重,而用好激光雷達的關(guān)鍵之一就在于處理好點
    的頭像 發(fā)表于 03-14 09:36 ?4510次閱讀

    瑞識科技推出用于激光雷達二維可尋址VCSEL芯片并獲量產(chǎn)訂單

    隨著汽車智能化和自動駕駛技術(shù)的快速發(fā)展,車載激光雷達市場近年呈現(xiàn)出高速增長的態(tài)勢。近日,瑞識科技推出新款二維可尋址激光雷達VCSEL芯片,可應(yīng)用于搭載固態(tài)激光雷達的智駕方案,以實現(xiàn)更高
    的頭像 發(fā)表于 04-01 11:16 ?1190次閱讀
    瑞識科技推出用于<b class='flag-5'>激光雷達</b>的<b class='flag-5'>二維</b>可尋址VCSEL芯片并獲量產(chǎn)訂單

    激光雷達數(shù)據(jù)包含哪些信息

    )、環(huán)境監(jiān)測、城市規(guī)劃等領(lǐng)域。激光雷達數(shù)據(jù)激光雷達系統(tǒng)收集的一系列三
    的頭像 發(fā)表于 08-29 17:18 ?1481次閱讀
    主站蜘蛛池模板: 人人上人人干 | 一级大片免费看 | 美日韩一级 | 午夜五月天| 在线观看高清免费播放 | 免费又爽又黄1000禁片 | 一区二区三区无码高清视频 | 国产精品热久久毛片 | 亚洲一区免费看 | 免费色黄网站 | 天天做天天看夜夜爽毛片 | 日韩免费视频一区二区 | 国产情侣真实露脸在线最新 | 欧美日本一区二区三区 | 欧美色欧美色 | 噜噜嘿 | www.久操| 日韩精品网址 | 男女午夜免费视频 | 日本人zzzwww| 天天躁狠狠躁 | 国产裸体美女视频全黄 | 亚洲另类激情综合偷自拍 | 亚洲毛片网 | 就去色播 | 三级完整在线观看高清视频 | 久久在精品线影院精品国产 | 西西午夜影院 | 国产盗摄女厕美女嘘嘘 | 99热成人精品热久久669 | 色噜噜狠狠色综合中文字幕 | 国产1024一区二区你懂的 | 国产一区二区三区免费大片天美 | 丁香网五月天 | 美女扒开尿口让男生添 漫画 | 2019偷偷狠狠的日日 | 狠狠色噜噜狠狠狠狠97不卡 | 一级特级女人18毛片免费视频 | 美女扒开内裤让男人桶 | 视频在线观看免费网站 | 国产情侣草莓视频在线 |