双目相机标定、校正、点位恢复、视差图、深度图、点云

收集整理了网上的一些代码和实验资料。configs.py为一些通用参数,方便修改,stereoCal.py为相机标定代码(原理也不赘述了,百度都有);calPoint.py用于标定后计算空间三维坐标,具体方法可以自行百度(其实就是方程组求解);calDepth.py主要为校正图片以及用sgbm算法和wls过滤计算视差图,然后再进行深度计算(代码中有两种方法,可自行选择,本文用的是opencv自带的算法),最后利用open3d进行了点云恢复。另外sgbmP.py实现的是sgbm算法实时调参并保存视差图,middTest.py是一个测试案例,一个叫什么middlu的数据集,该数据集的图片都是校正过的,可以直接计算出视差图,然后根据自带的标定参数计算深度或者点云恢复。
具体效果如下:
相机标定xiangji biaodi相机标定
三维点位计算
相关点位计算与误差
极线校正、视差图、深度图、点云
在这里插入图片描述
实时调参sgbm
在这里插入图片描述
点云恢复图
在这里插入图片描述
该文件理论上解压就可以运行,配好环境的前提,数据都有(数据也是网上收集的,不知道是否那个)
文件链接为,免费,目前在审核不知道可以用吗?:https://download.csdn.net/download/qq_38013054/86805316

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要进行双目相机标定并获取点云图像,需要先准备好相机标定板,它是一张黑白相间的方格纸,可以在网上下载并打印。然后按照以下步骤进行操作: 1. 拍摄相机标定板的多张照片,保证相机位置和角度不变,只改变拍照时的标定板位置和角度。照片越多越好,最好超过10张。 2. 使用 OpenCV 库中的 stereoCalibrate 函数,对双目相机进行标定。这个函数会输出相机内部参数、旋转矩阵和平移向量等参数。 3. 使用 OpenCV 库中的 stereoRectify 函数,对左右相机进行校正,使它们的光轴平行。这个函数会输出左右相机校正变换矩阵。 4. 使用 OpenCV 库中的 undistort 函数,对左右相机的照片进行畸变矫正。 5. 使用 OpenCV 库中的 stereoMatch 函数,对左右相机的照片进行立体匹配,得到每个像素点的视差(disparity)。 6. 使用 OpenCV 库中的 reprojectImageTo3D 函数,将视差图像转换为三维坐标。 7. 使用点云库(如 PCL)将三维坐标转换为点云图像。 8. 可以使用可视化工具(如 CloudCompare)查看点云图像。 需要注意的是,双目相机标定点云图像获取的过程比较复杂,需要一定的图像处理和计算机视觉基础。建议在进行这些操作前先学习相关知识。 以下是一个简单的 Python 代码示例,展示如何进行双目相机标定并获取点云图像: ``` import cv2 import numpy as np import open3d as o3d # 准备相机标定板 pattern_size = (9, 6) # 标定板上的内角点数量 square_size = 0.02 # 标定板上每个方格的大小,单位为米 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 # 拍摄标定板的多张照片并进行标定 image_paths_left = ['left1.jpg', 'left2.jpg', 'left3.jpg', ...] image_paths_right = ['right1.jpg', 'right2.jpg', 'right3.jpg', ...] objpoints = [] # 存储标定板上的三维坐标 imgpoints_left = [] # 存储左相机照片中的二维像素坐标 imgpoints_right = [] # 存储右相机照片中的二维像素坐标 for image_path_left, image_path_right in zip(image_paths_left, image_paths_right): img_left = cv2.imread(image_path_left) img_right = cv2.imread(image_path_right) gray_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY) gray_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY) ret_left, corners_left = cv2.findChessboardCorners(gray_left, pattern_size, None) ret_right, corners_right = cv2.findChessboardCorners(gray_right, pattern_size, None) if ret_left and ret_right: objpoints.append(objp) imgpoints_left.append(corners_left) imgpoints_right.append(corners_right) ret, mtx_left, dist_left, mtx_right, dist_right, R, T, E, F = cv2.stereoCalibrate(objpoints, imgpoints_left, imgpoints_right, gray_left.shape[::-1]) # 校正和矫正 R_left, R_right, P_left, P_right, Q, roi_left, roi_right = cv2.stereoRectify(mtx_left, dist_left, mtx_right, dist_right, gray_left.shape[::-1], R, T, alpha=0) mapx_left, mapy_left = cv2.initUndistortRectifyMap(mtx_left, dist_left, R_left, P_left, gray_left.shape[::-1], cv2.CV_32FC1) mapx_right, mapy_right = cv2.initUndistortRectifyMap(mtx_right, dist_right, R_right, P_right, gray_right.shape[::-1], cv2.CV_32FC1) img_left = cv2.imread('left.jpg') img_right = cv2.imread('right.jpg') dst_left = cv2.remap(img_left, mapx_left, mapy_left, cv2.INTER_LINEAR) dst_right = cv2.remap(img_right, mapx_right, mapy_right, cv2.INTER_LINEAR) # 立体匹配 stereoMatcher = cv2.StereoSGBM_create( minDisparity=0, numDisparities=16*6, # 要为16的倍数 blockSize=5, speckleWindowSize=100, speckleRange=2, disp12MaxDiff=1, uniquenessRatio=15, P1=8 * 3**2, P2=32 * 3**2 ) gray_left = cv2.cvtColor(dst_left, cv2.COLOR_BGR2GRAY) gray_right = cv2.cvtColor(dst_right, cv2.COLOR_BGR2GRAY) disparity = stereoMatcher.compute(gray_left, gray_right).astype(np.float32) / 16.0 # 转换为三维坐标 points3d = cv2.reprojectImageTo3D(disparity, Q) points3d = points3d.reshape(-1, 3) mask = disparity > disparity.min() colors = dst_left.reshape(-1, 3)[mask] pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points3d[mask]) pcd.colors = o3d.utility.Vector3dVector(colors) # 可视化 o3d.visualization.draw_geometries([pcd]) ``` 需要注意的是,这只是一个简单的示例代码,实际操作中可能会涉及到更多的细节和问题,需要根据具体情况进行调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值