OpenCV 4.10中ChArUco板相机内参校准报错的解决咨询
解决OpenCV 4.10中ChArUco相机内参校准的AttributeError问题
在OpenCV 4.10版本中,使用ChArUco板进行相机内参校准时,若调用cv2.aruco.calibrateCameraCharuco会触发以下错误:
AttributeError: module 'cv2.aruco' has no attribute 'calibrateCameraCharuco'
这是因为OpenCV 4.10已将Aruco相关的校准功能从cv2.aruco子模块迁移到了主cv2模块,官方文档也明确标注了这一变动。
修复步骤
- 替换校准函数的调用路径:将
cv2.aruco.calibrateCameraCharuco改为cv2.calibrateCameraCharuco - 确保参数传递正确:函数参数与原
cv2.aruco.calibrateCameraCharuco完全兼容,无需修改参数列表
修改后的完整代码
import os import cv2 import glob img_folder_path = f"{os.getenv('HOME')}/rgb/" aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_250) board = cv2.aruco.CharucoBoard( size=(14, 9), squareLength=0.04, markerLength=0.03, dictionary=aruco_dict) ch_params = cv2.aruco.CharucoParameters() detector_params = cv2.aruco.DetectorParameters() refine_params = cv2.aruco.RefineParameters(minRepDistance=0.05, errorCorrectionRate=0.1, checkAllOrders=True) ch_detector = cv2.aruco.CharucoDetector( board=board,charucoParams=ch_params, detectorParams=detector_params, # refineParams=refine_params ) all_ch_corners = [] all_ch_ids = [] image_size = None images = glob.glob(img_folder_path + '/*.png') for image_file in images: image = cv2.imread(image_file) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) charucoCorners, charucoIds, markerCorners, markerIds = ch_detector.detectBoard(gray) if charucoIds is not None and len(charucoCorners) > 3: all_ch_corners.append(charucoCorners) all_ch_ids.append(charucoIds) # 关键修改:将cv2.aruco.calibrateCameraCharuco改为cv2.calibrateCameraCharuco result, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCameraCharuco( all_ch_corners, all_ch_ids, board, gray.shape[:2], # 建议用灰度图尺寸,避免彩色图通道干扰 None, None ) print("camera_matrix: \n", camera_matrix, "\ndist_coeffs: \n", dist_coeffs)
额外说明
- 除校准函数外,Aruco的检测、板定义等功能仍保留在
cv2.aruco子模块中,无需修改 - 建议使用灰度图的尺寸(
gray.shape[:2])作为校准的图像尺寸参数,避免彩色图像的通道维度造成潜在问题
内容的提问来源于stack exchange,提问作者bhomaidan90
相关产品推荐
相关产品推荐

