在MATLAB stereoParameters和OpenCV stereoRectify立体声校准之间进行转换

时间:2017-10-09 17:29:00

标签: matlab opencv camera-calibration stereo-3d stereoscopy

我希望将MATLAB stereParameters结构转换为内在函数和外在函数矩阵,以便在OpenCV的stereoRectify中使用。

如果我理解http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.htmlhttp://mathworks.com/help/vision/ref/stereoparameters-class.html,则stereoParameters.CameraParameters1和stereoParameters.CameraParameters2存储内在矩阵,而stereoParameters的其他成员则存储外部矩阵。

我想我有这个映射

内在函数:

  • cameraMatrix1 = stereoParameters.CameraParameters1.IntrinsicMatrix'
  • cameraMatrix2 = stereoParameters.CameraParameters2.IntrinsicMatrix'
  • distCoeffs1 = [stereoParameters.CameraParameters1.RadialDistortion(1:2),stereoParameters.CameraParameters1.TangentialDistortion,stereoParameters.CameraParameters1.RadialDistortion(3)]
  • distCoeffs2 = [stereoParameters.CameraParameters2.RadialDistortion(1:2),stereoParameters.CameraParameters2.TangentialDistortion,stereoParameters.CameraParameters2.RadialDistortion(3)]

外部参数:

  • R = stereoParameters.RotationOfCamera2'
  • T = stereoParameters.TranslationOfCamera2'

到目前为止,这是正确的吗?

不过,我看不出怎么弄

  • R1(3x3)
  • R2(3x3)
  • P1(3x4)
  • P2(3x4)
  • Q(4x4)

其他立体参数的矩阵。

我可以使用现有的转换器,如果没有,那么公式是什么?

3 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,由于MATLAB中的符号不​​同,相机矩阵需要转置

MATLAB Camera Intrinsic Matrix

和OpenCV

OpenCV Camera Intrinsic Matrix

同样适用于相机之间的旋转矩阵和平移向量:stereoParams.RotationOfCamera2stereoParams.TranslationOfCamera2需要转置才能获得OpenCV&#39; s < strong> R 矩阵和 T 向量。

(快速验证:如果摄像机几乎平行且R的第一个元素应与摄像机之间的基线匹配,则R应接近单位矩阵。)

OpenCV的失真系数向量由MATLAB的两个切向失真系数组成,后跟两个径向失真系数。

那就是说,我能够使用(R1, R2, P1, P2, Q, leftROI, rightROI) = cv2.stereoRectify(leftCamMatrix, leftDistCoeffs, rightCamMatrix, rightDistCoeffs, imageSize, R, T, None, None, None, None, None, cv2.CALIB_ZERO_DISPARITY, 0)计算正确的R1,R2,P1,P2和Q

请注意,出于数据类型的原因,使用OpenCV的立体匹配器获得的视差值需要除以16 ,并且cv2.reprojectImageTo3D返回3d点云中的坐标需要除以64才能获得指标值

(快速验证:当在整理的左右图像中抓取同一物体的坐标时,y坐标应该几乎相等,你应该能够以f * B /(x_right)计算物体距离(以米为单位) -x_left)/ 1000,其中f是Q和B中虚拟摄像机的组合焦距,以毫米为单位的基线。)

答案 1 :(得分:1)

在给定cameraMatrix1,cameraMatrix2,distCoeffs1,distCoeffs2,R和T的情况下,您可以在OpenCV中使用stereoRectify函数来获取R1,R2,P1,P2,Q。

在C ++中应该是

cv::Mat R1, R2, P1, P2, Q; cv::Rect validRoi[2]; cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imSize, R, T, R1, R2, P1, P2, Q, CV_CALIB_ZERO_DISPARITY, 0, imSize, &validRoi[0], &validRoi[1]);

要注意的一件事是,从其MATLAB副本中复制矩阵cameraMatrix1,cameraMatrix2和R时,需​​要对其进行转置。

(我将其用黑体表示,因为花了两天时间才能弄清为什么我将其从MATLAB转换为C ++ OpenCV时,整流无法正常工作)

答案 2 :(得分:0)

https://stackoverflow.com/a/28317841给出了Q矩阵的公式:

Q formula

Tx来自矩阵T. cx,cy和cx&#39;来自相机矩阵。 f是x和y焦距的合理组合。

仍然不知道如何获得P1,P2,R1和R2。任何人