使用 OpenCV 进行立体相机校准会导致更多失真

问题描述

我正在尝试使用 OpenCV 和 6 x 5 棋盘图案(0.033 平方米大小)校准立体 VGA 相机(640x480 灰度)。我用相机在一个稳定的位置拍摄了 60 对,试图改变棋盘(见图像 here)并开始基于 this OpenCV-based tutorialrepo 进行校准。因此,基本上,我首先使用以下宽度、高度为 5 x 4 的脚本分别校准两个摄像头:

for fname in images:
    gray = cv2.imread(fname,cv2.IMREAD_GRAYSCALE)
    gray = cv2.flip(gray,0)

    # Find the chess board corners
    ret,corners = cv2.findChessboardCorners(gray,(width,height),None)
    if ret:
        objpoints.append(objp)

        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        imgpoints.append(corners2)

        # Draw and display the corners to manually discard misalignments
        img = cv2.drawChessboardCorners(gray,corners2,ret)

ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints,gray.shape[::-1],None,None)

对于正确的相机,棋盘在 41/60 图像中被检测到。由于对齐错误,我又丢弃了一张,并用 40 张图像重新校准,导致 RMS 误差为 0.11(请参阅校准文件 here)。同样,我用 40 张图像校准了左侧摄像头,结果 RMS 为 0.13。 我没有丢弃棋盘图是垂直而不是水平的图像,这能起到作用吗?至于立体校准,我使用了以下脚本,使用 36 导致 RMS 误差为 0.23对(4 个被丢弃,因为在两张图片中都无法识别角点)。

ret_right,corners_right = cv2.findChessboardCorners(gray_right,pattern_size,cv2.CALIB_CB_ADAPTIVE_THRESH | cv2.CALIB_CB_FILTER_QUADS)

if ret_right and os.path.isfile(right_im.replace('RIGHT','LEFT')):
    # Left Object Points
    left = cv2.imread(right_im.replace('RIGHT','LEFT'),cv2.IMREAD_GRAYSCALE)
    gray_left = cv2.flip(left,0)

    # Find the chess board corners
    ret_left,corners_left = cv2.findChessboardCorners(gray_left,cv2.CALIB_CB_ADAPTIVE_THRESH | cv2.CALIB_CB_FILTER_QUADS)

    if ret_left:
        # Object points
        objpoints.append(objp)
        # Right points
        corners2_right = cv2.cornerSubPix(gray_right,corners_right,(5,5),criteria)

        right_imgpoints.append(corners2_right)
        # Left points
        corners2_left = cv2.cornerSubPix(gray_left,corners_left,criteria)
        left_imgpoints.append(corners2_left)

ret,K1,D1,K2,D2,R,T,E,F = cv2.stereoCalibrate(objpoints,left_imgpoints,right_imgpoints,image_size,cv2.CALIB_FIX_INTRINSIC,criteria)

校准后,我尝试使用立体校准来消除和校正图像:

interpolation = cv2.INTER_LANCZOS4 # also tried with cv2.INTER_LINEAR
leftMapX,leftMapY = cv2.initUndistortRectifyMap(K1,R1,P1,(640,480),cv2.CV_32FC1)
left_rectified = cv2.remap(leftFrame,leftMapX,leftMapY,interpolation,cv2.BORDER_CONSTANT)

但生成的图像比原始图像扭曲得多:

Original vs. ``undistorted'' image

有人能指出我正确的方向吗?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...