You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV ChArUco检测/标定失败,导致图像严重畸变

相机标定后桶形畸变校正失效,去畸变图像未展平?

我正尝试以ChArUco板为参考进行相机标定,实现桶形畸变校正。此前代码运行完全正常,但现在无法正常工作:执行去畸变操作后的图像并未被展平。我已尝试更换多个OpenCV版本,但均未解决该问题。有人遇到过类似问题吗?

代码实现

以下是检测ArUco标记、计算相机标定及去畸变的代码:

def read_chessboards(img):
    """
    Charuco base pose estimation.
    """
    allCorners = []
    allIds = []
    decimator = 0
    aruco_dict =  cv.aruco.getPredefinedDictionary(cv.aruco.DICT_7X7_1000)
    board = cv.aruco.CharucoBoard_create(53, 34, 10, 8, aruco_dict) #37, 25
    # SUB PIXEL CORNER DETECTION CRITERION
    criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.00001)

    frame = cv.imread(img)
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    gray = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY,95,10) #95
    corners, ids, rejectedImgPoints = cv.aruco.detectMarkers(gray, aruco_dict)

    if len(corners)>0:
        # SUB PIXEL DETECTION
        for corner in corners:
            cv.cornerSubPix(gray, corner,
                             winSize = (3,3),
                             zeroZone = (-1,-1),
                             criteria = criteria)
        res2 = cv.aruco.interpolateCornersCharuco(corners,ids,gray,board)
        if res2[1] is not None and res2[2] is not None and len(res2[1])>3 and decimator%1==0:
            allCorners.append(res2[1])
            allIds.append(res2[2])

    decimator+=1

    imsize = gray.shape
    return allCorners,allIds,imsize

def calibrate_camera(allCorners,allIds,imsize):
    """
    Calibrates the camera using the dected corners.
    """
    print("CAMERA CALIBRATION")

    aruco_dict =  cv.aruco.getPredefinedDictionary(cv.aruco.DICT_7X7_1000)
    cameraMatrixInit = np.array([[ 1000.,    0., imsize[0]/2.],
                                 [    0., 1000., imsize[1]/2.],
                                 [    0.,    0.,           1.]])

    distCoeffsInit = np.zeros((5,1))
    #flags = (cv.CALIB_USE_INTRINSIC_GUESS + cv.CALIB_RATIONAL_MODEL + cv.CALIB_FIX_ASPECT_RATIO)
    #flags = (cv.CALIB_RATIONAL_MODEL)
    flags = None
    (ret, camera_matrix, distortion_coefficients0,
     rotation_vectors, translation_vectors,
     stdDeviationsIntrinsics, stdDeviationsExtrinsics,
     perViewErrors) = cv.aruco.calibrateCameraCharucoExtended(
                      charucoCorners=allCorners,
                      charucoIds=allIds,
                      board=cv.aruco.CharucoBoard_create(53, 34, 10, 8, aruco_dict), #53, 34, 10, 8
                      imageSize=imsize,
                      cameraMatrix=cameraMatrixInit,
                      distCoeffs=distCoeffsInit,
                      flags=flags,
                      criteria=(cv.TERM_CRITERIA_EPS & cv.TERM_CRITERIA_COUNT, 10000, 1e-9))

    newcameramtx, roi = cv.getOptimalNewCameraMatrix(
                    camera_matrix, distortion_coefficients0, imsize, 0, imsize)

    return ret, camera_matrix, distortion_coefficients0, rotation_vectors, translation_vectors, newcameramtx

def undistort(img, mtx, dist, nmtx):
    img = cv.undistort(img,
                    mtx,
                    dist,
                    None,
                    nmtx,)
    return img

所用图像

  • ChArUco板:
    charuco board
  • 示例原图及校正结果图:
    示例原图
    校正结果图

内容的提问来源于stack exchange,提问作者Wilson Veloz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:12:27