opencv单目相机标定原理
时间: 2025-04-19 13:50:40 浏览: 37
### OpenCV中单目相机标定原理
#### 一、基本概念
单目相机标定是指通过一系列已知几何特性的物体(通常是棋盘格图案)作为参照物,在不同位置拍摄多张图片,利用这些图像中的特征点计算出相机内部参数和外部参数的过程。此过程有助于后续应用如三维重建、姿态估计等。
#### 二、具体步骤解析
##### 1. 特征检测与匹配
对于每一张含有校准板的照片,程序会自动识别并定位到所有的交差点即角点的位置(u,v),这一步骤通常借助于`findChessboardCorners()`函数完成[^3]。
##### 2. 获取内外参初值
基于获取到的所有二维图像坐标及其对应的真实世界三维坐标(X,Y,Z=0)[^1],采用最小化重投影误差的方法来估算初始的内参矩阵\[A\]=\[fx, s, cx; 0 fy cy; 0 0 1\]以及外参旋转矢量rvec和平移向量tvec。其中\(f_x\)和\(f_y\)代表焦距;\(c_x,c_y\)表示主点偏移;而s则用于描述可能存在的斜率失真情况。
##### 3. 计算畸变系数
实际成像过程中不可避免地会出现镜头造成的径向(r₁,r₂,...)及切向(t₁,t₂)两种类型的形变现象。为了补偿这种影响,需要引入额外的一组变量——畸变系数k₁,k₂,p₁,p₂,q₃等,并将其加入优化目标函数之中共同参与迭代求解过程[^4]。
##### 4. 参数精调优
最后阶段是对上述所得结果做进一步精细化调整,确保整体模型拟合度达到最优水平。此时可选用Levenberg-Marquardt算法或其他非线性最优化方法实施全局搜索直至满足收敛条件为止。
```python
import numpy as np
import cv2
import glob
# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.
images = glob.glob('*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Find the chess board corners
ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
# If found, add object points, image points (after refining them)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
```
该段Python代码展示了如何使用OpenCV库执行完整的单目相机标定操作,包括读取测试集内的所有JPEG文件,寻找其中是否存在标准尺寸的国际象棋盘样式模式,进而提取精确至亚像素级别的角点数据供下一步处理之需。最终输出的是经过多次循环改进后的最佳匹配状态下的各项关键指标数值。
阅读全文
相关推荐


















