Python相机标定:从理论到实践,附完整代码394


相机标定是计算机视觉领域的基础任务,它旨在确定相机内参和外参矩阵,从而将图像中的像素坐标与三维世界坐标建立联系。准确的相机标定结果对于三维重建、目标识别、增强现实等应用至关重要。本文将深入探讨Python相机标定的理论基础和实践方法,并提供完整的代码示例。

一、相机标定理论基础

相机标定需要考虑相机内参和外参。内参描述了相机自身的几何特性,包括焦距(fx, fy)、主点坐标(cx, cy)、以及径向畸变系数(k1, k2, ...)等。外参则描述了相机在世界坐标系中的位置和姿态,由旋转矩阵R和平移向量t表示。

相机成像模型通常采用针孔模型进行简化,其数学表达为:

s[u, v, 1]^T = K[R | t][X, Y, Z, 1]^T

其中:
[u, v]^T: 像素坐标
s: 比例因子
K: 相机内参矩阵,K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]]
[R | t]: 相机外参矩阵,R为旋转矩阵,t为平移向量
[X, Y, Z]^T: 世界坐标

由于镜头畸变的存在,实际成像过程会偏离理想的针孔模型。常用的畸变模型包括径向畸变和切向畸变。径向畸变主要由透镜形状引起,切向畸变则由透镜安装不正造成。这些畸变可以通过多项式模型进行近似。

二、Python相机标定实践

Python提供了丰富的库来进行相机标定,其中OpenCV是一个常用的选择。OpenCV的`()`函数可以根据一系列标定板图像计算相机内参和外参。

以下是一个完整的Python相机标定代码示例,使用OpenCV库和棋盘格标定板:```python
import cv2
import numpy as np
import glob
# 棋盘格尺寸
CHECKERBOARD = (6, 9) # 6x9 个内角点
# 准备对象点,世界坐标系中的三维点
objp = ((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = [0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].(-1, 2)
# 存储对象点和图像点
objpoints = [] # 3d点在世界坐标系中的坐标
imgpoints = [] # 2d点在图像平面中的像素坐标
# 读取所有棋盘格图像
images = ('*.jpg')
for fname in images:
img = (fname)
gray = (img, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = (gray, CHECKERBOARD, None)
# 如果找到角点
if ret:
(objp)
corners2 = (gray, corners, (11, 11), (-1, -1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
(corners2)
# 绘制角点
(img, CHECKERBOARD, corners2, ret)
('img', img)
(500)
()
# 相机标定
ret, mtx, dist, rvecs, tvecs = (objpoints, imgpoints, [::-1], None, None)
# 打印相机内参和畸变系数
print("相机内参矩阵:", mtx)
print("畸变系数:", dist)
# 保存标定结果
('', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)
```

三、代码详解

这段代码首先定义了棋盘格的尺寸,然后创建了对象点,即棋盘格角点在世界坐标系中的坐标。 接下来,它循环遍历所有标定板图像,使用`()`函数查找棋盘格角点,并使用`()`函数进行亚像素级精确定位。找到角点后,将其添加到`objpoints`和`imgpoints`列表中。最后,使用`()`函数进行相机标定,计算相机内参矩阵、畸变系数、旋转向量和平移向量。标定结果被保存到一个`.npz`文件中。

四、注意事项

为了获得准确的标定结果,需要遵循以下几点:
使用高质量的标定板,确保其平面度和角点清晰可见。
拍摄多张不同角度的标定板图像,至少10张以上,越多越好。
确保标定板在图像中占据足够大的比例。
避免图像模糊和光照不均。

五、总结

本文介绍了Python相机标定的理论基础和实践方法,并提供了完整的代码示例。通过学习本文,读者可以掌握相机标定的基本原理和操作步骤,为后续的计算机视觉应用奠定基础。 记住替换代码中的 `'*.jpg'` 为你实际的图片文件路径。 同时,根据你的棋盘格尺寸调整 `CHECKERBOARD` 变量。

2025-07-16


上一篇:Python代码缩进:规范、最佳实践与常见问题

下一篇:Python 用户注册系统:安全可靠的代码实现与最佳实践