世界座標系、相機座標系、影象座標系、畫素座標系之間的轉換公式參考:世界座標系、相機座標系、影象座標系、畫素座標系之間的轉換
其中影象座標到世界座標的轉化公式作者講解的也比較清楚,但是對於zc的值,作者並沒有給出進一步講解
上述公式可以簡寫為:
進一步:
其中 r,k,t均為已知值。將上述等式中的變數做以下改寫,方便描述:
只觀察世界座標計算公式中等式兩邊的第三項,則:
其中,mat2(2,0)表示3×1矩陣的第三項。如果目標物體在地面則zw=0;如果目標物體有一定高度,則zw=實際物體高度,求出zc後即可根據畫素座標求得世界座標。
def 2dto3dpts(point2d, rvec, tvec, cameramat, height)
:"""
function used to convert given 2d points back to real-world 3d points
point2d : an array of 2d points
rvec : rotation vector
tvec : translation vector
cameramat: camera matrix used in solvepnp
height : height in real-world 3d space
return : output_array: output array of 3d points
"""point3d =
point2d =
(np.array(point2d, dtype=
'float32'))
.reshape(-1
,2) numpts = point2d.shape[0]
point2d_op = np.hstack(
(point2d, np.ones(
(numpts,1)
))) rmat = cv2.rodrigues(rvec)[0
] rmat_inv = np.linalg.inv(rmat)
kmat_inv = np.linalg.inv(cameramat)
for point in
range
(numpts)
: uvpoint = point2d_op[point,:]
.reshape(3,
1)tempmat = np.matmul(rmat_inv, kmat_inv)
tempmat1 = np.matmul(tempmat, uvpoint)
tempmat2 = np.matmul(rmat_inv, tvec)
s =(height + tempmat2[2]
)/ tempmat1[2]
p = tempmat1 * s - tempmat2
point3d =
(np.array(point3d, dtype=
'float32'))
.reshape([-
1,1,
3])return point3d
SLAM學習筆記 世界座標系到相機座標系的變換
其中,zc表示單目相機的尺度不確定性 單目相機無法確定尺度,所以orb slam等最後都對單目做了sim3優化 等號右邊第 一 二個矩陣經常乘在一起作為相機內參,其中dx dy是像面上每個畫素點在x軸y軸上的尺寸,u0和v0用來把影象座標原點從影象中心挪到左上角,f表示焦距。r t 也叫相機外參,是...
osg 相機座標系
先看這個例子 include include include include int main int argc,char argv return 0 1 程式執行結果 將相機設定到世界座標系 0,0,12 的位置,向下看牛。同時,牛繞著x軸自傳。2 解說 相機座標系,和opengl的相機座標系一致...
多相機座標轉換 相機標定及座標系變換
slam系統需要多種感測器支援,通常市場上常見的就是camera感測器,例如單目攝像頭,雙目攝像頭,rgb d相機等等。不論是深度相機,紅外相機,還是rgb相機,都是需要標定的,每乙個相機的內參都是固定的,相機標定也是產品落地必須做的乙個工程化步驟。多個相機需要對每個相機分別標定。相機矯正上,比較常...