赞
踩
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数
。
在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定
(或摄像机标定)。
无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。在零失真相机标定法中,每一个像素矢量在空间都是独立标定的,无需知道相机内部的结构,无需建立几何模型。
相机标定是用于获取相机畸变,内参数和外参数的一个操作,是机器视觉中不可或缺的一个重要步骤。
畸变可分为两种,分别是切向畸变和径向畸变。
相机内参与镜头本身的焦距等相关,为摄像机本身特性,可通过六个参数表示为:1/dx、1/dy、s、u0、v0、f。
dx和dy表示x方向和y方向的一个像素分别占多少长度单位,即一个像素代表的实际物理值的大小;u0,v0表示图像的中心像素坐标和图像原点像素坐标之间相差的横向和纵向像素数;f为焦距;s为坐标轴倾斜参数。
在opencv文档里内参数共四个为fx、fy、u0、v0。其中fx=f*(1/dx),fy=f*(1/dy),s假设为0,因此为4个内参
fx,fy为焦距,一般情况下,二者相等,cx、cy为主点坐标(相对于成像平面)。
焦距是光学系统中衡量光的聚集或发散的度量方式,指平行光入射时从透镜光心到光聚集之焦点的距离。亦是照相机中,从镜片中心到底片或CCD等成像平面的距离。具有短焦距的光学系统比长焦距的光学系统有更佳聚集光的能力。简单的说焦距是焦点到面镜的中心点之间的距离。
相机外参矩阵描述的是相机在静态场景下相机的运动,包括旋转和平移,或者在相机固定时,运动物体的刚性运动。
相机坐标系的三个轴的旋转参数分别为(ω、δ、 θ),然后把每个轴的33旋转矩阵进行组合(即先矩阵之间相乘),得到旋转矩阵R,其大小为33;T的三个轴的平移参数(Tx、Ty、Tz)。R、T组合成成的3*4的矩阵。
世界坐标系,相机坐标系,图像物理坐标系,像素坐标系之间的关系:
世界坐标系:
根据情况而定,可以表示任何物体,此时是由于相机而引入的。单位m。
相机坐标系:
以摄像机光心为原点(在针孔模型中也就是针孔为关心),z轴与光轴重合也就是z轴指向相机的前方(也就是与成像平面垂直),x轴与y轴的正方向与物体坐标系平行,其中上图中的f为摄像机的焦距。单位m
图像物理坐标系(也叫平面坐标系):
用物理单位表示像素的位置,坐标原点为摄像机光轴与图像物理坐标系的交点位置。坐标系为图上o-xy。单位是mm。单位毫米的原因是此时由于相机内部的CCD传感器是很小的,比如8mm x 6mm。但是最后图像照片是也像素为单位比如640x480.这就涉及到了图像物理坐标系与像素坐标系的变换了。下面的像素坐标系将会讲到。
像素坐标系:
以像素为单位,坐标原点在左上角。这也是一些opencv,OpenGL等库的坐标原点选在左上角的原因。当然明显看出CCD传感器以mm单位到像素中间有转换的。举个例子,CCD传感上上面的8mm x 6mm,转换到像素大小是640x480. 假如dx表示像素坐标系中每个像素的物理大小就是1/80. 也就是说毫米与像素点的之间关系是piexl/mm.
好了四个坐标系都解释完了,接下来就说下各个坐标系中间的变换关系吧。
物体之间的坐标系变换都可以表示坐标系的旋转变换加上平移变换,则世界坐标系到相机坐标系的转换关系也是如此。绕着不同的轴旋转不同的角度得到不同的旋转矩阵。如下:
那么世界坐标系到相机坐标系的变换如下:
从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。 也可以看成是针孔模型的改变模型。满足三角形的相似定理。
此时与前面的坐标系变换不同,此时没有旋转变换,但是坐标原点位置不一致,大小不一致,则设计伸缩变换及平移变换。
综上所述,大家可以看出四个坐标系之间存在着下述关系 ( 矩阵依次左乘 )
上下两图都可参考,描述相同转换关系
其中相机的内参和外参可以通过张正友标定获取。通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的Zc的值。
可以使用如下三种方法来评定相机标定的结果: 评估重投影误差,外参可视化,观察畸变矫正后的图片。最好三种都使用。
如果相机标定的参数是正确的,经过畸变矫正后的棋盘格,弯曲的线将会变成直线。
import cv2 import sys import numpy as np image = np.ones([1080, 1920, 3], np.uint8) * 255 x_nums = 14 y_nums = 7 square_pixel = 120 # 1080/9 = 120 pixels x0 = square_pixel y0 = square_pixel def DrawSquare(): flag = -1 for i in range(y_nums): flag = 0 - flag for j in range(x_nums): if flag > 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。