OpenCV 畸变校正的 Python 实现指南
在计算机视觉和图像处理中,畸变校正是一个非常重要的步骤,尤其在使用广角镜头拍摄时。本文将指导你如何使用Python中的OpenCV库来实现图像畸变校正。接下来的内容将分为几个重要步骤:
整体流程
在实现畸变校正之前,我们需要了解处理过程中的主要步骤,下面是一个简要的流程表:
| 步骤 | 描述 |
|---|---|
| 1. 收集数据 | 获取用于标定的棋盘格图像 |
| 2. 进行标定 | 使用棋盘格图像进行相机标定 |
| 3. 保存标定参数 | 保存相机矩阵和畸变系数到文件 |
| 4. 畸变校正 | 使用标定参数对实际图像进行畸变校正 |
接下来,我们将逐步展开每个步骤,并提供相应的代码示例。
步骤1: 收集数据
在这一阶段,您需要拍摄一系列棋盘格图像。这些图像用作相机标定的输入。一般来说,至少需要十张不同角度和距离的图像。确保棋盘格的大小和内角的数量是已知的。
步骤2: 进行标定
接下来,我们需要使用这些图像进行相机标定。在此步骤中,使用OpenCV的findChessboardCorners和calibrateCamera函数来提取角点并计算相机矩阵。
import cv2
import numpy as np
import glob
# 设置棋盘格规格
chessboard_size = (9, 6) # 内角点的数目
square_size = 0.025 # 棋盘格每个方格的真实大小(米)
# 准备对象点,如(0,0,0), (1,0,0), (2,0,0)...,(8,5,0)
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 = [] # 3D点
imgpoints = [] # 2D点
# 读取棋盘格图像
images = glob.glob('calibration_images/*.png') # 替换为你的图像路径
for img_path in images:
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 输出相机矩阵和畸变系数
print("Camera matrix:\n", mtx)
print("Distortion coefficients:\n", dist)
代码解释:
- 我们定义了棋盘格的规格和每个方格的真实大小。
- 使用
glob库读取图像。 findChessboardCorners函数用来查找棋盘上的角点。calibrateCamera函数计算相机的内参数矩阵和畸变系数。
步骤3: 保存标定参数
将相机矩阵和畸变系数保存到文件中,以便之后的使用。
import pickle
# 保存相机参数
with open('camera_params.pkl', 'wb') as f:
pickle.dump({'camera_matrix': mtx, 'dist_coeffs': dist}, f)
步骤4: 畸变校正
现在可以使用标定参数校正实际图像的畸变。您只需加载保存的参数并使用undistort函数。
# 加载相机参数
with open('camera_params.pkl', 'rb') as f:
params = pickle.load(f)
mtx = params['camera_matrix']
dist = params['dist_coeffs']
# 加载并校正图像
img = cv2.imread('test_image.png') # 替换为你的图像路径
h, w = img.shape[:2]
# 校正图像
new_mtx, _ = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
undistorted_img = cv2.undistort(img, mtx, dist, None, new_mtx)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Undistorted Image', undistorted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释:
- 我们加载之前保存的相机参数。
- 使用
getOptimalNewCameraMatrix来获得新的相机矩阵,并用undistort函数进行校正。
结语
通过上述步骤,你可以轻松使用Python和OpenCV进行图像的畸变校正。在真实项目中,确保使用良好的数据进行模型训练,并仔细评估校正结果的质量。希望这篇文章对你有帮助!如果有任何问题,欢迎与我联系。
类图与旅行图
classDiagram
class CameraCalibrator {
+findCorners()
+calibrate()
+saveParameters()
+loadParameters()
+undistortImage()
}
journey
title 畸变校正的步骤
section 收集棋盘格图像
拍摄棋盘格图像: 5: 角色1
section 相机标定
查找棋盘格角点: 4: 角色2
计算相机参数: 4: 角色2
section 保存参数
保存相机矩阵和畸变系数: 5: 角色3
section 图像校正
读取图像并进行校正: 5: 角色4
显示校正后的图像: 5: 角色4
通过这些步骤及示例,你应能独立完成图像的畸变校正。继续探索更多OpenCV的功能,并进一步提升你的计算机视觉技能!
















