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板:

- 示例原图及校正结果图:


内容的提问来源于stack exchange,提问作者Wilson Veloz
相关产品推荐
相关产品推荐

