Python 进行相机标定

1. 基本原理

相机标定的目的之一是为了建立物体从三维世界到二维成像平面上各坐标点的对应关系,所以首先我们需要定义这样几个坐标系:
(1)世界坐标系
世界坐标系是系统的绝对坐标系,是一个三维坐标系,为了描述目标物在真实世界里的位置而被引入。
(2)相机坐标系
在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,是以光轴与图像平面的交点为图像坐标系的原点所构成的直角坐标系。是一个作为沟通世界坐标系和图像坐标系的中间坐标系。
(3)像平面坐标系
二维坐标系,在一个图像平面中,以平面的中心像主点P为原点和坐标轴x,y组成了图片坐标系。是为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系
(4)像素坐标系
为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是真正从相机内读取到的信息所在的坐标系。

2. 计算步骤

1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向(这里拍摄15-20张)的照片。
3、从照片中提取棋盘格角点。(Harris角点)
4、估算理想无畸变的情况下,五个内参和六个外参。
5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
6、极大似然法,优化估计,提升估计精度。

3. 数学原理

3.1 外参的计算

设三维世界坐标的点坐标为 M = [ X , Y , Z ] T M=[X,Y,Z]^T M=[X,Y,Z]T,二维相机平面的像素点为 m = [ u , v ] T m=[u,v]^T m=[u,v]T,齐次坐标为 m ~ = [ u , v , 1 ] T \widetilde{m}=[u,v,1]^T m =[u,v,1]T, M ~ = [ X , Y , Z , 1 ] T \widetilde{M}=[X,Y,Z,1]^T M =[X,Y,Z,1]T.
所以标定用的棋盘格平面到图像平面的单应性关系为
s m ~ = A [ R T ] M ~ s\widetilde{ {m}}=A\begin{bmatrix}R & T\end{bmatrix}\widetilde{M} sm =A[RT]M
A = [ α γ u 0 0 β v 0 0 0 1 ] A=\begin{bmatrix}\alpha & \gamma & u_{0}\\ 0 & \beta &v_0 \\ 0 & 0 & 1\end{bmatrix} A=α00γβ0u0v01
其中,
S:世界坐标系到像平面坐标系的尺度因子
A:相机的内参矩阵
( u 0 , v 0 ) (u_0,v_0) (u0,v0): 像主点坐标
α, β: 焦距与像素横纵比的融合
γ: 径向畸变参数
因为张正友法标定只需要一张棋盘格,因此我们不妨假设棋盘格位于Z=0,所以平移向量只有 r 1 , r 2 r_1,r_2 r1r2 ,定义旋转矩阵R的第i列为 r i r_i ri, 则有:
s [ u v 1 ] = A [ r 1 r 2 r 3 t ] [ X Y 0 1 ] = A [ r 1 r 2 t ] [ X Y 1 ] s\begin{bmatrix}u\\ v\\ 1\end{bmatrix}=A\begin{bmatrix}r_1 & r_2 &r_3&t\end{bmatrix}\begin{bmatrix}X\\ Y\\ 0\\ 1\end{bmatrix}=A\begin{bmatrix}r_1 &r_2 &t \end{bmatrix}\begin{bmatrix}X\\ Y\\ 1\end{bmatrix} suv1=A[r1r2r3t]XY01=A[r1r2t]XY1
于是空间到图像的映射可以改为 s m ~ = H M ~ , H = A [ r 1 r 2 t ] s\widetilde{m}=H\widetilde{M},H=A\begin{bmatrix}r_1 &r_2 & t\end{bmatrix} sm =HM ,H=A[r1r2t].
在这里描述的是空间中平面三维点和相机平面二维点之间的关系。因为相机平面中点的坐标可以通过图像处理的方式(如Harris角点)获取,而空间平面中三维点可以通过事先做好的棋盘获取。所以也就是说每张图片都可以计算出一个H矩阵
 其中H 是描述Homographic矩阵。H是一个齐次矩阵,所以有8个未知数,至少需要8个方程,每对对应点能提供两个方程,所以至少需要四个对应点,就可以算出世界平面到图像平面的单应性矩阵H.
 令 H = [ h 1 h 2 h 3 ] H=\begin{bmatrix}h_1 &h_2 &h_3 \end{bmatrix} H=[h1h2h3],
[ h 1 h 2 h 3 ] = λ A [ r 1 r 2 t ] \begin{bmatrix}h_1 &h_2 &h_3 \end{bmatrix}=\lambda A\begin{bmatrix}r_1 &r_2 &t \end{bmatrix} [h1h2h3]=λA[r1r2t]
 通过上述等式的矩阵运算,根据正交和归一化的约束可以得到如下等式:
h 1 T A − T A − 1 h 2 = 0 , h 1 T A − T A − 1 h 1 = h 2 T A − T A − 1 h 2 h_1^T A^{-T}A^{-1}h_2=0,h_1^T A^{-T}A^{-1}h_1 = h_2^T A^{-T}A^{-1}h_2 h1TATA

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值