赞
踩
通过内参矩阵
z
(
u
v
1
)
=
K
(
X
Y
Z
)
z
其中
K
K
K为内参矩阵,
(
X
,
Y
,
Z
)
T
(X, Y, Z)^T
(X,Y,Z)T为相机坐标系下的点,
(
u
,
v
,
1
)
T
(u,v,1)^T
(u,v,1)T为像素坐标系下的点。
z
z
z为深度。
反过来:
Z
=
z
Z = z
Z=z
Y
=
(
v
−
c
y
)
Z
f
y
Y = \frac{(v-c_y)Z}{f_y}
Y=fy(v−cy)Z
X
=
(
u
−
c
x
)
Z
f
x
X = \frac{(u-c_x)Z}{f_x}
X=fx(u−cx)Z
如果是双目,深度可以由以下公式求出:
z
=
f
b
d
z = \frac{fb}{d}
z=dfb
像素坐标系到相机坐标系的转换也可以通过Q矩阵得到
由Q矩阵转换到相机坐标系
Q
[
u
v
d
1
]
=
[
X
Y
Z
W
]
Q
最终将到的向量
(
X
,
Y
,
Z
,
W
)
T
(X, Y, Z, W)^T
(X,Y,Z,W)T 用
W
W
W归一化就得到三维的点。
opecv中可以直接调用reprojectImageTo3D函数:
void reprojectImageTo3D(InputArray disparity,
OutputArray _3dImage,
InputArray Q,
bool handleMissingValues=false,
int ddepth=-1 )
void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2, InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T, OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha=-1, Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )
解释一下,对于双目相机,由左相机到右相机有一个旋转
R
R
R和一个平移
t
t
t,OpenCv标定后的坐相机坐标系中,左相机和右相机各自旋转一半使得内参一致。这样在rectify的时候就可以使用同一套内参参数。
Rectify生成remap矩阵的过程如下(针对左摄像头):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。