目录
1 相机标定的原理
1.1 相机标定的简介
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
1.2 相机标定的方法
我们可以把相机标定分为两个步骤。
第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R RR,t tt(相机外参)等参数。
第二步是从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K KK(相机内参)等参数。
2 相机参数
2.1 内部参数
2.2 外部参数
3 相机标定的具体策略
同步标定内部参数和外部参数,一般包括两种策略s:
1. 光学标定: 利用已知的几何信息(如定长棋盘格)实现参数求解。
2. 自标定: 在静态场景中利用 structure from motion估算参数
3.1 线性标定(线性回归)
3.2 非线性优化
4 代码实现
import cv2
import numpy as np
import glob
# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 11 #内角点个数,内角点是和其他格子连着的点
h = 8
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点
images = glob.glob('C:\\Users\\Kano\\Desktop\\1.jpg') # 标定所用图像
for fname in images:
img = cv2.imread(fname)
#压缩图片,以便显示
img = cv2.resize(img,(1920,1080))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 找到棋盘格角点
# 棋盘图像(8位灰度或彩色图像) 棋盘尺寸 存放角点的位置
ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
# 如果找到足够点对,将其存储起来
if ret == True:
# 角点精确检测
# 输入图像 角点初始坐标 搜索窗口为2*winsize+1 死区 求角点的迭代终止条件
cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
objpoints.append(objp)
imgpoints.append(corners)
# 将角点在图像上显示
cv2.drawChessboardCorners(img, (w,h), corners, ret)
cv2.imshow('findCorners',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
#标定
# 输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
# 输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# mtx:内参数矩阵
# dist:畸变系数
# rvecs:旋转向量 (外参数)
# tvecs :平移向量 (外参数)
print (("ret:"),ret)
print (("mtx:\n"),mtx) # 内参数矩阵
print (("dist:\n"),dist) # 畸变系数 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print (("rvecs:\n"),rvecs) # 旋转向量 # 外参数
print (("tvecs:\n"),tvecs) # 平移向量 # 外参数
输出参数:
ret: 0.10769648435310623
mtx:
[[1.47159031e+03 0.00000000e+00 9.65480435e+02]
[0.00000000e+00 1.50813914e+03 5.49214069e+02]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]
dist:
[[ 1.75744342e-01 -1.56267740e+00 -4.45710748e-04 1.21822038e-03
5.79619389e+00]]
rvecs:
(array([[-0.13543501],
[ 1.02603778],
[ 2.9409115 ]]),)
tvecs:
(array([[ 5.92167574],
[ 3.70225656],
[18.91027557]]),)