我想收集位于两个摄像机焦点处的物体的高度数据,这就是我的立体声设置:
当我使用标准cv2函数计算图像的校正版本时,它看起来非常糟糕。当我对摄像机并行使用类似设置时,它可以工作。
我计算了Epiline,它们似乎是正确的:
但是,生成的校正图像不是(下面是原始图像):
这是我使用的代码,大部分是从openCV教程复制而来的
http://www.dmi.unict.it/~furnari/teaching/CV1617/lab1/
3d / 2d点和矩阵是先前使用
cv2.calibrateCamera()
校准和校正过程
retval, _, _, _, _, R, T, E, F = cv2.stereoCalibrate(imager._3d_points, _2d_points_L,_2d_points_R, mtxL, distL, mtxR, distR, (img.shape[1], img.shape[0])
R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(mtxL, distL, mtxR, distR, (img.shape[1], img.shape[0]), R, T, )
map1_x, map1_y = cv2.initUndistortRectifyMap(imager.mtxL, imager.distL, R1, P1, (imLeft.shape[1], imLeft.shape[0]), cv2.CV_32FC1)
map2_x, map2_y = cv2.initUndistortRectifyMap(imager.mtxR, imager.distR, R2, P2, (imLeft.shape[1], imLeft.shape[0]), cv2.CV_32FC1)
imgL = cv2.remap(imLeft, map1_x, map1_y , cv2.INTER_CUBIC)
imgR = cv2.remap(imRight, map2_x, map2_y , cv2.INTER_CUBIC)
是OpenCV根本无法使用相机设置来校正图像,还是我做错了什么?
最佳答案
据我所知,函数stereoRectify
假定摄像机轴彼此大致平行。您可以尝试stereoRectifyUncalibrated
,因为此函数依赖基本矩阵计算,并且可以处理这种情况。确保您已阅读documentation中的注释。
注意:
虽然该算法不需要知道相机的固有参数,但它在很大程度上取决于对极几何形状。因此,如果摄像机镜头有明显的失真,最好在计算基本矩阵并调用此函数之前对其进行校正。例如,可以使用calibrateCamera()
分别为立体摄像机的每个磁头估计失真系数。然后,可以使用undistort()
校正图像,或者仅可以使用undistortPoints()
校正点坐标。
关于python - 摄像机之间的角度过大时,OpenCV立体图像校正无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57039780/