目录
函数的官方解释
函数原型
void cv::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
)
函数作用是得到矫正的双目图像所需的变换矩阵和投影矩阵,然后可以传给 initUndistortRectifyMap 函数生成矫正图像到原始图像的像素坐标的映射,最后使用 remap 函数得到校正的双目图像。
上面说的校正的双目图像特点是:1. 双目相机的成像平面为同一平面;2. 左右目图像同一极线平行且极线上所有点的 y 坐标相等。
参数说明:
输入参数:
cameraMatrix1
:左目相机内参矩阵
distCoeffs1
:左目相机畸变参数
cameraMatrix2
:右目相机内参矩阵
distCoeffs2
:右目相机畸变参数
imageSize
:图像大小
R
:左目相机坐标系到右目相机坐标系的旋转变换,即 R r l R_{rl} Rrl
T
:左目相机坐标系到右目相机坐标系的平移变换,即 t r l t_{rl} trl
flags
:如果设置为 CALIB_ZERO_DISPARITY
,函数会将两个相机的 principal point 设成一样。否则就会平移图像最大化有用的图像区域。
alpha
:自由缩放参数。如果设置为 -1 或者不设置,函数执行默认缩放。否则参数应为 0-1 。0:矫正图像会放大和平移使得最终图像中只有有效像素;1:图像会缩小和平移使得原始图像中所有像素都可见。
newImageSize
:矫正后的图像分辨率。默认(0,0),设置为原始图像大小。设置为高的分辨率可以保持原始图像的更多细节,特别是畸变较大的时候。
validPixROI1
:一个最多地包含有效像素的长方形。(左目图像)
validPixROI2
:一个最多地包含有效像素的长方形。(右目图像)
输出参数:
R1
:矫正旋转矩阵。将第一个相机坐标系下未矫正的点变换到第一个相机矫正坐标系下,即 R_{左矫正坐标系}{左未矫正坐标系}
R2
:矫正旋转矩阵。将第二个相机坐标系下未矫正的点变换到第二个相机矫正坐标系下,即 R_{右矫正坐标系}{右未矫正坐标系}
P1
:3x4左相机投影矩阵。将左矫正坐标系下的点投影到左矫正坐标系图像平面坐标系。
P2
:3x4右相机投影矩阵。将左矫正坐标系下的点投影到右矫正坐标系图像平面坐标系。
Q
:4x4的视差深度映射矩阵。
对于水平双目相机(大部分的双目相机),其中 P1, P2, Q 定义如下:
P2 = [ f 0 c x 2 T x ⋅ f 0 f c y 0 0 0 1 0 ] , P2 = [ f 0 c x 2 T x ⋅ f 0 f c y 0 0 0 1 0 ] , Q = [ 1 0 0 − c x 1 0 1 0 − c y 0