我希望将MATLAB stereParameters结构转换为内在函数和外在函数矩阵,以便在OpenCV的stereoRectify中使用。
如果我理解http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html和http://mathworks.com/help/vision/ref/stereoparameters-class.html,则stereoParameters.CameraParameters1和stereoParameters.CameraParameters2存储内在矩阵,而stereoParameters的其他成员则存储外部矩阵。
我想我有这个映射
内在函数:
外部参数:
到目前为止,这是正确的吗?
不过,我看不出怎么弄
其他立体参数的矩阵。
我可以使用现有的转换器,如果没有,那么公式是什么?
答案 0 :(得分:1)
正如您已经发现的那样,由于MATLAB中的符号不同,相机矩阵需要转置
和OpenCV
同样适用于相机之间的旋转矩阵和平移向量:stereoParams.RotationOfCamera2
和stereoParams.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矩阵的公式:
Tx来自矩阵T. cx,cy和cx&#39;来自相机矩阵。 f是x和y焦距的合理组合。
仍然不知道如何获得P1,P2,R1和R2。任何人