计算机视觉:OpenCV相机标定

计算机视觉:OpenCV相机标定

文章目录

  • 计算机视觉:OpenCV相机标定
    • 1.针孔照相机模型:
    • 2.相机标定
      • Python+OpenCV实现相机标定

1.针孔照相机模型:

针孔照相机模型是一种经典的相机模型,它将相机视为一个针孔,将场景中的点投影到成像平面上。在这个模型中,相机的内参和外参描述了相机的几何形状和相机的姿态。

相机的内参矩阵描述了相机的内部几何形状,包括相机的焦距、像素尺寸和像素坐标原点。相机的内参矩阵可以表示为:

K = [ f_x   0    c_x ]
    [  0   f_y   c_y ]
    [  0    0     1  ]

其中,f_x 和 f_y 是相机的水平和垂直焦距,c_x 和 c_y 是相机的像素坐标原点。这个矩阵通常被称为相机的内参矩阵。

相机的外参矩阵描述了相机的姿态,包括相机的位置和方向。相机的外参矩阵通常用旋转矩阵和平移向量来表示,即:

[R | T]

其中,R 是一个 3x3 的旋转矩阵,T 是一个 3x1 的平移向量。这个矩阵通常被称为相机的外参矩阵。

2.相机标定

相机标定是指确定相机的内参矩阵和外参矩阵的过程

在这个过程中,我们需要使用已知的场景和相机拍摄的图像来计算相机的内参矩阵和外参矩阵。

下面是相机标定的一般步骤:

  1. 拍摄多张图像,图像中包含已知的场景(例如棋盘格)。
  2. 提取图像中的特征点,例如角点。
  3. 使用角点来计算相机的内参矩阵和外参矩阵。

Python+OpenCV实现相机标定

准备了下面10张棋盘格图片

计算机视觉:OpenCV相机标定_第1张图片

若需要自己准备棋盘格,参考博客:http://t.csdn.cn/EOpir

实现代码:

import numpy as np
import cv2
import glob

# 准备棋盘格的角点坐标
pattern_size = (8, 11)
objpoints = []  # 存储棋盘格角点的世界坐标系
imgpoints = []  # 存储棋盘格角点的图像坐标系

# 生成棋盘格角点的世界坐标系
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)

# 获取棋盘格图像文件列表
images = glob.glob('ex4/calimg/*.jpg')

for image_path in images:
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


    # cv2.imshow(image_path,gray)
    # cv2.waitKey(0)


    # 检测棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

    # print(ret)
    # print(corners)
    
    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)

# 进行相机标定
ret, camera_matrix, distortion_coeffs, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None
)

# 打印相机内参矩阵
print("相机内参矩阵:")
print(camera_matrix)

# 打印相机畸变系数
print("相机畸变系数:")
print(distortion_coeffs)

# 打印相机外参矩阵
print("相机外参矩阵:")
for i in range(len(rvecs)):
    print("第 %d 张图像:" % (i + 1))
    rotation_matrix, _ = cv2.Rodrigues(rvecs[i])
    extrinsic_matrix = np.concatenate((rotation_matrix, tvecs[i]), axis=1)
    print(extrinsic_matrix)



实验结果:

输出的内参外参矩阵以及畸变系数如下:

计算机视觉:OpenCV相机标定_第2张图片

实验结果分析:已知有十张棋盘格图像,结果只输出七张图像的对应外参矩阵,其原因是下列三张标定图像:无法被cv2.findChessboardCorners()检测出角点,因此无法求外参矩阵,可以使用质量更好的图像或者更换角点检测算法、调整角点检测算法的参数来解决此问题。

计算机视觉:OpenCV相机标定_第3张图片

计算机视觉:OpenCV相机标定_第4张图片

计算机视觉:OpenCV相机标定_第5张图片

你可能感兴趣的:(计算机视觉,计算机视觉,opencv,数码相机)