【问题标题】:Convert between MATLAB stereoParameters and OpenCV stereoRectify stereo calibration在 MATLAB stereoParameters 和 OpenCV stereoRectify 立体校准之间转换
【发布时间】:2018-03-20 23:41:21
【问题描述】:

我希望将 MATLAB stereoParameters 结构转换为内在和外在矩阵,以便在 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)

来自其余 stereoParameters 的矩阵。

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

【问题讨论】:

  • 我在 stackoverflow.com/a/28317841 找到了 Q 的公式。
  • 我想做相反的事情,从 OpenCV 转换为 Matlab yml 文件。你找到转换了吗?在这一点上,任何事情都会有所帮助。

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


【解决方案1】:

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

和 OpenCV

这同样适用于摄像机之间的旋转矩阵和平移向量:stereoParams.RotationOfCamera2stereoParams.TranslationOfCamera2 需要进行转置,以获得 OpenCV 的 R 矩阵和 T 向量。

(快速验证:如果相机几乎平行,R 应该接近单位矩阵,并且 T 的第一个元素应该与相机之间的基线相匹配,以毫米为单位。)

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的立体匹配器得到的视差值需要除以16cv2.reprojectImageTo3D返回的3d点云中的坐标需要除以 64 得到度量值

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

【讨论】:

  • 谢谢您,但是您能否详细说明此评论的除以 16 和除以 64 的元素?这是我唯一不明白的部分。谢谢!
  • 我认为您的答案中应该颠倒切向和径向的顺序。检查this
  • @RakshitKothari 你是什么意思?函数参数中的顺序是R,T,和上面一样吗?
  • OpenCV的畸变系数向量由MATLAB的两个切向畸变系数后跟两个径向畸变系数组成。我认为您需要将该语句反转为两个径向系数,然后是两个切向系数。
  • 抱歉评论这个答案,但我尝试了你的答案,除了失真系数之外它工作得很好。 @RakshitKothari 说的是对的,失真向量 OpenCV 由两个径向系数开始,然后是两个切向系数。您可能想编辑该部分,以便像我这样的未来读者不会犯错误
【解决方案2】:

在给定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 天时间弄清楚为什么我的整改不起作用)

【讨论】:

    【解决方案3】:

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

    Tx 来自矩阵 T。cx、cy 和 cx' 来自相机矩阵。 f 是它们的 x 和 y 焦距的合理组合。

    仍然不知道如何获得 P1、P2、R1 和 R2。有人吗?

    【讨论】:

    • 合理组合是什么意思?
    • @kevinkayaks:例如,(fx + fy) / 2。你能推荐一个更好的方法来获得 f 吗?
    • 我也不确定。如果您了解更多信息,我对有关从 matlab 到 cv2 校准的更多信息非常感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2013-10-12
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2014-07-30
    相关资源
    最近更新 更多