適合初學者的SLAM實踐教程(1):相機模型-如何從照片中重建出像素點的三維坐標?


推薦開源項目:簡單的SLAM與機器人教程與編程實踐-github

三維重建到底是怎么回事?已知什么數據?待求解哪些變量?

看下面這張圖,一圖解釋如何根據照片進行三維重建。首先,三維重建就是根據把照片的像素點對應現實世界中某個點在相機坐標系下的三維坐標計算出來。一般我們可以通過深度相機或者雙目視覺等方式獲取目標物體離相機坐標系原點的距離 Z r e a l Z_{real} ,這里的相機坐標系的原點就是相機的焦點
所以現在我們已經知道了的數據有:“像素點A在照片坐標系中的位置 ( x i m g , y i m g ) (x_{img},y_{img}) ”、“照片離相機坐標原點的距離,即焦距 f f ”、“像素點A對應現實世界中那個點離相機的距離 z r e a l z_{real} ”。
我們需要根據上面這些信息求出:現實世界那個點在相機坐標系下的三維坐標 ( x r e a l , y r e a l , z r e a l ) (x_{real},y_{real},z_{real}) 。所以現在待求解的未知量 x r e a l x_{real} y r e a l y_{real}

在這里插入圖片描述

如何根據像素點的位置,和真實物體離相機的距離來還原真實物體在相機坐標系中的坐標?

從上圖很容易看出來我們可以利用相似三角形來根據 f , z r e a l , x i m g , y i m g f,z_{real},x_{img},y_{img} 這些已知量,來求 x r e a l x_{real} y r e a l y_{real}
根據相似三角形我們知道這幾條邊的放縮比例是相等的,即有: z r e a l f = x r e a l x i m g = y r e a l y i m g \frac{z_{real}}{f}=\frac{x_{real}}{x_{img}}=\frac{y_{real}}{y_{img}}
所以可以得到:
x r e a l = z r e a l f × x i m g y r e a l = z r e a l f × y i m g x_{real}=\frac{z_{real}}{f}\times x_{img} \\ y_{real}=\frac{z_{real}}{f}\times y_{img}
x i m g , y i m g x_{img},y_{img} 是可以根據像素算出來, z r e a l z_{real} 要么可以用雷達或者紅外或者雙目視覺計算出。所以我們已經計算出照片中位於 ( x i m g , y i m g ) (x_{img},y_{img}) 這個點的相對於相機坐標系下的三維坐標 ( x r e a l , y r e a l , z r e a l ) (x_{real},y_{real},z_{real}) 了。

練習:從實例中學習如何根據照片進行三維重建

舉個例子:
現在已知一個照片的某個像素坐標為(1mm,3mm),焦距為15mm, 並且通過傳感器測量到該像素對應的現實世界中的那個點A離相機焦點的距離是30cm。現在想求A點相對於相機坐標系下的的坐標。(注意本例子中的坐標系如下圖所示)
在這里插入圖片描述
現在已知角距 f = 15 f=15 毫米。照片中A對應的那個像素點的坐標為(1,3)單位是毫米。真實世界中A點離相機坐標系原點距離為 z r e a l = 300 z_{real}=300 毫米。
所以有A點相對於相機坐標系中的另外兩個維度的坐標
x r e a l = = z r e a l f × x i m g = 20 × 1 = 20 y r e a l = z r e a l f × y i m g = 20 × 3 = 60 x_{real}==\frac{z_{real}}{f}\times x_{img} =20\times1=20\\ y_{real}=\frac{z_{real}}{f}\times y_{img}=20\times3=60
所以我們就講照片中的一個像素點還原成三維坐標 ( 20 , 60 , 300 ) (20,60,300) 了,單位是毫米。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM