opencv畸变(opencv畸变校正源码)

## OpenCV 中的畸变校正### 1. 简介在计算机视觉领域,相机镜头会引入几何畸变,导致图像中的直线扭曲,平行线看起来会汇聚,以及其他几何失真。这些畸变会影响图像的精确度和测量结果,因此需要进行校正。OpenCV 提供了强大的工具来检测和校正图像中的畸变。### 2. 畸变类型主要有两种类型的镜头畸变:

2.1. 径向畸变:

这种畸变会导致图像中的直线在远离图像中心时弯曲。它通常表现为:

桶形畸变:

图像边缘向内弯曲,类似于桶形。

枕形畸变:

图像边缘向外弯曲,类似于枕头形状。

2.2. 切向畸变:

这种畸变会导致图像中的直线倾斜,并且图像中心点会发生偏移。### 3. 畸变校正步骤OpenCV 提供了以下步骤来校正图像畸变:

3.1. 棋盘格标定:

首先,使用棋盘格图案来标定相机。棋盘格的角点提供了一组已知的3D点,用于建立相机模型。

3.2. 提取角点:

使用 OpenCV 的`findChessboardCorners()`函数来检测棋盘格上的角点。

3.3. 计算相机参数:

通过已知的3D点和检测到的2D角点,使用`calibrateCamera()`函数计算相机参数,包括内参矩阵、畸变系数和旋转矩阵、平移向量。

3.4. 校正图像:

使用`undistort()`函数根据计算出的相机参数校正图像,将畸变后的图像转换为理想的无畸变图像。### 4. 代码示例```python import cv2 import numpy as np# 加载棋盘格图像 img = cv2.imread("chessboard.jpg")# 棋盘格尺寸 CHECKERBOARD_SIZE = (9, 6)# 寻找棋盘格角点 ret, corners = cv2.findChessboardCorners(img, CHECKERBOARD_SIZE)# 可视化角点 cv2.drawChessboardCorners(img, CHECKERBOARD_SIZE, corners, ret) cv2.imshow("Corners", img) cv2.waitKey(0)# 标定相机 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((CHECKERBOARD_SIZE[0]

CHECKERBOARD_SIZE[1], 3), np.float32) objp[:, :2] = np.mgrid[0:CHECKERBOARD_SIZE[0], 0:CHECKERBOARD_SIZE[1]].T.reshape(-1, 2)# 存储所有角点和对应的3D点 objpoints = [] imgpoints = []if ret == True:objpoints.append(objp)corners2 = cv2.cornerSubPix(img, corners, (11, 11), (-1, -1), criteria)imgpoints.append(corners2)# 计算相机参数 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img.shape[::-1], None, None)# 校正图像 dst = cv2.undistort(img, mtx, dist, None, mtx)# 显示校正后的图像 cv2.imshow("Undistorted Image", dst) cv2.waitKey(0) cv2.destroyAllWindows() ```### 5. 总结通过 OpenCV 的畸变校正功能,可以有效地消除图像中的镜头畸变,提高图像质量,为后续图像处理和分析提供准确的几何信息。### 6. 应用场景畸变校正广泛应用于各种计算机视觉应用中,例如:

三维重建:

校正后的图像可以更准确地进行三维重建。

图像拼接:

校正后的图像可以更好地拼接在一起,生成无缝的图像。

目标检测:

畸变校正可以提高目标检测的精度。

自动驾驶:

校正后的图像可以用于自动驾驶系统中的道路识别和障碍物检测。### 7. 注意事项

棋盘格的尺寸和位置应尽可能覆盖整个图像区域,以获得最佳的标定效果。

标定过程中使用的图像数量越多,标定结果越准确。

实际应用中,由于环境光照和相机参数的影响,可能需要进行一些微调,才能获得最佳的畸变校正效果。

OpenCV 中的畸变校正

1. 简介在计算机视觉领域,相机镜头会引入几何畸变,导致图像中的直线扭曲,平行线看起来会汇聚,以及其他几何失真。这些畸变会影响图像的精确度和测量结果,因此需要进行校正。OpenCV 提供了强大的工具来检测和校正图像中的畸变。

2. 畸变类型主要有两种类型的镜头畸变:**2.1. 径向畸变:** 这种畸变会导致图像中的直线在远离图像中心时弯曲。它通常表现为:* **桶形畸变:** 图像边缘向内弯曲,类似于桶形。 * **枕形畸变:** 图像边缘向外弯曲,类似于枕头形状。**2.2. 切向畸变:** 这种畸变会导致图像中的直线倾斜,并且图像中心点会发生偏移。

3. 畸变校正步骤OpenCV 提供了以下步骤来校正图像畸变:**3.1. 棋盘格标定:** 首先,使用棋盘格图案来标定相机。棋盘格的角点提供了一组已知的3D点,用于建立相机模型。**3.2. 提取角点:** 使用 OpenCV 的`findChessboardCorners()`函数来检测棋盘格上的角点。**3.3. 计算相机参数:** 通过已知的3D点和检测到的2D角点,使用`calibrateCamera()`函数计算相机参数,包括内参矩阵、畸变系数和旋转矩阵、平移向量。**3.4. 校正图像:** 使用`undistort()`函数根据计算出的相机参数校正图像,将畸变后的图像转换为理想的无畸变图像。

4. 代码示例```python import cv2 import numpy as np

加载棋盘格图像 img = cv2.imread("chessboard.jpg")

棋盘格尺寸 CHECKERBOARD_SIZE = (9, 6)

寻找棋盘格角点 ret, corners = cv2.findChessboardCorners(img, CHECKERBOARD_SIZE)

可视化角点 cv2.drawChessboardCorners(img, CHECKERBOARD_SIZE, corners, ret) cv2.imshow("Corners", img) cv2.waitKey(0)

标定相机 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((CHECKERBOARD_SIZE[0] * CHECKERBOARD_SIZE[1], 3), np.float32) objp[:, :2] = np.mgrid[0:CHECKERBOARD_SIZE[0], 0:CHECKERBOARD_SIZE[1]].T.reshape(-1, 2)

存储所有角点和对应的3D点 objpoints = [] imgpoints = []if ret == True:objpoints.append(objp)corners2 = cv2.cornerSubPix(img, corners, (11, 11), (-1, -1), criteria)imgpoints.append(corners2)

计算相机参数 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img.shape[::-1], None, None)

校正图像 dst = cv2.undistort(img, mtx, dist, None, mtx)

显示校正后的图像 cv2.imshow("Undistorted Image", dst) cv2.waitKey(0) cv2.destroyAllWindows() ```

5. 总结通过 OpenCV 的畸变校正功能,可以有效地消除图像中的镜头畸变,提高图像质量,为后续图像处理和分析提供准确的几何信息。

6. 应用场景畸变校正广泛应用于各种计算机视觉应用中,例如:* **三维重建:** 校正后的图像可以更准确地进行三维重建。 * **图像拼接:** 校正后的图像可以更好地拼接在一起,生成无缝的图像。 * **目标检测:** 畸变校正可以提高目标检测的精度。 * **自动驾驶:** 校正后的图像可以用于自动驾驶系统中的道路识别和障碍物检测。

7. 注意事项* 棋盘格的尺寸和位置应尽可能覆盖整个图像区域,以获得最佳的标定效果。 * 标定过程中使用的图像数量越多,标定结果越准确。 * 实际应用中,由于环境光照和相机参数的影响,可能需要进行一些微调,才能获得最佳的畸变校正效果。

标签列表