计算机视觉:OpenCV相机标定

计算机视觉: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张棋盘格图片

image-20230516202247280

若需要自己准备棋盘格,参考博客: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)



实验结果:

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

image-20230516203427289

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

image-20230516201945279

image-20230516202035737

image-20230516202101035

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,提供了很多计算机视觉相关的函数和算法。相机标定计算机视觉中一个重要的步骤,用于确定相机的内参和外参参数,从而提高计算机视觉的精确度。 opencv相机标定例程是使用OpenCV库函数进行相机标定的示例代码。它包含了一系列对相机进行标定的步骤: 1. 收集标定图像:首先需要收集一组标定图像,这些图像应该包含特定的模式,比如棋盘格。这些图像可以通过相机拍摄或者从其他来源获取。 2. 提取角点:使用OpenCV的函数在标定图像中提取角点。这些角点的提取可以通过函数`findChessboardCorners`来实现,它会返回检测到的角点的坐标。 3. 标定相机:使用提取到的角点坐标,调用OpenCV的函数`calibrateCamera`完成相机的标定。该函数将返回相机的内参矩阵,畸变系数和旋转矩阵。 4. 评估标定结果:标定完成后,可以使用OpenCV的函数`getOptimalNewCameraMatrix`来优化内参矩阵,并使用`initUndistorRectifyMap`函数生成畸变校正的映射。 5. 应用标定结果:使用标定得到的内参矩阵和畸变系数,可以对图像进行畸变校正,使得图像不再有畸变。 OpenCV相机标定例程提供了一个完整的流程,帮助用户准确地对相机进行标定,从而提高计算机视觉算法的准确性和鲁棒性。同时,用户可以根据自己的需求,对例程进行修改和扩展,以适应具体的应用场景。 ### 回答2: OpenCV相机标定例程是一个用于校准相机的程序。相机标定是指确定相机内部和外部参数的过程,以便在三维世界中更准确地测量物体或跟踪物体。 首先,我们需要收集一些被称为棋盘格的二维图像。在例程中,我们使用棋盘格作为标定目标,因为它具有规则的结构和易于检测的特征。然后,我们将这些图像加载到程序中进行处理。 接下来,我们使用OpenCV的标定函数来计算相机的内部参数,例如焦距、主点坐标和径向畸变系数。这些参数将用于校正图像并更准确地测量物体。 在这个例程中,我们使用棋盘格的角点作为特征点来进行标定。我们可以通过使用OpenCV的函数在棋盘格图像中检测角点。然后,我们将这些角点的二维像素坐标与它们在三维空间中的真实坐标进行匹配。 通过对多个图像进行角点的检测和匹配,我们可以获得足够的数据来计算相机的内部参数。一旦内部参数被计算出来,我们就可以将其保存在文件中以备将来使用。 通过相机标定例程,我们可以获得相机的校准参数,从而提高图像的质量和精度。这在计算机视觉应用中特别重要,例如目标跟踪、SLAM(同时定位与地图构建)和立体视觉。 ### 回答3: OpenCV相机标定例程是一种用于标定相机内外参数的方法。相机标定是指确定相机的一些固有参数,如焦距、畸变等,以便于后续图像处理或计算机视觉任务的进行。 OpenCV提供了一个相机标定例程函数`calibrateCamera()`,通过将相机拍摄的多张已知世界坐标和相应图像坐标的图像进行处理,来估计相机的内外参数。 首先,需要收集一组已知世界坐标和相应图像坐标的图像样本。已知世界坐标通常需要以某个坐标系为基准,例如一个棋盘格。然后,通过使用OpenCV提供的函数`findChessboardCorners()`来检测图像中棋盘格角点的位置。 接下来,通过调用`calibrateCamera()`函数,将已知的世界坐标和对应的图像坐标作为输入参数,获得相机的内外参数。该函数将返回相机的一些参数,如相机矩阵、畸变系数、旋转矩阵和平移向量等。 最后,可以使用相机的内外参数进行图像处理或计算机视觉任务。例如,可以通过使用函数`undistort()`对相机采集到的图像进行去畸变操作,从而使图像更符合实际场景。 总之,OpenCV相机标定例程是一种用于确定相机内外参数的方法,通过使用已知的世界坐标和图像坐标的样本,可以得到相机的一些固有参数,以便于后续的图像处理或计算机视觉任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值