2

我想扭曲和纠正我的立体图像。为此,我在 Python 2.7 中使用了 Opencv 3.3。我使用的代码是:

import cv2
import numpy as np

cameraMatrixL = np.load('mtx_left.npy')
distCoeffsL = np.load('dist_left.npy')
cameraMatrixR = np.load('mtx_right.npy')
distCoeffsR = np.load('dist_right.npy')
R = np.load('R.npy')
T = np.load('T.npy')

imgleft = cv2.imread('D:\python\camera calibration and 3d const\left\left60.png',0)
imgright = cv2.imread('D:\python\camera calibration and 3d const\Right/right60.png',0)


R1,R2,P1,P2,Q,validPixROI1, validPixROI2 = cv2.stereoRectify(cameraMatrixL,distCoeffsL,cameraMatrixR,distCoeffsR,(640,480),R,T,alpha=1)

print Q
# distort images
undistort_map1, rectify_map1 = cv2.initUndistortRectifyMap(cameraMatrixL, distCoeffsR, R1, P1, (640,480), cv2.CV_16SC2)
undistort_map2, rectify_map2 = cv2.initUndistortRectifyMap(cameraMatrixR, distCoeffsR, R2, P2, (640,480), cv2.CV_16SC2)

undistor_output1 = cv2.remap(imgleft, undistort_map1, rectify_map1, cv2.INTER_LINEAR)
undistor_output2 = cv2.remap(imgright, undistort_map2, rectify_map2, cv2.INTER_LINEAR)

cv2.imshow('undistor_output1',undistor_output1)
cv2.imshow('undistor_output2',undistor_output2)
while (True):
 if cv2.waitKey(1) & 0xFF == ord('q'):
    break

我分别校准了我的相机,然后使用这些获得的矩阵cv2.stereoRectify来获得R1,R2,P1,P2,Q我在cv2.initUndistortRectifyMap. 但我没有正确获得不失真的图像。它看起来像这样: 我的矩阵是:在此处输入图像描述 在此处输入图像描述

Q
[[  1.00000000e+00   0.00000000e+00   0.00000000e+00  -3.23097469e+02]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00  -2.40008609e+02]
 [  0.00000000e+00   0.00000000e+00   0.00000000e+00  -7.47885268e+00]
 [  0.00000000e+00   0.00000000e+00  -1.53249612e-02   0.00000000e+00]]



   cameraMartix Left
[[ 807.24668269    0.          326.78961645]
 [   0.          620.70299534  259.9187458 ]
 [   0.            0.            1.        ]]

camearMatrix Right
[[ 567.37537971    0.          278.76995505]
 [   0.          558.21417195  216.22972643]
 [   0.            0.            1.        ]]

Rotation
[[ 0.99973813 -0.02260904  0.00353613]
 [ 0.02269951  0.99934817 -0.02807079]
 [-0.00289917  0.0281437   0.99959968]]

Tranlation
[[-93.46968934]
 [ -1.48741179]
 [ 24.98692133]]

我已经阅读了很多答案,但没有解决我的问题。

关于如何立体校准和纠正 OpenCV 的直接解决方案?

* OpenCV (cv2) 中的 undistortPoints 与 Python 错误结果

cv2.remap 什么也没创建

使用 initUndistortRectifyMap 去扭曲图像点

opencv cv2.remap 创建奇怪的图像*

这个问题的解决方案是什么?

谢谢。

4

1 回答 1

0

在尝试了很多事情之后,我找到了解决这个特定问题的方法。在比较了使用 Python OpenCV 和 Matlab 获得的相机旋转矩阵和畸变矩阵后,我发现使用Python 和 Matlab获得的矩阵之间存在很大差异。因此,我再次校准我的相机并使用 Python 和 OpenCV 进行立体校准。下图显示了旧矩阵(从 Python 获得)和新矩阵(再次使用 Python 校准后获得)之间的区别。在此处输入图像描述

在此图中,我们可以看到旧情况下左右相机的畸变系数矩阵之间存在很大差异(dist coeff. right old and left old)与新情况下左右相机的畸变系数矩阵相比)(dist coeff. right new and left new)。对于右相机,旧系数为 83.85 和 - 19.18 分别对 0.78 和 -0.61。同样,对于左摄像头,旧系数分别为 123.7 和 -1641.4 对 -0.38 和 0.73。此外,旧左摄像头矩阵的第一个元素 (1,1) 是 807.24,与右相机旧矩阵。新左相机矩阵的元素值为 552.41,我认为这是正确的。当我使用所有这些新矩阵并将我的 alpha 值更改为 0 时(alpha = 0),我得到以下结果。 在此处输入图像描述

因为stereoCalbirate我使用了以下输入

retVal, cm1, dc1, cm2, dc2, r, t, e, f = cv2.stereoCalibrate(objpoints, imgpointsL, imgpointsR, cm1, dc1, cm2, dc2, (640, 480), None, None, cv2.CALIB_FIX_INTRINSIC, criteria)

在哪里criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)

于 2017-09-08T21:17:29.703 回答