opencv双目标定(opencv双目标定结果)
## OpenCV 双目标定### 简介 双目标定是利用两个摄像头拍摄同一场景图像,通过建立两个摄像头之间的精确几何关系,来获取场景中物体三维信息的计算机视觉技术。OpenCV 是一个强大的开源计算机视觉库,提供了丰富的函数和工具来实现双目标定。### 双目标定步骤#### 1. 准备工作
准备硬件:
两台相同型号的摄像头、标定板、相机支架。
安装 OpenCV:
确保系统已安装 OpenCV 库,并配置好 Python 开发环境。#### 2. 单目标定 在进行双目标定之前,需要分别对两台相机进行单目标定,以获取每台相机的内参矩阵和畸变系数。1.
拍摄标定板图像:
将标定板放置在相机视野内,从不同角度和距离拍摄多张图像 (建议 20 张以上)。 2.
提取角点:
使用 `findChessboardCorners()` 函数检测图像中的标定板角点。 3.
优化角点坐标:
使用 `cornerSubPix()` 函数优化角点坐标的精度。 4.
标定相机:
使用 `calibrateCamera()` 函数计算相机的内参矩阵和畸变系数。#### 3. 双目标定 完成单目标定后,就可以进行双目标定了。1.
拍摄双目图像:
将两台相机固定,并调整好相对位置和角度,拍摄同一场景的多组图像 (建议 20 组以上)。 2.
提取角点:
分别对左右相机拍摄的图像提取标定板角点。 3.
立体标定:
使用 `stereoCalibrate()` 函数计算相机的旋转矩阵(R)、平移向量(T)、本质矩阵(E)和基础矩阵(F)。#### 4. 立体校正 为了方便后续的深度计算,需要对两台相机的图像进行立体校正,使得对应点在同一水平线上。1.
计算校正参数:
使用 `stereoRectify()` 函数计算校正变换矩阵。 2.
校正图像:
使用 `remap()` 函数对图像进行校正。#### 5. 深度计算 完成立体校正后,就可以根据视差图计算场景中物体的深度信息。1.
计算视差图:
使用 `StereoBM` 或 `StereoSGBM` 等算法计算校正后的图像对的视差图。 2.
深度转换:
根据视差图和相机参数,计算每个像素点的深度值。### 代码示例 以下是一个简单的双目标定示例代码: ```python import cv2 import numpy as np# 设置标定板参数 chessboard_size = (9, 6) square_size = 25 # mm# 创建标定板角点三维坐标 objp = np.zeros((chessboard_size[0]
chessboard_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
square_size# 存储角点坐标 objpoints = [] # 三维点 imgpoints_left = [] # 左相机二维点 imgpoints_right = [] # 右相机二维点# 读取标定图像 for i in range(20):img_left = cv2.imread(f"left/image{i}.jpg")img_right = cv2.imread(f"right/image{i}.jpg")# 寻找角点ret_left, corners_left = cv2.findChessboardCorners(img_left, chessboard_size, None)ret_right, corners_right = cv2.findChessboardCorners(img_right, chessboard_size, None)if ret_left and ret_right:# 添加角点坐标objpoints.append(objp)imgpoints_left.append(corners_left)imgpoints_right.append(corners_right)# 单目标定 ret_left, mtx_left, dist_left, rvecs_left, tvecs_left = cv2.calibrateCamera(objpoints, imgpoints_left, img_left.shape[:2], None, None ) ret_right, mtx_right, dist_right, rvecs_right, tvecs_right = cv2.calibrateCamera(objpoints, imgpoints_right, img_right.shape[:2], None, None )# 双目标定 ret, mtx_left, dist_left, mtx_right, dist_right, R, T, E, F = cv2.stereoCalibrate(objpoints,imgpoints_left,imgpoints_right,mtx_left,dist_left,mtx_right,dist_right,img_left.shape[:2],None,None,None,None,cv2.CALIB_FIX_INTRINSIC, )# 立体校正 R1, R2, P1, P2, Q, roi_left, roi_right = cv2.stereoRectify(mtx_left, dist_left, mtx_right, dist_right, img_left.shape[:2], R, T )# 计算校正映射 map1_left, map2_left = cv2.initUndistortRectifyMap(mtx_left, dist_left, R1, P1, img_left.shape[:2], cv2.CV_32FC1 ) map1_right, map2_right = cv2.initUndistortRectifyMap(mtx_right, dist_right, R2, P2, img_right.shape[:2], cv2.CV_32FC1 )# 读取测试图像并校正 img_left = cv2.imread("left/test.jpg") img_right = cv2.imread("right/test.jpg")img_rectified_left = cv2.remap(img_left, map1_left, map2_left, cv2.INTER_LINEAR) img_rectified_right = cv2.remap(img_right, map1_right, map2_right, cv2.INTER_LINEAR)# 显示校正后的图像 cv2.imshow("Rectified Left", img_rectified_left) cv2.imshow("Rectified Right", img_rectified_right) cv2.waitKey(0) ``` ### 总结 本文介绍了使用 OpenCV 进行双目标定的步骤和代码示例。双目标定是获取场景深度信息的必要步骤,在机器人导航、三维重建等领域有着广泛的应用。
OpenCV 双目标定
简介 双目标定是利用两个摄像头拍摄同一场景图像,通过建立两个摄像头之间的精确几何关系,来获取场景中物体三维信息的计算机视觉技术。OpenCV 是一个强大的开源计算机视觉库,提供了丰富的函数和工具来实现双目标定。
双目标定步骤
1. 准备工作 * **准备硬件:** 两台相同型号的摄像头、标定板、相机支架。 * **安装 OpenCV:** 确保系统已安装 OpenCV 库,并配置好 Python 开发环境。
2. 单目标定 在进行双目标定之前,需要分别对两台相机进行单目标定,以获取每台相机的内参矩阵和畸变系数。1. **拍摄标定板图像:** 将标定板放置在相机视野内,从不同角度和距离拍摄多张图像 (建议 20 张以上)。 2. **提取角点:** 使用 `findChessboardCorners()` 函数检测图像中的标定板角点。 3. **优化角点坐标:** 使用 `cornerSubPix()` 函数优化角点坐标的精度。 4. **标定相机:** 使用 `calibrateCamera()` 函数计算相机的内参矩阵和畸变系数。
3. 双目标定 完成单目标定后,就可以进行双目标定了。1. **拍摄双目图像:** 将两台相机固定,并调整好相对位置和角度,拍摄同一场景的多组图像 (建议 20 组以上)。 2. **提取角点:** 分别对左右相机拍摄的图像提取标定板角点。 3. **立体标定:** 使用 `stereoCalibrate()` 函数计算相机的旋转矩阵(R)、平移向量(T)、本质矩阵(E)和基础矩阵(F)。
4. 立体校正 为了方便后续的深度计算,需要对两台相机的图像进行立体校正,使得对应点在同一水平线上。1. **计算校正参数:** 使用 `stereoRectify()` 函数计算校正变换矩阵。 2. **校正图像:** 使用 `remap()` 函数对图像进行校正。
5. 深度计算 完成立体校正后,就可以根据视差图计算场景中物体的深度信息。1. **计算视差图:** 使用 `StereoBM` 或 `StereoSGBM` 等算法计算校正后的图像对的视差图。 2. **深度转换:** 根据视差图和相机参数,计算每个像素点的深度值。
代码示例 以下是一个简单的双目标定示例代码: ```python import cv2 import numpy as np
设置标定板参数 chessboard_size = (9, 6) square_size = 25
mm
创建标定板角点三维坐标 objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) * square_size
存储角点坐标 objpoints = []
三维点 imgpoints_left = []
左相机二维点 imgpoints_right = []
右相机二维点
读取标定图像 for i in range(20):img_left = cv2.imread(f"left/image{i}.jpg")img_right = cv2.imread(f"right/image{i}.jpg")
寻找角点ret_left, corners_left = cv2.findChessboardCorners(img_left, chessboard_size, None)ret_right, corners_right = cv2.findChessboardCorners(img_right, chessboard_size, None)if ret_left and ret_right:
添加角点坐标objpoints.append(objp)imgpoints_left.append(corners_left)imgpoints_right.append(corners_right)
单目标定 ret_left, mtx_left, dist_left, rvecs_left, tvecs_left = cv2.calibrateCamera(objpoints, imgpoints_left, img_left.shape[:2], None, None ) ret_right, mtx_right, dist_right, rvecs_right, tvecs_right = cv2.calibrateCamera(objpoints, imgpoints_right, img_right.shape[:2], None, None )
双目标定 ret, mtx_left, dist_left, mtx_right, dist_right, R, T, E, F = cv2.stereoCalibrate(objpoints,imgpoints_left,imgpoints_right,mtx_left,dist_left,mtx_right,dist_right,img_left.shape[:2],None,None,None,None,cv2.CALIB_FIX_INTRINSIC, )
立体校正 R1, R2, P1, P2, Q, roi_left, roi_right = cv2.stereoRectify(mtx_left, dist_left, mtx_right, dist_right, img_left.shape[:2], R, T )
计算校正映射 map1_left, map2_left = cv2.initUndistortRectifyMap(mtx_left, dist_left, R1, P1, img_left.shape[:2], cv2.CV_32FC1 ) map1_right, map2_right = cv2.initUndistortRectifyMap(mtx_right, dist_right, R2, P2, img_right.shape[:2], cv2.CV_32FC1 )
读取测试图像并校正 img_left = cv2.imread("left/test.jpg") img_right = cv2.imread("right/test.jpg")img_rectified_left = cv2.remap(img_left, map1_left, map2_left, cv2.INTER_LINEAR) img_rectified_right = cv2.remap(img_right, map1_right, map2_right, cv2.INTER_LINEAR)
显示校正后的图像 cv2.imshow("Rectified Left", img_rectified_left) cv2.imshow("Rectified Right", img_rectified_right) cv2.waitKey(0) ```
总结 本文介绍了使用 OpenCV 进行双目标定的步骤和代码示例。双目标定是获取场景深度信息的必要步骤,在机器人导航、三维重建等领域有着广泛的应用。