我想扭曲和纠正我的立体声图像。我在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]]
我已经阅读了许多答案,但没有解决我的问题。
Straightforward solution on how to stereo calibration and rectifications OpenCV?
* undistortPoints in OpenCV (cv2) with Python wrong results
using initUndistortRectifyMap to undistort image points
opencv cv2.remap creates strange images *
这个问题的解决方案是什么?
感谢。
答案 0 :(得分:0)
在尝试了很多东西之后,我找到了解决这个特殊问题的方法。在比较使用Python OpenCV和Matlab获得的相机旋转矩阵和失真矩阵后,我发现使用 Python和Matlab 获得的矩阵之间存在很大差异。因此,我再次校准我的相机并使用Python和OpenCV进行立体声校准。下图显示了旧矩阵(从Python获得)和新矩阵(使用Python再次校准后获得)之间的差异。
在这个图中,我们可以看到旧情况下左右相机的失真系数矩阵之间存在很大差异(dist coeff. right old and left old)
与新情况下{{1}左右相机的失真系数矩阵相比较对于右相机,旧系数分别为83.85和-19.18分别为0.78和-0.61。同样,对于左相机,旧系数分别为123.7和-1641.4分别为-0.38和0.73。另外,第一元素(1,1)旧的左相机矩阵是807.24,与右相机旧矩阵相比差别很大。新的左相机矩阵的元素值为552.41,我认为是正确的。当我使用所有这些新矩阵并将我的alpha值更改为0 {{ 1}}我得到了以下结果。
对于(dist coeff. right new and left new)
,我使用了以下输入
(alpha = 0)
其中stereoCalbirate