日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视觉SLAM十四讲学习笔记-第五讲-图像和实践

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视觉SLAM十四讲学习笔记-第五讲-图像和实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?專欄系列文章如下:

?視覺SLAM十四講學(xué)習(xí)筆記-第一講_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第二講-初識SLAM_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第二講-開發(fā)環(huán)境搭建_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第三講-旋轉(zhuǎn)矩陣和Eigen庫_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第三講-旋轉(zhuǎn)向量、歐拉角、四元數(shù)_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第三講-相似、仿射、射影變換和eigen程序、可視化演示_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第四講-李群與李代數(shù)基礎(chǔ)和定義、指數(shù)和對數(shù)映射_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第四講-李代數(shù)求導(dǎo)與擾動模型_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第四講-Sophus實踐、相似變換群與李代數(shù)_goldqiu的博客-CSDN博客

視覺SLAM十四講學(xué)習(xí)筆記-第五講-相機(jī)模型_goldqiu的博客-CSDN博客

5.2 圖像

相機(jī)把三維世界中的信息轉(zhuǎn)換成了一張由像素組成的照片,存儲在計算機(jī)中,作為后續(xù)處理的數(shù)據(jù)來源。在數(shù)學(xué)中,圖像可以用一個矩陣來描述;而在計算機(jī)中,它們占據(jù)一段連續(xù)的磁盤或內(nèi)存空間,可以用二維數(shù)組來表示。

最簡單的圖像——灰度圖:每個像素位置 (x,y) 對應(yīng)一個灰度值?I,一張寬度為?w、高度為?h?的圖像,數(shù)學(xué)上可以記為一個函數(shù):

其中 (x,y) 是像素的坐標(biāo)。然而,計算機(jī)并不能表達(dá)實數(shù)空間,所以需要對下標(biāo)和圖像讀數(shù)在某個范圍內(nèi)進(jìn)行量化(類似于模擬到數(shù)字的概念)。在常見的灰度圖中,用 0~255 的整數(shù)(一個 unsigned char或1 個字節(jié))來表達(dá)圖像的灰度讀數(shù)。那么,一張寬度為 640 像素、高度為 480 像素分辨率的灰度圖就可以表示為:

unsigned char image[480][640] //二維數(shù)組表達(dá)圖像

在程序中,圖像以二維數(shù)組形式存儲。它的第一個下標(biāo)是指數(shù)組的行,而第二個下標(biāo)則是列。在圖像中,數(shù)組的行數(shù)對應(yīng)圖像的高度,而列數(shù)對應(yīng)圖像的寬度。

當(dāng)訪問某一個像素時,需要指明它所處的坐標(biāo)。像素坐標(biāo)系原點位于圖像的左上角,X?軸向右,Y?軸向下(也就是u,v* 坐標(biāo))。如果還有第三個軸—Z?軸,根據(jù)右手法則,Z?軸向前。這種定義方式是與相機(jī)坐標(biāo)系一致的。圖像的寬度或列數(shù),對應(yīng)著?X?軸;而圖像的行數(shù)或高度,則對應(yīng)著它的?Y?軸。

根據(jù)這種定義方式,訪問一個位于?x,y?處的像素,那么在程序中應(yīng)該是:

unsigned char pixel = image[y][x]; //訪問圖像像素

它對應(yīng)著灰度值?I(x,y) 的讀數(shù)。

在 RGB-D 相機(jī)的深度圖中,記錄了各個像素與相機(jī)之間的距離。這個距離通常是以毫米為單位,而 RGB-D 相機(jī)的量程通常在十幾米左右,超過了 255。這時會采用 16 位整數(shù)(unsigned short)來記錄深度圖的信息,也就是位于 0~65535 的值。換算成米的話,最大可以表示 65 米,足夠 RGB-D 相機(jī)使用。

彩色圖像的表示則需要通道(channel)的概念。在計算機(jī)中,用紅色、綠色和藍(lán)色這三種顏色的組合來表達(dá)任意一種色彩。于是對于每一個像素,就要記錄其 R、G、B 三個數(shù)值,每一個數(shù)值就稱為一個通道。最常見的彩色圖像有三個通道,每個通道都由 8 位整數(shù)表示。在這種規(guī)定下,一個像素占據(jù) 24 位空間。通道的數(shù)量、順序都是可以自由定義的。在 OpenCV 的彩色圖像中,通道的默認(rèn)順序是 B、G、R。也就是說,當(dāng)?shù)玫揭粋€ 24 位的像素時,前 8 位表示藍(lán)色數(shù)值,中間 8 位為綠色,最后 8 位為紅色。如果還想表達(dá)圖像的透明度,就使用 R、G、B、A 四個通道。

5.3 實踐:計算機(jī)中的圖像

5.3.1 OpenCV 的基礎(chǔ)使用方法

安裝 OpenCV,網(wǎng)站:

Home - OpenCV?opencv.org/正在上傳…重新上傳取消?

OpenCV提供了大量的開源圖像算法,是計算機(jī)視覺中使用極廣的圖像處理算法庫。

在Ubuntu下,有兩種安裝方式:

  • 從源代碼安裝,指從OpenCV網(wǎng)站下載所有的OpenCV源代碼,并在機(jī)器上編譯安裝,以便使用。好處是可以選擇的版本比較豐富,而且能看到源代碼,不過需要編譯。還可以調(diào)整一些編譯選項,匹配編程環(huán)境(例如,需不需要GPU加速等),還可以使用一些額外的功能。 源代碼安裝OpenCV 目前維護(hù)了兩個主要版本,分為 OpenCV2.4系列和 OpenCV3系列。
  • 只安裝庫文件,指通過Ubuntu來安裝由Ubuntu社區(qū)人員已經(jīng)編譯好的庫文件,這樣無須編譯。
  • 源代碼安裝,安裝依賴項:

    sudo apt?get install build?essential libgtk2.0?dev libvtk5?dev libjpeg?dev libtiff4?dev libjasper?dev libopenexr?dev libtbb?dev

    OpenCV 的依賴項很多,缺少某些編譯項會影響它的部分功能,但可能不會用上。OpenCV 會在 cmake 階段檢查依賴項是否會安裝,并調(diào)整自己的功能。如果電腦上有GPU并且安裝了相關(guān)依賴項,OpenCV也會把GPU加速打開。

    安裝:

    cmake .. make -j8 sudo make install

    安裝后,OpenCV 默認(rèn)存儲在/usr/local 目錄下

    操作 OpenCV 圖像

    slambook/ch5/imageBasics/imageBasics.cpp

    在該例程中操作有:圖像讀取、顯示、像素遍歷、復(fù)制、賦值等。編譯該程序時,需要在CMakeLists.txt中添加 OpenCV的頭文件,然后把程序鏈接到庫文件上,還使用了C++11標(biāo)準(zhǔn)(如 nullptr 和 chrono)。

    編譯運(yùn)行:

    報錯:

    CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數(shù)‘fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler>::char_type const* fmt::v7::detail::parse_format_specs<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler> >(fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler>&)’中: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_21compile_parse_contextIcNS1_13error_handlerEEEEEPKNT0_9char_typeERSB_[_ZN3fmt2v76detail18parse_format_specsIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_21compile_parse_contextIcNS1_13error_handlerEEEEEPKNT0_9char_typeERSB_]+0x247):對‘fmt::v7::detail::error_handler::on_error(char const*)’未定義的引用

    需要將之前安裝的fmt庫鏈接joinMap.cpp,rgbd文件夾中的cmakelists如下:

    find_package(Sophus REQUIRED) include_directories(${Sophus_INCLUDE_DIRS}) find_package(Pangolin REQUIRED) find_package(FMT REQUIRED) add_executable(joinMap joinMap.cpp) target_link_libraries(joinMap fmt::fmt ${OpenCV_LIBS} ${Pangolin_LIBRARIES})

    在圖像中,鼠標(biāo)點擊圖像中的每個點都能在左下角得到UV坐標(biāo)值和RGB三通道值。

    函數(shù)解析如下:

  • cv::imread:函數(shù)讀取圖像,并把圖像和基本信息顯示出來。
  • OpenCV 提供了迭代器,可以通過迭代器遍歷圖像的像素。cv::Mat::data 提供了指向圖像數(shù)據(jù)開頭的指針,可以直接通過該指針自行計算偏移量,然后得到像素的實際內(nèi)存位置。
  • 復(fù)制圖像中直接賦值是淺拷貝,并不會拷貝數(shù)據(jù),而clone方法是深拷貝,會拷貝數(shù)據(jù),這在圖像存取中會經(jīng)常用到。
  • 在編程過程中碰到圖像的旋轉(zhuǎn)、插值等操作,自行查閱函數(shù)對應(yīng)的文檔,以了解它們的原理與使用方式。
  • 注:1. cv::Mat 亦是矩陣類,除了表示圖像之外,我們也可以用它來存儲位姿等矩陣數(shù)據(jù),但一般還是使用eigen,更快一些。

  • cmake默認(rèn)編譯的是debug模式,如果使用release模式會快很多。
  • 5.3.2 圖像去畸變

    OpenCV 提供了去畸變函數(shù) cv::Undistort(),這個例程從公式出發(fā)計算了畸變前后的圖像坐標(biāo)(代碼中有內(nèi)參數(shù)據(jù))。

    slambook/ch5/imageBasics/undistortImage.cpp

    運(yùn)行如下:

    可以看到去畸變前后圖像差別還是蠻大的。

    5.4 實踐:3D 視覺

    5.4.1 雙目視覺

    在stereo文件夾中,有左右目的圖像和對應(yīng)代碼。其中代碼計算圖像對應(yīng)的視差圖,然后再計算各像素在相機(jī)坐標(biāo)系下的坐標(biāo),它們共同構(gòu)成點云。

    slambook/ch5/stereoVision/stereoVision.cpp

    運(yùn)行如下:(比較大的圖片是視差圖)

    例程中調(diào)用了OpenCV實現(xiàn)的SGBM算法(Semi-global Batch Matching)[26] H. Hirschmuller, “Stereo processing by semiglobal matching and mutual information,” IEEE Transactions on pattern analysis and machine intelligence, vol. 30, no. 2, pp. 328–341, 2008.

    計算左右圖像的視差,然后通過雙目相機(jī)的幾何模型把它變換到相機(jī)的3D空間中。SGBM 使用了來自網(wǎng)絡(luò)的經(jīng)典參數(shù)配置,主要調(diào)整了最大和最小視差。視差數(shù)據(jù)結(jié)合相機(jī)的內(nèi)參、基線,即能確定各點在三維空間中的位置。感興趣可以閱讀相關(guān)的參考文獻(xiàn)[27, 28]。

    [27] D. Scharstein and R. Szeliski, “A taxonomy and evaluation of dense two-frame stereo correspondence algorithms,” International journal of computer vision, vol. 47, no. 1-3, pp. 7–42, 2002.

    [28] S. M. Seitz, B. Curless, J. Diebel, D. Scharstein, and R. Szeliski, “A comparison and evaluation of multi-view stereo reconstruction algorithms,” in null, pp. 519–528, IEEE, 2006.

    5.4.2 RGB-D 視覺

    RGB-D相機(jī)能通過物理方法獲得像素深度信息。如果已知相機(jī)的內(nèi)外參,可以計算任何一個像素在世界坐標(biāo)系下的位置,從而建立一張點云地圖。

    位于 slambook/ch5/rgbd 文件夾中有5對圖像。在 color/下有 1.png 到 5.png 共 5 張 RGB 圖,而在 depth/下有 5 張對應(yīng)的深度圖。同時,pose.txt 文件給出了5張圖像的相機(jī)外參位姿。位姿記錄的形式為平移向量加旋轉(zhuǎn)四元數(shù): [x, y, z, qx, qy, qz, qw], 其中 qw 是四元數(shù)的實部。

    這一段程序,完成了兩件事:(1). 根據(jù)內(nèi)參計算一對 RGB-D圖像對應(yīng)的點云;(2). 根據(jù)各張圖的相機(jī)位姿(也就是外參),把點云加起來,組成地圖。

    slambook/ch5/rgbd/jointMap.cpp

    運(yùn)行程序如下:

    習(xí)題

  • 尋找一部相機(jī),標(biāo)定它的內(nèi)參。可能會用到標(biāo)定板, 或者棋盤格。
  • 相機(jī)內(nèi)參的物理意義。如果一部相機(jī)的分辨率變?yōu)樵瓉淼膬杀抖渌胤讲蛔?#xff0c;它的內(nèi)參如何變化?
  • 搜索特殊相機(jī)(魚眼或全景相機(jī))的標(biāo)定方法。它們與普通的針孔模型有何不同?
  • 調(diào)研全局快門相機(jī)(global shutter)和卷簾快門相機(jī)(rolling shutter)的異同。它們在SLAM中有何優(yōu)缺點?
  • RGB-D 相機(jī)是如何標(biāo)定的?以 Kinect 為例,需要標(biāo)定哪些參數(shù)?(參照https://github.com/code-iai/iai_kinect2)
  • 除了示例程序演示的遍歷圖像的方式,還能舉出哪些遍歷圖像的方法?
  • 閱讀 OpenCV 官方教程,學(xué)習(xí)它的基本用法。
  • 習(xí)題有代碼學(xué)習(xí)和工程應(yīng)用的知識,后面實際開發(fā)中會很有幫助。

    總結(jié)

    以上是生活随笔為你收集整理的视觉SLAM十四讲学习笔记-第五讲-图像和实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。