色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

創建點云數據的Birdseye視圖

新機器視覺 ? 來源:CSDN ? 作者:CSDN ? 2021-04-01 14:39 ? 次閱讀

點云數據——The Point Cloud Data

點云數據應表示為具有N行和至少3列的numpy數組。每行對應于單個點,其在空間(x,y,z)中的位置使用至少3個值表示。

d0be3e4c-92a7-11eb-8b86-12bb97331649.png

如果點云數據來自LIDAR傳感器,那么它可能具有每個點的附加值,例如“反射率”,其是在該位置中障礙物反射多少激光光束的量度。在這種情況下,點云數據可能是Nx4陣列。

圖像與點云坐標——Image vs Point Cloud Coordinates

點云的軸與圖像中的軸具有完全不同的含義。下圖顯示了藍色的圖像軸和橙色的點云軸。

d0d158ba-92a7-11eb-8b86-12bb97331649.png

關于圖像需要注意的一些重要事項:

圖像中的坐標值始終為正。

原點位于左上角。

坐標是整數值。

有關點云坐標的注意事項:

點云中的坐標值可以是正數或負數。

坐標可以采用實數值。

正x軸表示向前。

正y軸表示左。

正z軸表示向上。

創建點云數據的Birdseye視圖

鳥瞰圖的相關軸
為了創建鳥眼視圖圖像,來自點云數據的相關軸將是x和y軸。

d0e948f8-92a7-11eb-8b86-12bb97331649.png

但是,正如我們從上圖所示,我們必須小心并考慮以下事項:
x和y軸意味著相反的事情。
x和y軸指向相反的方向。
您必須移動值,以便(0,0)是圖像中可能的最小值。

1.限制矩形看——Limiting Rectangle to Look at

僅關注點云的特定區域通常很有用。因此,我們希望創建一個僅保留我們感興趣的區域內的點的過濾器。

由于我們正在查看頂部的數據,并且我們有興趣將其轉換為圖像,因此我將使用與圖像軸更加一致的方向。下面,我指定我想要集中在相對于原點的值的范圍。原點左側的任何內容都將被視為負數,而右側的任何內容都將被視為正數。點云的x軸將被解釋為向前方向(這將是我們的鳥眼圖像的向上方向)。

下面的代碼將感興趣的矩形設置為在原點的兩側跨越10米,并在其前面20米處。

side_range=(-10, 10) # left-most to right-mostfwd_range=(0, 20) # back-most to forward-most

2.接下來,我們創建一個過濾器,僅保留實際位于我們指定的矩形內的點。

# EXTRACT THE POINTS FOR EACH AXISx_points = points[:, 0]y_points = points[:, 1]z_points = points[:, 2] # FILTER - To return only indices of points within desired cube# Three filters for: Front-to-back, side-to-side, and height ranges# Note left side is positive y axis in LIDAR coordinatesf_filt = np.logical_and((x_points > fwd_range[0]), (x_points < fwd_range[1]))s_filt = np.logical_and((y_points > -side_range[1]), (y_points < -side_range[0]))filter = np.logical_and(f_filt, s_filt)indices = np.argwhere(filter).flatten() # KEEPERSx_points = x_points[indices]y_points = y_points[indices]z_points = z_points[indices]

3.將點位置映射到像素位置——Mapping Point Positions to Pixel Positions

目前,我們有一堆帶有實數值的點。為了映射這些值,將這些值映射到整數位置值。我們可以天真地將所有x和y值整合到整數中,但我們最終可能會失去很多分辨率。例如,如果這些點的測量單位是以米為單位,則每個像素將表示點云中1x1米的矩形,我們將丟失任何小于此的細節。如果你有一個類似山景的點云,這可能沒問題。但是如果你想能夠捕捉更精細的細節并識別人類,汽車,甚至更小的東西,那么這種方法就沒有用了。 但是,可以稍微修改上述方法,以便我們獲得所需的分辨率級別。在對整數進行類型轉換之前,我們可以先擴展數據。例如,如果測量單位是米,我們想要5厘米的分辨率,我們可以做如下的事情:

res = 0.05# CONVERT TO PIXEL POSITION VALUES - Based on resolutionx_img = (-y_points / res).astype(np.int32) # x axis is -y in LIDARy_img = (-x_points / res).astype(np.int32) # y axis is -x in LIDAR

您會注意到x軸和y軸交換,方向反轉,以便我們現在可以開始處理圖像坐標。

更改坐標原點——Shifting to New Origin

x和y數據仍未準備好映射到圖像。我們可能仍然有負x和y值。所以我們需要將數據移位到(0,0)最小值。

# SHIFT PIXELS TO HAVE MINIMUM BE (0,0)# floor and ceil used to prevent anything being rounded to below 0 after shiftx_img -= int(np.floor(side_range[0] / res))y_img += int(np.ceil(fwd_range[1] / res))

現在數據值都為正值

>>> x_img.min()7>>> x_img.max()199>>> y_img.min()1>>> y_img.max()199

像素值——Pixel Values

我們已經使用點數據來指定圖像中的x和y位置。我們現在需要做的是指定我們想要用這些像素位置填充的值。一種可能性是用高度數據填充它。要做的兩件事 請記住: 像素值應為整數。 像素值應該是0-255范圍內的值。 我們可以從數據中獲取最小和最大高度值,并重新縮放該范圍以適應0-255的范圍。另一種方法,這里將使用的方法是設置我們想要集中的高度值范圍,并且高于或低于該范圍的任何內容都被剪切為最小值和最大值。這很有用,因為它允許我們從感興趣的區域獲得最大量的細節。

height_range = (-2, 0.5) # bottom-most to upper-most # CLIP HEIGHT VALUES - to between min and max heightspixel_values = np.clip(a = z_points, a_min=height_range[0], a_max=height_range[1])

在下面的代碼中,我們將范圍設置為原點下方2米,高于原點半米。接下來,我們將這些值重新縮放到0到255之間,并將類型轉換為整數。

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) # RESCALE THE HEIGHT VALUES - to be between the range 0-255pixel_values = scale_to_255(pixel_values, min=height_range[0], max=height_range[1])

創建圖像陣列——Create the Image Array

現在我們準備實際創建圖像,我們只是初始化一個數組,其尺寸取決于我們在矩形中所需的值范圍和我們選擇的分辨率。然后我們使用我們轉換為像素位置的x和y點值來指定數組中的索引,并為這些索引分配我們選擇的值作為前一小節中的像素值。

# INITIALIZE EMPTY ARRAY - of the dimensions we wantx_max = 1+int((side_range[1] - side_range[0])/res)y_max = 1+int((fwd_range[1] - fwd_range[0])/res)im = np.zeros([y_max, x_max], dtype=np.uint8) # FILL PIXEL VALUES IN IMAGE ARRAYim[y_img, x_img] = pixel_values

預覽——Viewing

目前,圖像存儲為numpy數組。如果我們希望將其可視化,我們可以將其轉換為PIL圖像,并查看它。

# CONVERT FROM NUMPY ARRAY TO A PIL IMAGEfrom PIL import Imageim2 = Image.fromarray(im)im2.show()

我們作為人類并不善于分辨灰色陰影之間的差異,因此它可以幫助我們使用光譜顏色映射來讓我們更容易分辨出價值差異。我們可以在matplotlib中做到這一點。(實際無法正常顯示)

import matplotlib.pyplot as pltplt.imshow(im, cmap="spectral", vmin=0, vmax=255)plt.show()

d0f64850-92a7-11eb-8b86-12bb97331649.jpg

它實際上編碼與PIL繪制的圖像完全相同的信息量,因此機器學習學習算法例如仍然能夠區分高度差異,即使我們人類不能非常清楚地看到差異。

import cv2 #通過cv2顯示 cv2.imshow("im",im) cv2.waitKey() cv2.destroyAllWindows()

d1411b0a-92a7-11eb-8b86-12bb97331649.png

完整代碼——Complete Code

為方便起見,我將上面的所有代碼放在一個函數中,它將鳥瞰視圖作為一個numpy數組返回。然后,您可以選擇使用您喜歡的任何方法對其進行可視化,或者將numpy數組插入到機器學習算法中。

import numpy as np # ==============================================================================# SCALE_TO_255# ==============================================================================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_2_BIRDSEYE# ==============================================================================def point_cloud_2_birdseye(points, res=0.1, side_range=(-10., 10.), # left-most to right-most fwd_range = (-10., 10.), # back-most to forward-most height_range=(-2., 2.), # bottom-most to upper-most ): """ Creates an 2D birds eye view representation of the point cloud data. Args: points: (numpy array) N rows of points data Each point should be specified by at least 3 elements x,y,z res: (float) Desired resolution in metres to use. Each output pixel will represent an square region res x res in size. side_range: (tuple of two floats) (-left, right) in metres left and right limits of rectangle to look at. fwd_range: (tuple of two floats) (-behind, front) in metres back and front limits of rectangle to look at. height_range: (tuple of two floats) (min, max) heights (in metres) relative to the origin. All height values will be clipped to this min and max value, such that anything below min will be truncated to min, and the same for values above max. Returns: 2D numpy array representing an image of the birds eye view. """ # EXTRACT THE POINTS FOR EACH AXIS x_points = points[:, 0] y_points = points[:, 1] z_points = points[:, 2] # FILTER - To return only indices of points within desired cube # Three filters for: Front-to-back, side-to-side, and height ranges # Note left side is positive y axis in LIDAR coordinates f_filt = np.logical_and((x_points > fwd_range[0]), (x_points < fwd_range[1])) s_filt = np.logical_and((y_points > -side_range[1]), (y_points < -side_range[0])) filter = np.logical_and(f_filt, s_filt) indices = np.argwhere(filter).flatten() # KEEPERS x_points = x_points[indices] y_points = y_points[indices] z_points = z_points[indices] # CONVERT TO PIXEL POSITION VALUES - Based on resolution x_img = (-y_points / res).astype(np.int32) # x axis is -y in LIDAR y_img = (-x_points / res).astype(np.int32) # y axis is -x in LIDAR # SHIFT PIXELS TO HAVE MINIMUM BE (0,0) # floor & ceil used to prevent anything being rounded to below 0 after shift x_img -= int(np.floor(side_range[0] / res)) y_img += int(np.ceil(fwd_range[1] / res)) # CLIP HEIGHT VALUES - to between min and max heights pixel_values = np.clip(a=z_points, a_min=height_range[0], a_max=height_range[1]) # RESCALE THE HEIGHT VALUES - to be between the range 0-255 pixel_values = scale_to_255(pixel_values, min=height_range[0], max=height_range[1]) # INITIALIZE EMPTY ARRAY - of the dimensions we want x_max = 1 + int((side_range[1] - side_range[0]) / res) y_max = 1 + int((fwd_range[1] - fwd_range[0]) / res) im = np.zeros([y_max, x_max], dtype=np.uint8) # FILL PIXEL VALUES IN IMAGE ARRAY im[y_img, x_img] = pixel_values return im

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2552

    文章

    51220

    瀏覽量

    754626
  • 激光光束
    +關注

    關注

    0

    文章

    15

    瀏覽量

    6952
  • 點云
    +關注

    關注

    0

    文章

    58

    瀏覽量

    3804

原文標題:點云數據詳解——點云數據變為圖像

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

收藏 人收藏

    評論

    相關推薦

    think-cell——Tableau數據

    到 Tableau 的要求 當然,您需要訪問 Tableau 服務器才能將圖表鏈接到 Tableau 數據。think-cell 支持 Tableau 的本地和托管版本。要鏈接到視圖的篩選版本,您需要能夠在托管
    的頭像 發表于 01-03 11:47 ?110次閱讀
    think-cell——Tableau<b class='flag-5'>數據</b>

    自動化創建UI并解析數據

    *附件:32960_auto.rar備注:Main.vi是ui自動化2.1.vi,配置文件為32960.B.ini。 目前可以實現根據配置文件自動化創建控件并布局,且可以自動解析接收到的數據內容寫入
    發表于 12-10 08:41

    數據庫和主機哪個好一

    數據庫和主機哪個好一主機和數據庫各有優勢
    的頭像 發表于 12-04 13:50 ?145次閱讀

    硬盤掛載到新服務器,怎么恢復數據

    硬盤掛載到新服務器并恢復數據,需先獲取掛載權限和配置信息,登錄新服務器管理控制臺選擇并掛載硬盤到指定點,檢查掛載狀態后訪問掛載恢復數據
    的頭像 發表于 12-01 22:27 ?171次閱讀

    自動化創建UI并解析數據

    并布局,且可以自動解析接收到的數據內容寫入到創建的控件。 待優化: 1.協議內容較多時候配置文件編寫較為繁瑣; 2.創建UI時會存在失敗的情況,導致“輸入框.vi”無法關閉; 3.控
    發表于 11-29 11:26

    基于深度學習的三維分類方法

    近年來,云表示已成為計算機視覺領域的研究熱點之一,并廣泛應用于自動駕駛、虛擬現實、機器人等許多領域。雖然深度學習技術在處理常規結構化的二維網格圖像數據方面取得了巨大成功,但在處理不規則、非結構化的
    的頭像 發表于 10-29 09:43 ?617次閱讀
    基于深度學習的三維<b class='flag-5'>點</b><b class='flag-5'>云</b>分類方法

    什么是三維分割

    是世界的一種非結構化三維數據表示,通常由激光雷達傳感器、立體相機或深度傳感器采集。它由一系列單個組成,每個由 x、y 和 z 坐標定
    的頭像 發表于 10-29 09:21 ?203次閱讀

    輸電線路激光雷達監測裝置的功能特點和技術參數介紹

    鼎信智慧輸電線路激光雷達監測裝置DX-WPS100-JG2,采用普光、夜視、激光雷達一體化設計,數據率達 240000
    的頭像 發表于 10-12 09:58 ?317次閱讀

    華納:MySQL初始化操作如何創建新的數據

    要在MySQL中創建一個新的數據庫,可以按照以下步驟進行操作: 登錄到MySQL數據庫管理系統中。可以使用MySQL命令行客戶端或者圖形化工具,如phpMyAdmin。 使用CREATE
    的頭像 發表于 09-04 14:30 ?279次閱讀

    激光雷達數據包含哪些信息

    )、環境監測、城市規劃等領域。激光雷達數據是激光雷達系統收集到的一系列三維空間坐標點,包含了豐富的空間信息。本文將介紹激光雷達
    的頭像 發表于 08-29 17:18 ?981次閱讀

    如何理解計算?

    計算的工作原理是什么? 計算和傳統IT技術的區別? 華納如何幫助您實現計算? 什么是計算?
    發表于 08-16 17:02

    友思特案例 | 自研創新!三維工件尺寸測量及處理解決方案

    3D相機等新型傳感器的發展克服了傳統工件尺寸測量的各種局限,可獲取豐富的三維數據。友思特提供了一種工件3D尺寸測量和處理方案,結合自
    的頭像 發表于 06-13 14:13 ?510次閱讀
    友思特案例 | 自研創新!三維工件尺寸測量及<b class='flag-5'>點</b><b class='flag-5'>云</b>處理解決方案

    泰來三維|三維掃描服務_三維激光掃描儀測量山體滑坡建模

    建模是將測量得到的數據進行擬合、優化與處理,生成真實的三維模型的過程。它能夠全面、準確地顯示被掃描體的外形與內部結構,從而在山體滑坡
    的頭像 發表于 05-15 16:32 ?297次閱讀
    泰來三維|三維掃描服務_三維激光掃描儀測量山體滑坡<b class='flag-5'>點</b><b class='flag-5'>云</b>建模

    基于深度學習的方法在處理3D進行缺陷分類應用

    背景部分介紹了3D應用領域中公開可訪問的數據集的重要性,這些數據集對于分析和比較各種模型至關重要。研究人員專門設計了各種數據集,包括用于
    的頭像 發表于 02-22 16:16 ?1226次閱讀
    基于深度學習的方法在處理3D<b class='flag-5'>點</b><b class='flag-5'>云</b>進行缺陷分類應用

    鴻蒙應用/元服務開發實戰-Serverless存儲沒法創建處理方式

    新賬戶,Serverless存儲沒法創建 ,沒法進行下一步。 解決方式 請按照這個方式修改一下就能正常創建了,瀏覽器中打開控制臺輸入 window.top.cfpConfig.cloudStorageSwitch=‘off’
    發表于 02-19 11:21
    主站蜘蛛池模板: 好男人的视频在线观看| 墨西哥美女主播| 三级全黄a| 国产精品高潮呻吟AV久久96| 亚洲AV无码国产精品色午夜情| 精品免费在线视频| 97超碰在线视频 免费| 日本少妇无码精品12P| 国产骚妇BB网| 2018久久视频在线视频观看| 日本高清色片| 妓女嫖客叫床粗话对白| 99国产电影| 性色香蕉AV久久久天天网| 久久香蕉国产线看观看首页| 被送到黑人性奴俱乐部| 亚洲精品视频久久| 欧洲兽交另类AVXXX| 国产亚洲日韩另类在线播放| AV天堂午夜精品蜜臀AV| 亚洲精品线在线观看| 欧美阿v在线天堂| 吉吉影音先锋av资源网| 超碰最新网站| 在线观看成年人免费视频| 搡女人免费免费视频观看| 久久久影院亚洲精品| 国产精品女主播主要上线| 92精品国产成人观看免费| 亚洲2023无矿砖码砖区| 欧美亚洲另类热图| 久久黄色免费| 国产久久亚洲美女久久| www.av色| 中文字幕亚洲视频| 胸太大被男同桌吃好爽| 啪啪漫画无遮挡全彩h同人| 久久久久久久网| 国产综合91| 国产成人无码精品久久久按摩| 999精品在线|