OpenCV 畸变校正的 Python 实现指南

在计算机视觉和图像处理中,畸变校正是一个非常重要的步骤,尤其在使用广角镜头拍摄时。本文将指导你如何使用Python中的OpenCV库来实现图像畸变校正。接下来的内容将分为几个重要步骤:

整体流程

在实现畸变校正之前,我们需要了解处理过程中的主要步骤,下面是一个简要的流程表:

步骤 描述
1. 收集数据 获取用于标定的棋盘格图像
2. 进行标定 使用棋盘格图像进行相机标定
3. 保存标定参数 保存相机矩阵和畸变系数到文件
4. 畸变校正 使用标定参数对实际图像进行畸变校正

接下来,我们将逐步展开每个步骤,并提供相应的代码示例。

步骤1: 收集数据

在这一阶段,您需要拍摄一系列棋盘格图像。这些图像用作相机标定的输入。一般来说,至少需要十张不同角度和距离的图像。确保棋盘格的大小和内角的数量是已知的。

步骤2: 进行标定

接下来,我们需要使用这些图像进行相机标定。在此步骤中,使用OpenCV的findChessboardCornerscalibrateCamera函数来提取角点并计算相机矩阵。

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的功能,并进一步提升你的计算机视觉技能!