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