import cv2 import os import numpy as np import sys import os sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from default_config import * # LỰa chọn độ phân giải bằng cách thay đổi set_resolution resolution = 'original' # Checker board size CHESS_BOARD_DIM = (9, 6) # termination criteria criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) calib_data_path = f"camera_calibration/calib_data/{resolution}" if not os.path.exists(calib_data_path): os.makedirs(calib_data_path) # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) obj_3D = np.zeros((CHESS_BOARD_DIM[0] * CHESS_BOARD_DIM[1], 3), np.float32) obj_3D[:, :2] = np.mgrid[0 : CHESS_BOARD_DIM[0], 0 : CHESS_BOARD_DIM[1]].T.reshape( -1, 2 ) obj_3D *= SQUARE_SIZE print(obj_3D) # Arrays to store object points and image points from all the images. obj_points_3D = [] # 3d point in real world space img_points_2D = [] # 2d points in image plane. # The images directory path image_dir_path = f"camera_calibration/images/{resolution}" files = os.listdir(image_dir_path) for file in files: print(file) imagePath = os.path.join(image_dir_path, file) image = cv2.imread(imagePath) grayScale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(image, CHESS_BOARD_DIM, None) if ret == True: obj_points_3D.append(obj_3D) corners2 = cv2.cornerSubPix(grayScale, corners, (3, 3), (-1, -1), criteria) img_points_2D.append(corners2) img = cv2.drawChessboardCorners(image, CHESS_BOARD_DIM, corners2, ret) cv2.destroyAllWindows() ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera( obj_points_3D, img_points_2D, grayScale.shape[::-1], None, None ) print("calibrated") np.savez( f"{calib_data_path}/MultiMatrix", camMatrix=mtx, distCoef=dist, rVector=rvecs, tVector=tvecs, ) print(f'saved to {calib_data_path}/MultiMatrix')