OpenCV 鱼眼相机标定指南

在计算机视觉领域,鱼眼摄像头因其广阔的视野和独特的成像特性而受到广泛应用。然而,由于鱼眼相机的畸变性质,进行精确的相机标定成为了一项重要的工作。本文将介绍如何使用 OpenCV 在 Python 中进行鱼眼相机的标定,并附带相关代码示例。

鱼眼相机标定的基本概念

鱼眼相机标定的主要目的是确定相机的内在参数和外在参数,以便消除图像中的畸变。这里,我们主要关注内参矩阵(包括焦距和主点)和畸变系数。鱼眼标定通常需要使用标定板(如棋盘格)来获取多组图像。

标定步骤
  1. 收集棋盘格图像:拍摄多张包含棋盘格的图像,尽量在不同角度和距离下拍摄,以获取丰富的视角信息。
  2. 检测角点:使用 OpenCV 的 findChessboardCorners 函数检测棋盘格的角点。
  3. 角点从图像空间转换到世界空间:定义棋盘格的真实世界坐标。
  4. 进行标定:使用 OpenCV 的 calibrateCamera 函数进行标定,获取相机的内参和畸变系数。
  5. 校正图像:使用获得的参数校正图像。

代码示例

以下是一个基本的鱼眼相机标定的代码示例,其中包含了上述步骤。

1. 安装必要的库
pip install opencv-python opencv-contrib-python numpy
  • 1.
2. 收集图像

确保准备好用于标定的棋盘格图像,存放在一个文件夹内。例如,将它们存储在 images 文件夹下。

3. Python代码

下面的代码展示了如何进行鱼眼相机的标定:

import numpy as np
import cv2
import glob

# 设置棋盘格尺寸
CHECKERBOARD = (7, 7)
# 设置每个格子的实际尺寸(单位:cm)
SQUARE_SIZE = 2.5

# 准备对象点和图像点
objp = np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2) * SQUARE_SIZE
objpoints = []  # 3D点
imgpoints = []  # 2D点

# 加载图像
images = glob.glob('images/*.jpg')

for img in images:
    image = cv2.imread(img)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 查找棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)
    
    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)

# 进行标定
ret, mtx, dist, rvecs, tvecs = cv2.fisheye.calibrate(objpoints, imgpoints, gray.shape[::-1], None, None)

# 打印标定结果
print("Camera matrix : \n", mtx)
print("Distortion coefficients : \n", dist)

# 校正图像
for img in images:
    image = cv2.imread(img)
    h, w = image.shape[:2]
    new_camera_mtx, roi = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(mtx, dist, (w, h), np.eye(3), balance=0)
    undistorted = cv2.fisheye.undistortImage(image, mtx, dist, None, new_camera_mtx)
    
    # 显示校正后的图像
    cv2.imshow("Undistorted", undistorted)
    cv2.waitKey(0)

cv2.destroyAllWindows()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
代码详解
  1. 设置棋盘格尺寸:定义棋盘格的行列数以及每个格子的实际大小。
  2. 加载图像:使用 glob 模块加载所有棋盘格图像。
  3. 查找角点:使用 findChessboardCorners 函数检测图像中的角点。
  4. 标定过程:使用 fisheye.calibrate 方法进行标定,获得相机内参和畸变系数。
  5. 图像校正:生成新的相机矩阵,通过 undistortImage 校正图像,并使用 OpenCV 显示结果。
结果示例

在成功标定后,可以通过展示未校正和校正后图像的比较,来更直观地了解标定效果。

PC Camera User PC Camera User 拍摄棋盘格图像 图像捕获完成 上传图像进行处理 检测棋盘格角点 进行鱼眼相机标定 返回内参和畸变系数 请求图像校正 返回校正后的图像

总结与展望

鱼眼相机标定是计算机视觉中的一项基础且重要的任务,能够帮助我们在图像处理和物体识别中得到更好的结果。通过使用 OpenCV,我们能够相对轻松地完成这一过程。正如本文示例所示,只需几个步骤即可完成相机的标定和图像的校正。

未来,我们可以探索更高级的标定方法,例如使用深度学习来进一步优化标定过程,或提高标定的精度和速度。这些研究将有助于增强鱼眼相机在各类应用中的可用性和可靠性。希望本文能够为大家提供鱼眼相机标定的初步认识,并激励您更深入地探索这一领域。