摄像机标定03之矫正

标定摄像机通常是想做两件事,一个是矫正畸变效应,另一个是根据获得的图像重构三维场景。
OpenCV提供一个直接使用的校正算法,即输入原始图像和由函数cvCalibrateCamera2()得到的畸变系数,生成校正后的图像。我们既可以一次性通过函数cvUndistort2()使用该算法完成所有事项, 也可以通过一对函数cvInitUndistortMap()和cvRemap()来更有效率的处理此事,这通常适合视频或者从同一摄像机中得到多个图像的应用。
“校正”和“矫正”的关系,“矫正”是在数学上去掉透镜畸变,而“校正”是数学上将图像排列整齐。

基本方法是:  先计算畸变映射,再矫正图像。函数cvInitUndisortMap()用于计算畸变映射,而函数cvRemap()表示在任意图像应用该映射。函数cvUndistort2()是在一次调用中先后完成两个步骤。但是计算畸变映射是一个耗时的操作,所以,当畸变映射不变的时候随时调用函数cvUndistort2()是一种不聪明的做法。最后,如果有一系列的2D点,我们可以调用函数cvUndistortPoints()从原始坐标变换到矫正后的坐标。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双目摄像机标定矫正是一个用于将两个摄像机的图像对准以进行三维重建的过程。Python中常用的双目摄像机标定矫正代码库是OpenCV,以下是一个简单的双目摄像机标定矫正的Python代码示例: ```python import cv2 # 设置左右摄像机ID left_cam_id = 0 right_cam_id = 1 # 设置棋盘格尺寸 board_size = (9, 6) # 设置棋盘格物理尺寸(单位:mm) square_size = 30 # 设置图像路径 left_path = 'left.jpg' right_path = 'right.jpg' # 初始化左右摄像机 left_cam = cv2.VideoCapture(left_cam_id) right_cam = cv2.VideoCapture(right_cam_id) # 设置棋盘格角点的三维坐标 obj_points = [] for i in range(board_size * board_size): obj_points.append((i // board_size * square_size, i % board_size * square_size, 0)) # 初始化图像点和对象点数组 obj_points_list = [] img_points_left_list = [] img_points_right_list = [] while True: # 捕获图像 ret_l, img_left = left_cam.read() ret_r, img_right = right_cam.read() # 检测棋盘格角点 ret_l, corners_left = cv2.findChessboardCorners(img_left, board_size) ret_r, corners_right = cv2.findChessboardCorners(img_right, board_size) if ret_l and ret_r: # 绘制角点 cv2.drawChessboardCorners(img_left, board_size, corners_left, ret_l) cv2.drawChessboardCorners(img_right, board_size, corners_right, ret_r) # 添加对象点和图像点到数组中 obj_points_list.append(obj_points) img_points_left_list.append(corners_left) img_points_right_list.append(corners_right) # 显示图像 cv2.imshow('Left', img_left) cv2.imshow('Right', img_right) # 按下 ESC 键退出循环 if cv2.waitKey(1) == 27: break # 关闭摄像机 left_cam.release() right_cam.release() # 计算标定参数 ret_l, mtx_l, dist_l, rvecs_l, tvecs_l = cv2.calibrateCamera(obj_points_list, img_points_left_list, img_left.shape[::-1][1:], None, None) ret_r, mtx_r, dist_r, rvecs_r, tvecs_r = cv2.calibrateCamera(obj_points_list, img_points_right_list, img_right.shape[::-1][1:], None, None) ret_s, mtx_l, dist_l, mtx_r, dist_r, R, T, E, F = cv2.stereoCalibrate(obj_points_list, img_points_left_list, img_points_right_list, mtx_l, dist_l, mtx_r, dist_r, img_left.shape[::-1][1:], criteria=criteria) # 计算矫正参数 R1, R2, P1, P2, Q, valid_roi_left, valid_roi_right = cv2.stereoRectify(mtx_l, dist_l, mtx_r, dist_r, img_left.shape[::-1][1:], R, T, alpha=0) # 生成映射表 mapx_l, mapy_l = cv2.initUndistortRectifyMap(mtx_l, dist_l, R1, P1, img_left.shape[::-1][1:], cv2.CV_32FC1) mapx_r, mapy_r = cv2.initUndistortRectifyMap(mtx_r, dist_r, R2, P2, img_right.shape[::-1][1:], cv2.CV_32FC1) # 加载图像 img_left = cv2.imread(left_path) img_right = cv2.imread(right_path) # 根据映射表矫正图像 img_rectified_left = cv2.remap(img_left, mapx_l, mapy_l, cv2.INTER_LINEAR) img_rectified_right = cv2.remap(img_right, mapx_r, mapy_r, cv2.INTER_LINEAR) # 显示矫正后的图像 cv2.imshow('Left Rectified', img_rectified_left) cv2.imshow('Right Rectified', img_rectified_right) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值