相机标定是指通过已知的相机参数,解算相机内部参数矩阵和外部参数矩阵。
文章目录
1.为什么要标定?
在工业中,更多的用户青睐于它在非接触三维尺寸测量上的应用。
所谓的三维测量是广义的三维测量,它不仅包括三维物体的重构与测量,还包括在三维空间中识别任意二维平面上的尺寸以及位置。
这种技术目前已被应用在高精度的工业模具以及装配测量中,其中任意二维平面上的尺寸检测技术应用得更为广泛。
参考文章:相机标定解析
相机的参数包含内参1和外参2,这些参数是将空间点坐标从相机坐标系转换到像素坐标系所需的。相机标定的目标是获得这些参数,使得我们可以从像素坐标系中的坐标得到图像中的坐标。
为了获取更高的测量精度,我们需要通过标定来实现坐标平面的转换以及图像的校正。
2.工业场景中常见的标定方法
在工业场景中,相机标定通常采用以下几种方法:
2.1. 使用棋盘格标定板(Checkerboard Markers)
棋盘格标定板是最常见的相机标定方法,它由黑白相间的正方形组成,棋盘格的对角线交点形成一个共用角点。使用棋盘格标定板,可以通过拍摄多张带有棋盘格的图像,并在图像中标记棋盘格的角点,从而计算相机的内外参数。
例如,可以使用一个三维棋盘格标定板(或者投影到一张二维图像上),在相机拍摄的图像中标记棋盘格的角点。然后,通过最小化相机视场中像素坐标和标定板上角点坐标之间的误差来计算相机的内外参数。
import numpy as np
import cv2
# 棋盘格尺寸
pattern_size = (9, 6)
# 准备棋盘格标定板的世界坐标
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)
# 存储棋盘格角点的世界坐标和图像坐标
objpoints = [] # 世界坐标系中的棋盘格角点
imgpoints = [] # 图像平面中的棋盘格角点
# 读取图像
images = ['image1.jpg', 'image2.jpg', 'image3.jpg'] # 替换为实际图像的文件名列表
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
# 如果找到棋盘格角点,则添加到objp