Using fisheye calibration to solve allsky images using OpenCV (fails)

  Kiến thức lập trình

I am using fisheye calibration to solve chessboard images using OpenCV. It fails for the calibration flag cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC, so I work around it. But once I get the parameters, the distortion is not looking good. I am attaching an image too.

From the Fisheye calibration

This is my code here:



chessboardsize = (13, 9)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)
flags = ( cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_NORMALIZE_IMAGE + cv2.CALIB_CB_FILTER_QUADS)
# calibration_flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC + cv2.fisheye.CALIB_CHECK_COND + cv2.fisheye.CALIB_FIX_SKEW
calibration_flags = cv2.fisheye.CALIB_CHECK_COND + cv2.fisheye.CALIB_FIX_SKEW

objp = np.zeros((1, chessboardsize[0]*chessboardsize[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:chessboardsize[0], 0:chessboardsize[1]].T.reshape(-1, 2)
_img_shape = None

objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.
images = glob.glob('calibration_frames/*.jpg')  # Images

if len(images) == 0:
    raise ValueError("No images found in the specified directory.")

for fname in images:
    
    img = cv2.imread(fname)
    if img is None:
        print(f"Image {fname} cannot be read.")
        continue  # Skip if the image is not read properly
    if _img_shape == None:
        _img_shape = img.shape[:2]
    else:
        assert _img_shape == img.shape[:2], "All images must share the same size."

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, chessboardsize, flags)
    # If found, add object points, image points (after refining them)
    if ret == True:
        objpoints.append(objp)
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        imgpoints.append(corners)
        
        cv2.drawChessboardCorners(img, chessboardsize, corners, ret)
        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.figure(figsize=(10, 7))
        plt.imshow(img_rgb)
        plt.title(f'Chessboard Corners: {fname}')
        plt.axis('off')
        plt.show()
    else:
        print(f"Chessboard corners not found in {fname}")

if len(objpoints) == 0 or len(imgpoints) == 0:
    raise ValueError("No valid images found for calibration.")

N_OK = len(objpoints)
K = np.zeros((3, 3))
D = np.zeros((4, 1))
rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]

 # Perform fisheye calibration
try:
    rms, _, _, _, _ = cv2.fisheye.calibrate(
        objpoints,
        imgpoints,
        _img_shape[::-1],
        K,
        D,
        rvecs,
        tvecs,
        calibration_flags,  # cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC throws error
        (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
    )

    print("Found " + str(N_OK) + " valid images for calibration")
    print("DIM=" + str(_img_shape[::-1]))
    print("K=np.array(" + str(K.tolist()) + ")")
    print("D=np.array(" + str(D.tolist()) + ")")

except cv2.error as e:
    print("Calibration failed:", e)

I have tried using normal camera calibrate too. It looks like this:

From the normal camera calibration. I am trying to make it as better as possible as I will be detecting stars and patterns later with the distortion parameters.

New contributor

B.S. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

Theme wordpress giá rẻ Theme wordpress giá rẻ Thiết kế website

LEAVE A COMMENT