Report/Code/rectify.py

56 lines
2.4 KiB
Python
Raw Permalink Normal View History

2024-10-23 20:39:19 +08:00
import cv2
import yaml
import numpy as np
# 定义函数读取标定数据
def read_calibration_data(calibration_file):
with open(calibration_file, 'r') as f:
calib_data = yaml.safe_load(f)
cameraMatrix_l = np.array(calib_data['camera_matrix_left']['data']).reshape(3, 3)
distCoeffs_l = np.array(calib_data['dist_coeff_left']['data'])
cameraMatrix_r = np.array(calib_data['camera_matrix_right']['data']).reshape(3, 3)
distCoeffs_r = np.array(calib_data['dist_coeff_right']['data'])
R = np.array(calib_data['R']['data']).reshape(3, 3)
T = np.array(calib_data['T']['data']).reshape(3, 1)
return cameraMatrix_l, distCoeffs_l, cameraMatrix_r, distCoeffs_r, R, T
# 定义函数对图像进行矫正
def rectify_images(left_image_path, right_image_path, calibration_file):
# 读取标定数据
cameraMatrix_l, distCoeffs_l, cameraMatrix_r, distCoeffs_r, R, T = read_calibration_data(calibration_file)
# 读取左右图像
img_left = cv2.imread(left_image_path)
img_right = cv2.imread(right_image_path)
# 获取图像尺寸(假设左右图像尺寸相同)
img_size = img_left.shape[:2][::-1]
# 立体校正
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(cameraMatrix_l, distCoeffs_l,
cameraMatrix_r, distCoeffs_r,
img_size, R, T)
# 计算映射参数
map1_l, map2_l = cv2.initUndistortRectifyMap(cameraMatrix_l, distCoeffs_l, R1, P1, img_size, cv2.CV_32FC1)
map1_r, map2_r = cv2.initUndistortRectifyMap(cameraMatrix_r, distCoeffs_r, R2, P2, img_size, cv2.CV_32FC1)
# 应用映射并显示结果
rectified_img_l = cv2.remap(img_left, map1_l, map2_l, cv2.INTER_LINEAR)
rectified_img_r = cv2.remap(img_right, map1_r, map2_r, cv2.INTER_LINEAR)
# 合并图像显示
combined_img = np.hstack((rectified_img_l, rectified_img_r))
cv2.imshow('Rectified Images', combined_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 设置路径和文件名
left_image_path = "left/left_WIN_20241023_14_54_55_Pro.jpg"
right_image_path = "right/right_WIN_20241023_14_54_55_Pro.jpg"
calibration_file = "calibration_parameters.yaml"
# 调用函数进行图像矫正
rectify_images(left_image_path, right_image_path, calibration_file)