相机标定 校正(Camera Calibration)

相机标定是计算机视觉领域中的一个重要任务,目的是确定相机的内部参数和外部参数。内部参数包括相机的焦距,畸变系数等,而外部参数则是相机在不同位置和方向下的转换矩阵。

通常,相机标定过程可以分为两个步骤:第一步是计算内部参数,第二步是获取相机的外部参数。在此之前,我们需要收集不同角度,不同距离的图像。这些图像应该包含有标注的图案,如棋盘格、立方体等,以便后续计算。

计算内部参数

内部参数的计算首先需要消除图像畸变。图像畸变主要由镜头和相机传感器本身的不足引起,通常表现为图像中心无法完全对齐,一些图像区域会变形或者出现扭曲的情况。

根据针孔相机模型,我们可以推导出相机内部参数的计算公式:

$$x=\frac{X}{Z}f_x+O_x,y=\frac{Y}{Z}f_y+O_y$$

其中$x$,$y$为图像坐标,$X$,$Y$,$Z$为物体坐标,$f_x$,$f_y$为相机的焦距,$O_x$,$O_y$为图像坐标原点的坐标。

在实际应用中,我们使用基于最小二乘法的相机标定算法进行标定。这种算法通过使用重复采集的样本图像,来估算相机内部参数。OpenCV中提供了一个函数 ```cv2.calibrateCamera``` 来进行相机标定。这个函数会返回一个相机矩阵,包括焦距、图像原点等参数;以及畸变系数,用于消除图像畸变。

获取外部参数

外部参数的计算需要先将标定图案的三维坐标系转化为相机坐标系,然后使用最小二乘法来估计相机的旋转矢量和平移矢量。

OpenCV也提供了一个函数 ```cv2.solvePnP``` 来估算外部参数。该函数需要输入三维坐标系映射到二维图像上的坐标,以及相应的相机内部参数即可。

参考案例

下面是一个使用OpenCV进行相机标定的案例:

```python

import numpy as np

import cv2

import glob

# 棋盘格模板大小

pattern_size = (9, 6)

# 准备待标定的图像

images = glob.glob('calib_image/*.jpg')

object_points = [] # 记录物理坐标

image_points = [] # 记录图像坐标

object_point = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)

object_point[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * 20

for fname in images:

img = cv2.imread(fname)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 查找棋盘格图案

ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

# 如果找到棋盘格,则添加到标定点列表

if ret:

object_points.append(object_point)

image_points.append(corners)

# 进行相机标定

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)

# 计算图像畸变矫正后的效果

for fname in images:

img = cv2.imread(fname)

h, w = img.shape[:2]

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

# 畸变校正

dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

x, y, w, h = roi

dst = dst[y:y+h, x:x+w]

# 显示结果

cv2.imshow('calibrated image', dst)

cv2.waitKey(500)

```

以上代码中,我们首先通过读取文件夹中的图片,使用OpenCV的```cv2.findChessboardCorners```函数找到棋盘格图案,得到对应的物理坐标和图像坐标。 然后,我们将得到的物理坐标和图像坐标的列表,传入```cv2.calibrateCamera```函数中,得到相机的内部参数和畸变系数。最后,我们再使用相机内部参数,对输入的图像进行畸变校正,得到校正后的输出图像。

相机标定和畸变矫正是计算机视觉应用中不可或缺的一部分,使我们能够更好地处理输入的图像数据,提高计算机视觉算法的准确度和稳定性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(17) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部