相机内参标定opencv
时间: 2024-12-31 16:24:35 浏览: 12
### 使用OpenCV进行相机内参标定
为了实现相机内参的精确标定,在此过程中会利用到棋盘格作为校准板。通过检测不同角度拍摄下的棋盘格角点位置,计算出相机内部参数矩阵以及畸变系数。
#### 准备工作
确保已经安装好了PyCharm开发环境并配置好Python解释器,并且成功导入了`opencv-python`库[^1]。如果尚未完成这些前置条件,则需先按照官方文档指导完成相应软件包的安装。
#### 获取多张含有棋盘格图案的照片
准备一系列从不同视角拍摄得到带有清晰可见黑白相间方格阵列(即标准国际象棋棋盘样式)图片集合作为输入数据源。每一张照片都应该能够清楚地显示出整个棋盘区域以便后续处理程序能准确识别特征点位。
#### 编写代码读取图像文件夹路径下所有jpg格式文件名列表
```python
import cv2
import numpy as np
import glob
# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最小误差精度0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 准备对象点坐标,例如(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0),假设使用的棋盘尺寸为7x6
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
# 存储所有的对象点和图像点用于后续计算相机姿态
objpoints = []
imgpoints = []
images = glob.glob('*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret,corners = cv2.findChessboardCorners(gray, (7,6),None)
# 如果找到则添加目标点、图像上的对应点
if ret == True:
objpoints.append(objp)
corners2=cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
# 绘制并显示角点
img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
cv2.imshow('img',img)
cv2.waitKey(500)
cv2.destroyAllWindows()
```
上述脚本实现了对指定目录内的JPEG格式图像执行遍历操作;对于每一幅符合条件的画面尝试定位其中存在的棋盘结构,并提取其顶点信息保存起来供下一步骤调用[^2]。
#### 执行相机模型拟合过程获取内外部参数估计值
当收集足够的样本之后就可以着手于实际建模环节:
```python
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print("camera matrix:\n",mtx)
print("\ndistortion coefficients:\n",dist)
```
这里运用到了`calibrateCamera()`函数来求解最佳匹配状态下的投影变换关系——也就是常说的“相机矩阵”,同时还附带给出了径向失真项的具体数值表示形式。
阅读全文