三维重建(3)之双目立体相机之 任意一组坐标点的极线校正

1.立体相机三位重建一般步骤:

基于图像的三维点云重建:

相机标定->立体(极线)校正->特征匹配->获取匹配点对->生成点云->点云拟合

基于深度相机(RGB-D)的三维重建:

相机标定->RGB与深度图标定->目标分割->点云重建

在这里插入图片描述

2.立体校正

作为三维重建过程中不可或缺的一步,目前Opencv仅支持实现图像的立体校正,而多数在目标检测情况下需要实现点到点的映射关系,所以尝试借助Opencv的remap实现了任意一组点的极线校正

Opencv极线校正过程:

相机标定(内外参)->畸变校正->通过相机参数获取x、y方向的映射矩阵->极线校正

效果图如下:在这里插入图片描述

3.任意一组点的极限校正算法实现:

主要解决的是点集的remap的实现:

opencv-remap实现原理:

dst(x,y)=s

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 基于C++实现双目立体视觉标定(畸变与极线矫正)、深度图计算、获取像素的空间坐标、三维云显示源码.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
以下是双目相机进行双目标定、绝对路径、极线校正、绘制极线的 Python 代码: ```python import numpy as np import cv2 # 定义标定板的大小和格子数 pattern_size = (8, 6) square_size = 20 # 读取左右相机的图像 img_left = cv2.imread('left.png') img_right = cv2.imread('right.png') # 导入标定板的世界坐标和图像坐标 obj_points = [] img_points_left = [] img_points_right = [] objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * square_size for i in range(2): if i == 0: img = img_left else: img = img_right gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret: obj_points.append(objp) corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) if i == 0: img_points_left.append(corners2) else: img_points_right.append(corners2) # 对左右相机进行标定 ret_left, mtx_left, dist_left, rvecs_left, tvecs_left = cv2.calibrateCamera(obj_points, img_points_left, gray.shape[::-1], None, None) ret_right, mtx_right, dist_right, rvecs_right, tvecs_right = cv2.calibrateCamera(obj_points, img_points_right, gray.shape[::-1], None, None) # 进行双目标定 flags = cv2.CALIB_FIX_INTRINSIC criteria_stereo = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 100, 1e-5) ret, mtx_left, dist_left, mtx_right, dist_right, R, T, E, F = cv2.stereoCalibrate(obj_points, img_points_left, img_points_right, mtx_left, dist_left, mtx_right, dist_right, gray.shape[::-1], criteria=criteria_stereo, flags=flags) # 计算校正映射和立体校正 R_left, R_right, P_left, P_right, Q, valid_roi_left, valid_roi_right = cv2.stereoRectify(mtx_left, dist_left, mtx_right, dist_right, gray.shape[::-1], R, T) # 计算映射表 map_left_x, map_left_y = cv2.initUndistortRectifyMap(mtx_left, dist_left, R_left, P_left, gray.shape[::-1], cv2.CV_16SC2) map_right_x, map_right_y = cv2.initUndistortRectifyMap(mtx_right, dist_right, R_right, P_right, gray.shape[::-1], cv2.CV_16SC2) # 映射图像 img_left_rectified = cv2.remap(img_left, map_left_x, map_left_y, cv2.INTER_LINEAR) img_right_rectified = cv2.remap(img_right, map_right_x, map_right_y, cv2.INTER_LINEAR) # 计算视差图 window_size = 5 min_disp = 16 num_disp = 112 - min_disp stereo = cv2.StereoSGBM_create(minDisparity=min_disp, numDisparities=num_disp, blockSize=window_size, P1=8*3*window_size**2, P2=32*3*window_size**2) disparity = stereo.compute(img_left_rectified, img_right_rectified) # 极线校正和绘制极线 lines_left = cv2.computeCorrespondEpilines(img_points_left, 1, F) lines_left = lines_left.reshape(-1, 3) img_left_rectified_color = cv2.cvtColor(img_left_rectified, cv2.COLOR_GRAY2BGR) for r, pt in zip(lines_left, img_points_right): color = tuple(np.random.randint(0, 255, 3).tolist()) x0, y0 = map(int, [0, -r[2]/r[1]]) x1, y1 = map(int, [img_left_rectified_color.shape[1], -(r[2]+r[0]*img_left_rectified_color.shape[1])/r[1]]) img_left_rectified_color = cv2.line(img_left_rectified_color, (x0, y0), (x1, y1), color, 1) cv2.imshow('Left Rectified', img_left_rectified_color) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值