欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

從原理到c++代碼實(shí)現(xiàn) | 通過(guò)球面投影將點(diǎn)云轉(zhuǎn)換為Range圖像

3D視覺(jué)工坊 ? 來(lái)源:DeepDriving ? 2023-06-21 10:30 ? 次閱讀

前言

將3維激光點(diǎn)云通過(guò)球面投影(Spherical Projection)轉(zhuǎn)換為2維距離圖像(Range Images),是自動(dòng)駕駛應(yīng)用場(chǎng)景中一種非常常見(jiàn)的點(diǎn)云處理方式。點(diǎn)云轉(zhuǎn)換為距離圖像后,通常會(huì)被輸入給一個(gè)2維卷積神經(jīng)網(wǎng)絡(luò)去實(shí)現(xiàn)目標(biāo)檢測(cè)、語(yǔ)義分割等任務(wù)。目前采用這種點(diǎn)云處理方式的典型目標(biāo)檢測(cè)算法RangeDet,語(yǔ)義分割算法有SqueezeSeg、RangeNet++SalsaNext等。在這些文章中,都只給出一個(gè)通過(guò)球面投影轉(zhuǎn)換到距離圖像的最終公式,至于這個(gè)公式是怎么來(lái)的卻沒(méi)有詳細(xì)的推導(dǎo),初看論文的讀者可能會(huì)比較困惑。本文將對(duì)這個(gè)投影公式做一定的推導(dǎo),可能本人理解的也不是很對(duì),歡迎大家批評(píng)指正。

52fc95ac-0fbf-11ee-962d-dac502259ad0.png

圖片來(lái)源于RangeDet論文

球面投影推導(dǎo)過(guò)程

假設(shè)有一個(gè)m線(xiàn)的旋轉(zhuǎn)掃描式激光雷達(dá),它的垂直視場(chǎng)角FOV被分為上下兩個(gè)部分:FOV_upFOV_down,通常以FOV_up的數(shù)值為正數(shù)而FOV_down數(shù)值為負(fù)數(shù),所以FOV = FOV_up + abs(FOV_down)。激光雷達(dá)旋轉(zhuǎn)掃描一周得到的點(diǎn)云相當(dāng)于是以其自身為中心的空心圓柱體,如果把這個(gè)圓柱體展開(kāi)的話(huà),那么就可以把點(diǎn)云投影到一個(gè)圖像平面中去,這個(gè)圖像平面就是距離圖像。

530cd84a-0fbf-11ee-962d-dac502259ad0.png

對(duì)于一個(gè)m線(xiàn)的激光雷達(dá),在掃描的某一時(shí)刻會(huì)得到m個(gè)點(diǎn),如果旋轉(zhuǎn)一周掃描了n次,那么得到的點(diǎn)云就可以用一個(gè)的矩陣來(lái)表示。那么怎么把3維的點(diǎn)云投影到2維的距離圖像平面呢?這就需要用到球面坐標(biāo)。

531bcd0a-0fbf-11ee-962d-dac502259ad0.png

圖片來(lái)源于RangeDet論文

球面坐標(biāo)用3個(gè)參數(shù)來(lái)表示:距離,方位角(Azimuth),天頂角(Zenith)。通常使用的激光雷達(dá)點(diǎn)云中的每個(gè)由3維笛卡爾坐標(biāo)表示的點(diǎn)實(shí)際上是從球面坐標(biāo)系轉(zhuǎn)換而來(lái):

讓我們?cè)偻ㄟ^(guò)下圖來(lái)理解一下3維笛卡爾坐標(biāo)系和球面坐標(biāo)系之間的關(guān)系。

5327b066-0fbf-11ee-962d-dac502259ad0.png

假設(shè)3維笛卡爾坐標(biāo)系下的點(diǎn)坐標(biāo)為,那么用球面坐標(biāo)系可以這樣表示該點(diǎn):

如果以x軸方向?yàn)榍耙晥D的方向把激光雷達(dá)旋轉(zhuǎn)掃描一周得到的圓柱體展開(kāi)后,可以得到一副這樣的圖像:坐標(biāo)原點(diǎn)在圖像的中心,圖像中像素的縱坐標(biāo)由pitch角投影得到(范圍為[FOV_down,FOV_up]),橫坐標(biāo)由yaw角投影得到(范圍為)。

5335f04a-0fbf-11ee-962d-dac502259ad0.png

由于圖像坐標(biāo)系是以左上角作為坐標(biāo)原點(diǎn),所以上面得到的前視圖還需要做一下坐標(biāo)轉(zhuǎn)換,把坐標(biāo)原點(diǎn)移到左上角去:

把3維點(diǎn)云投影為2維圖像,這種降維操作必然會(huì)帶來(lái)信息損失。為了盡可能減少投影帶來(lái)的信息損失,我們需要選擇合適大小的投影圖像。對(duì)于一個(gè)64線(xiàn)的激光雷達(dá),一般會(huì)設(shè)置投影圖像的高為64,那么圖像的寬該如何設(shè)置呢?假設(shè)激光雷達(dá)的水平分辨率為0.35度,那么旋轉(zhuǎn)一周一個(gè)激光器最多產(chǎn)生的點(diǎn)數(shù)為。在卷積神經(jīng)網(wǎng)絡(luò)中,一般會(huì)對(duì)輸入特征圖做多次2倍下采樣,所以圖像的寬度需要設(shè)置為2的次冪,這里可設(shè)置為1024。

由于不同類(lèi)型激光雷達(dá)的視場(chǎng)角、水平分辨率不同,投影圖像的尺寸也會(huì)根據(jù)需要設(shè)置為不同的值,為了適應(yīng)這些變化,yawpitch還需要進(jìn)行規(guī)范化:

規(guī)范化后,再乘以投影圖像的寬高,就得到了這個(gè)點(diǎn)投影到距離圖像的坐標(biāo):

上式中的第二步是將代入得到的。

代碼實(shí)現(xiàn)

理解了原理后,我們?cè)儆么a來(lái)把這個(gè)投影過(guò)程實(shí)現(xiàn)一遍。在RangeNet++中,點(diǎn)云被轉(zhuǎn)換為5個(gè)通道的距離圖像,這5個(gè)通道分別代表點(diǎn)云的這5個(gè)屬性。下面的代碼將展示如何通過(guò)球面投影將點(diǎn)云轉(zhuǎn)換為需要的距離圖像,使用的點(diǎn)云數(shù)據(jù)來(lái)源于SemanticKITTI數(shù)據(jù)集。

#include
#include

#include
#include
#include
#include
#include
#include

intmain(intargc,char**argv){
if(argc2){
std::cout<"Usage:"<0]<"
";
return-1;
}

conststd::stringpcd_file(argv[1]);
pcl::PointCloud::Ptrpoint_cloud(
newpcl::PointCloud);

if(pcl::loadPCDFile(pcd_file,*point_cloud)==-1){
std::cout<"Couldn'treadpcdfile!
";
return-1;
}

constexprintwidth=2048;
constexprintheight=64;
constexprfloatfov_up=3*M_PI/180.0;
constexprfloatfov_down=-25*M_PI/180.0;
constexprfloatfov=std::abs(fov_up)+std::abs(fov_down);
conststd::vector<float>image_means{12.12,10.88,0.23,-1.04,0.21};
conststd::vector<float>image_stds{12.32,11.47,6.91,0.86,0.16};
float*range_images=newfloat[5*width*height]();

for(constauto&point:point_cloud->points){
constauto&x=point.x;
constauto&y=point.y;
constauto&z=point.z;
constauto&intensity=point.intensity;
constfloatrange=std::sqrt(x*x+y*y+z*z);
constfloatyaw=-std::atan2(y,x);
constfloatpitch=std::asin(z/range);

floatproj_x=0.5f*(yaw/M_PI+1.0f)*width;
floatproj_y=(1.0f-(pitch+std::abs(fov_down))/fov)*height;
proj_x=std::floor(proj_x);
proj_y=std::floor(proj_y);

constintu=std::clamp<int>(static_cast<int>(proj_x),0,width-1);
constintv=std::clamp<int>(static_cast<int>(proj_y),0,height-1);

range_images[0*width*height+v*width+u]=
(range-image_means.at(0))/image_stds.at(0);
range_images[1*width*height+v*width+u]=
(x-image_means.at(1))/image_stds.at(1);
range_images[2*width*height+v*width+u]=
(y-image_means.at(2))/image_stds.at(2);
range_images[3*width*height+v*width+u]=
(z-image_means.at(3))/image_stds.at(3);
range_images[4*width*height+v*width+u]=
(intensity-image_means.at(4))/image_stds.at(4);
}

//對(duì)range通道進(jìn)行可視化
cv::Matrange=
cv::Mat(height,width,CV_32FC1,static_cast<void*>(range_images));
cv::Matnormalized_range,u8_range,color_map;
cv::normalize(range,normalized_range,255,0,cv::NORM_MINMAX);
normalized_range.convertTo(u8_range,CV_8UC1);
cv::applyColorMap(u8_range,color_map,cv::COLORMAP_JET);
cv::imwrite("range_color_map.jpg",color_map);
cv::imshow("RangeImage",color_map);
cv::waitKey(0);

delete[]range_images;

return0;
}

對(duì)range通道可視化的結(jié)果如下圖所示:

53403df2-0fbf-11ee-962d-dac502259ad0.jpg

上面的代碼有幾個(gè)需要說(shuō)明的地方:

  • fov_up,fov_down,image_meansimage_stds這幾個(gè)參數(shù)來(lái)源于RangeNet++預(yù)訓(xùn)練模型中的arch_cfg.yaml文件。
  • std::clamp需要c++17支持,編譯的時(shí)候請(qǐng)使用-std=c++17編譯選項(xiàng)。
  • 實(shí)際使用中width * height的值只需要計(jì)算一次,沒(méi)必要在循環(huán)里面反復(fù)計(jì)算,這里這么寫(xiě)只是為了方便理解。

參考資料

  • RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection
  • https://towardsdatascience.com/spherical-projection-for-point-clouds-56a2fc258e6c

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

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73890
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4837

    瀏覽量

    69123
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    662

    瀏覽量

    33069
  • 自動(dòng)駕駛
    +關(guān)注

    關(guān)注

    785

    文章

    13945

    瀏覽量

    167100

原文標(biāo)題:從原理到c++代碼實(shí)現(xiàn) | 通過(guò)球面投影將點(diǎn)云轉(zhuǎn)換為Range圖像

文章出處:【微信號(hào):3D視覺(jué)工坊,微信公眾號(hào):3D視覺(jué)工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    通過(guò)異步獲取的圖像與LiDAR點(diǎn)對(duì)準(zhǔn)的方案

    實(shí)現(xiàn)圖像與其重建對(duì)象之間的精確2D-3D對(duì)應(yīng)關(guān)系對(duì)于準(zhǔn)確的圖像定位至關(guān)重要,一種有前景的方法涉及在圖像和激光雷達(dá)平面之間建立對(duì)應(yīng)關(guān)系,激光雷達(dá)平面可以被視為來(lái)自激光雷達(dá)
    發(fā)表于 12-12 14:46 ?877次閱讀

    如何二維數(shù)組轉(zhuǎn)換為圖像

    如何二維數(shù)組轉(zhuǎn)換為圖像
    發(fā)表于 03-10 11:15

    【創(chuàng)龍TMS320C665x申請(qǐng)】圖像中數(shù)字及字母的識(shí)別

    彩色信息,進(jìn)行灰度化;2.圖像灰度修正,通過(guò)點(diǎn)算法使輸入圖像轉(zhuǎn)換為每一灰度上都有項(xiàng)目糊涂的像素點(diǎn)的輸出
    發(fā)表于 03-04 09:38

    阿里SDK再升級(jí),宣布支持C++語(yǔ)言

    C++ 語(yǔ)言開(kāi)發(fā)者更加便捷地使用SDK調(diào)用產(chǎn)品API來(lái)操作產(chǎn)品,包括二次開(kāi)發(fā)、自動(dòng)化運(yùn)維的實(shí)現(xiàn)等。點(diǎn)此查看原文:http://click.aliyun.com/m/41955/日前,阿里
    發(fā)表于 02-08 13:48

    基于FPGA水平垂直投影(字符分割)法的實(shí)現(xiàn)

    列向x軸方向投影垂直投影是指二維圖象按行向y軸方向投影投影的結(jié)果可以看成是一維圖像.2 matlab實(shí)現(xiàn)
    發(fā)表于 08-07 10:15

    基于Verilog的垂直投影實(shí)現(xiàn)

    `基于Verilog的垂直投影實(shí)現(xiàn)微信公眾號(hào):FPGA自習(xí)室一、概述投影,在立體幾何中我們學(xué)到過(guò),是空間直線(xiàn)在某個(gè)方向上的投影,那么圖像處理
    發(fā)表于 03-03 17:51

    如何ADC代碼轉(zhuǎn)換為電壓

    討論如何為各種應(yīng)用執(zhí)行這一數(shù)學(xué)轉(zhuǎn)換。在第1篇文章中,我解釋如何ADC代碼轉(zhuǎn)換回相應(yīng)的電壓。
    發(fā)表于 07-23 04:45

    如何利用codermatlab中的程序轉(zhuǎn)換C/C++

    利用codermatlab中的程序轉(zhuǎn)換C/C++眾所周知,matlab的功能是非常強(qiáng)大的,簡(jiǎn)便易于操作的工具包更是非常的方便。為機(jī)器學(xué)習(xí),深度學(xué)習(xí),
    發(fā)表于 08-17 06:56

    如何在新版本中將C項(xiàng)目轉(zhuǎn)換為C++呢?

    我正在嘗試 C 項(xiàng)目轉(zhuǎn)換為 C++。在以前的版本中,屬性中有一個(gè)“轉(zhuǎn)換為 C++”選項(xiàng)。我在
    發(fā)表于 01-06 08:13

    ONNX模型轉(zhuǎn)換為中間表示(IR)后,精度下降了怎么解決?

    ONNX 模型轉(zhuǎn)換為 IR。 與使用 PyTorch 運(yùn)行 ONNX 模型相比,Ran IR 采用 基準(zhǔn) C++ 工具,其性能準(zhǔn)確率降低了 20%。 無(wú)法確定如何對(duì)圖像進(jìn)行預(yù)處理
    發(fā)表于 08-15 08:28

    人臉識(shí)別C/C++代碼

    人臉識(shí)別C/C++代碼 生物特征識(shí)別應(yīng)用于人臉,實(shí)際上是包含兩個(gè)方面:第一,圖像或視頻幀
    發(fā)表于 02-09 16:05 ?184次下載

    代碼轉(zhuǎn)換為電壓,如何可以實(shí)現(xiàn)?

    許多初步了解模數(shù)轉(zhuǎn)換器(ADC)的人想知道如何ADC代碼轉(zhuǎn)換為電壓?;蛘撸麄兊膯?wèn)題是針對(duì)特定應(yīng)用,例如:如何ADC
    的頭像 發(fā)表于 10-12 08:30 ?1.2w次閱讀
    <b class='flag-5'>將</b><b class='flag-5'>代碼</b><b class='flag-5'>轉(zhuǎn)換為</b>電壓,如何可以<b class='flag-5'>實(shí)現(xiàn)</b>?

    關(guān)于彩色圖像高斯反向投影基于OpenCV的C++代碼

    圖像反向投影的最終目的是獲取ROI然后實(shí)現(xiàn)對(duì)ROI區(qū)域的標(biāo)注、識(shí)別、測(cè)量等圖像處理與分析,是計(jì)算機(jī)視覺(jué)與人工智能的常見(jiàn)方法之一。圖像反向
    的頭像 發(fā)表于 05-31 10:31 ?1018次閱讀

    C++在Linux內(nèi)核開(kāi)發(fā)中爭(zhēng)議到成熟

    Linux 內(nèi)核郵件列表中一篇已有六年歷史的老帖近日再次引發(fā)激烈討論 —— 主題是建議 Linux 內(nèi)核的開(kāi)發(fā)語(yǔ)言 C 轉(zhuǎn)換為更現(xiàn)代的 C++
    的頭像 發(fā)表于 01-31 14:11 ?698次閱讀
    <b class='flag-5'>C++</b>在Linux內(nèi)核開(kāi)發(fā)中<b class='flag-5'>從</b>爭(zhēng)議到成熟

    OpenCV圖像識(shí)別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?2523次閱讀