1. 程式人生 > 實用技巧 >視覺SLAM十四講第五講

視覺SLAM十四講第五講

第五章 相機與影象

主要目標

  1. 理解針孔相機的模型、內參與徑向畸變引數。
  2. 理解一個空間點是如何投影到相機成像平面的。
  3. 掌握 OpenCV 的影象儲存與表達方式。
  4. 學會基本的攝像頭標定方法。
    在計算機中,一張照片由很多個畫素組成,每個畫素記錄了色彩或亮度的資訊。三維世界中的一個物體反射或發出的光線,穿過相機光心後,投影在相機的成像平面上。相機的感光器件接收到光線後,產生測量值,就得到了畫素,形成了我們見到的照片。
    一、相機模型
    1)針孔相機模型
    針孔相機模型
    設 O-x-y-z 為相機座標系,習慣上我們讓z 軸指向相機前方,x 向右,y 向下(此圖我們應該站在左側看右側)。O 為攝像機的光心,也是針孔模型中的針孔。現實世界的空間點 P,經過小孔 O 投影之後,落在物理成像平面 O′ - x′ -y′ 上,成像點為 P′。設 P 的座標為 [X, Y, Z]T,P′ 為 [X′, Y ′, Z′]T,並且設物理成像平面到小孔的距離為f(焦距)。那麼,根據三角形相似關係,有:
    在這裡插入圖片描述
    其中負號表示成的像是倒立的。不過,實際相機得到的影象並不是倒像(否則相機的使用會非常不方便)。為了讓模型更符合實際,我們可以等價地把成像平面對稱地放到相機前方,和三維空間點一起放在攝像機座標系的同一側,這樣做可以把公式中的負號去掉,使式子更加簡潔:
    在這裡插入圖片描述
    把 X′, Y ′ 放到等式左側,整理得:
    在這裡插入圖片描述
    為了描述感測器將感受到的光線轉換成影象畫素的過程,我們設在物理成像平面上固定著一個畫素平面 o-u-v。我們在畫素平面得到了 P′ 的畫素座標:[u, v]T。
    畫素座標系通常的定義方式是:原點 o′ 位於影象的左上角,u 軸向右與 x 軸平行,v 軸向下與 y 軸平行。畫素座標系與成像平面之間,相差了一個縮放和一個原點的平移。我們設畫素座標在u 軸上縮放了 α 倍,在 v 上縮放了 β 倍。同時,原點平移了 [cx, cy]T。那麼,P′ 的座標與畫素座標[u, v]T 的關係為:
    在這裡插入圖片描述
    把 αf 合併成 fx,把 βf 合併成 fy,得:
    在這裡插入圖片描述
    其中,f 的單位為米,α, β 的單位為畫素/米,所以 fx, fy 和 cx, cy 的單位為畫素。
    在這裡插入圖片描述
    我們把中間的量組成的矩陣稱為相機的內參數矩陣(Camera Intrinsics)K。通常認為,相機的內參在出廠之後是固定的,不會在使用過程中發生變化。
    由於相機在運動,所以 P 的相機座標應該是它的世界座標(記為 Pw)根據相機的當前位姿變換到相機座標系下的結果。相機的位姿由它的旋轉矩陣 R 和平移向量 t 來描述。那麼有:
    在這裡插入圖片描述
    它描述了 P 的世界座標到畫素座標的投影關係。其中,相機的位姿 R, t 又稱為相機的外引數(Camera Extrinsics)。相比於不變的內參,外參會隨著相機運動發生改變,同時也是 SLAM 中待估計的目標,代表著機器人的軌跡。
    我們可以把一個世界座標點先轉換到相機座標系,再除掉它最後一維的數值(即該點距離相機成像平面的深度),這相當於把最後一維進行歸一化處理,得到點 P 在相機歸一化平面上的投影:
    在這裡插入圖片描述
    歸一化座標可看成相機前方z = 1 處的平面上的一個點,這個 z = 1 平面也稱為歸一化平面。歸一化座標再左乘內參就得到了畫素座標,所以我們可以把畫素座標 [u, v]T 看成對歸一化平面上的點進行量化測量的結果。
    2)畸變
    由透鏡形狀引起的畸變(Distortion,也叫失真)稱為徑向畸變。它們主要分為兩大類:桶形畸變和枕形畸變。
    除了透鏡的形狀會引入徑向畸變外,在相機的組裝過程中由於不能使透鏡和成像面嚴格平行也會引入切向畸變。
    3)單目相機成像過程
    1.首先,世界座標系下有一個固定的點 P,世界座標為 Pw。
    2.由於相機在運動,它的運動由 R, t 或變換矩陣 T ∈ SE(3) 描述。P 的相機座標為 P˜c =RPw + t。
    3.這時的 P˜c 的分量為 X, Y, Z,把它們投影到歸一化平面 Z = 1 上,得到 P 的歸一化座標:Pc = [X/Z, Y /Z, 1]T。
    4.有畸變時,根據畸變引數計算 Pc 發生畸變後的座標。
    5.最後,P 的歸一化座標經過內參後,對應到它的畫素座標:Puv = KPc。
    4)雙目相機模型
    通過同步採集左右相機的影象,計算影象間視差,來估計每一個畫素的深度。
    雙目相機一般由左眼相機和右眼相機兩個水平放置的相機組成。它們是水平放置的,意味著兩個相機的光圈中心都位於 x 軸上。兩者之間的距離稱為雙目相機的基線(Baseline,記作 b),是雙目相機的重要引數。
    雙目相機
    現在,考慮一個空間點 P,它在左眼相機和右眼相機各成一像,記作 PL, PR。由於相機基線的存在,這兩個成像位置是不同的。理想情況下,由於左右相機只在 x 軸上有位移,因此 P 的像也只
    在 x 軸(對應影象的 u 軸)上有差異。記它的左側座標為 uL,右側座標為 uR,根據 △P PLPR 和 △P OLOR 的相似關係,有:
    在這裡插入圖片描述
    稍加整理,得:
    在這裡插入圖片描述
    其中 d 定義為左右圖的橫座標之差,稱為視差(Disparity)。根據視差,我們可以估計一個畫素與相機之間的距離。視差與距離成反比:視差越大,距離越近。
    5)RGB-D 相機模型
    目前的 RGB-D 相機按原理可分為兩大類:
    1.通過紅外結構光(Structured Light)來測量畫素距離的。例子有 Kinect 1 代、Project Tango 1代、Intel RealSense 等。
    2 通過飛行時間法(Time-of-flight,ToF)原理測量畫素距離的。例子有 Kinect 2 代和一些現有的 ToF 感測器等。
    RGB-D 相機能夠實時地測量每個畫素點的距離。但是,由於這種發射 − 接收的測量方式,其使用範圍比較受限。用紅外光進行深度值測量的 RGB-D 相機,容易受到日光或其他感測器發射的紅外光干擾,因此不能在室外使用。在沒有調製的情況下,同時使用多個 RGB-D 相機時也會相互干擾。對於透射材質的物體,因為接收不到反射光,所以無法測量這些點的位置。此外,RGB-D 相機在成本、功耗方面,都有一些劣勢。
    二、影象
    在一張灰度圖中,每個畫素位置 (x, y) 對應一個灰度值 I,所以,一張寬度為 w、高度為 h 的影象,數學上可以記為一個函式:
    在這裡插入圖片描述
    其中 (x, y) 是畫素的座標。然而,計算機並不能表達實數空間,所以我們需要對下標和影象讀數在某個範圍內進行量化。
    在這裡插入圖片描述
    三、實踐:計算機中的影象
    1)OpenCV 的基礎使用方法
    從 http://opencv.org/downloads.html 下載,選擇 OpenCV for Linux 版本即可。獲得壓縮包。將它解壓到任意目錄下,可以發現 OpenCV 亦是一個 cmake 工程。
    安裝依賴項
    sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
    隨後的編譯安裝和普通的 cmake 工程一樣,請在 make 之後,呼叫 sudo make install 將 OpenCV安裝到你的機器上(而不是僅僅編譯它)。
    參考:https://www.cnblogs.com/Shuqing-cxw/p/9195303.html