s
毕业设计定的题目是SLAM,这个有点不太好做呢,不过前面已经学了很多知识,我相信自己还是能做出来的。
首先我们了解为什么需要进行相机标定。
有人说买摄像头的时候不是会给我们一些参数吗?没错,但是给的参数是比较少,参考某宝的页面:
关于摄像机的参数其实只给了一个焦距,下面会看到关于摄像机的内参数我们不止需要这一个,没提供怎么办呢?我们就得自己建立模型,建立方程来求。
相机标定的四个坐标系和转换关系
参考:https://jingyan.baidu.com/article/63f2362826ea1c0208ab3dec.html
http://www.360doc.com/content/14/0410/14/10724725_367760675.shtml
https://www.cnblogs.com/dverdon/p/5609124.html
这个像素坐标系是我们处理图像的时候用的坐标系。
(u,v)是像素坐标系的坐标。其实u,v都应该是整数的,不过考虑到亚像素,就没有取整了。
这个转换矩阵的行列式恒不为0,所以一定有逆矩阵。
从世界坐标系变到摄像机坐标系也是差一个R和T,所以
(X,Y,Z)是摄像机坐标系的坐标,(Xc,Yc,Zc)是世界坐标系的坐标。
那么任意方向的旋转都可以用r1,r2,r3来合成了,上面的r1,r2,r3中的角度不一定都一样,我看上面都用θ,这样容易产生误解。这样就很好:
根据上面式子,可以得出:
当然其实也可以写作下面的简单形式,上面这么写是为了运算方便。
最后一列都是0,其实可以不要的。这个光心是投影中心,也是透视变换的中心。上式通过相似很容易得到。成像平面是放置感光元件的平面,比如CCD。为什么成像图会是上面的呢?参考了https://www.cnblogs.com/wangguchangqing/p/8126333.html
和https://blog.csdn.net/hongbin_xu/article/details/78934897
其实这个成像的原理就是初中物理中的小孔成像:
如果是上面的话,摄像头坐标系和像素坐标系之间的关系:
或者
fx=f/dx,fy=f/dy。其实上面多出来的cx,cy完全可以解决的,因为u0,v0也是未知数,也就是说图像坐标系的原点其实不一定要在像素坐系的中心点,我们就以光心(投影中心)作为图像坐标系的原点就可以了,所以cx,cy参数就包含在u0,v0里面了,其实完全不用担心。
摄像机模型及其中涉及的坐标系等,是弄清3D重建几何框架的基础。可以把它们视为基本运算关系。后面对于三维重建几何框架的推导,都是要用到三个基本坐标系和摄像机模型的。
张正友标定法
摄像头标定是我们使用摄像头前应该做的工作。
参考:https://blog.csdn.net/hongbin_xu/article/details/78965037
https://blog.csdn.net/humanking7/article/details/44756235
https://wenku.baidu.com/view/f7a904193c1ec5da50e270f7.html
https://www.cnblogs.com/wangguchangqing/p/8126333.html#autoid-0-1-0
上面从像素坐标系到世界坐标系的转换关系为:
参考https://www.cnblogs.com/Jessica-jie/p/6596450.html
有一个假设已知某些参数,计算相机内参的例子:
不过一般我们是不知道上面这些参数的,所以内参数需要为我们进行标定计算。
对比上面的转换方程和
其实s就是Zc,我们把它叫做尺度因子。
也就是我们把世界坐标系的的原点定在物体上。不过上面是有些问题的,上面左边应该是[u v 1],这样矩阵的维数才是对应的。
这个其实和
里的透视变换矩阵很像:
既然上面取Z=0,就说明标定物体在z=0这个平面上,其实也就是把一个平面从世界坐标系透视变换到像素坐标系里,那么变换矩阵其实有只有8个未知数。其实张正友标定用的就是一个棋盘,也就是一个平面去标定。
并且我们也可以借助这个理解s的由来,s这样理解是一个变量,就是上面透视变换矩阵里面的z/za,这个和上面s=Zc的理解又如何统一呢?
按照这一讲把世界坐标系的z=0平面建立在标定物体处的原则,上图的截面2就是世界坐标系的z=0处,这个Zc就是z/za里面的z,因为光心是必然重合的,主光轴也只有一个,也就是说Zc和z/za也就是差一个za倍而已,如果按照s=Zc理解,右边的h33就不是1了,而是za,一个定值,只不过需要我们去求解,这个参数和其它8个参数是倍数关系,所以可以说H中有8个未知数需要求解(虽然我觉得并不十分准确)或者说矩阵的自由度是8(这种说法我觉得很好)。不过这个Zc我们是测不出来的,只能算出来。因为光心的未知我们不好确定,不过透视变换并不需要知道z/za的值,因为可以通过比值来获取变换后的坐标。
用四对点求透视变换矩阵的8个参数,列出的方程是
这种形式的,未知数是a11到a32,已知的是4对点的坐标,上面只是列出了(u1,v1),(x1,y1)和
(u2,v2),(x2,y2)两对的约束方程。
这个A阵,如果c=0,其实就是一个放缩变换加平移,当坐标系不垂直的时候c不等于0又如何理解呢?推导一下,假如摄像头坐标系之间夹角为θ。的确是c的位置不等于0。不过下面的推导过程忘了除以dx和dy了。为什么会出现这种呢,可能有的成像感光阵列就不是矩阵排列的,而是平行四边形排列的?存在即合理。
下面的m也需要修正。
所谓单应性矩阵:
这个就是透视变换矩阵。
关于旋转矩阵的性质分析:https://blog.csdn.net/zhang11wu4/article/details/49761121
旋转矩阵是正交的4矩阵真的是一个很重要的性质。
上面写的是H=A[r1 r2 t]=[h1 h2 h3],为什么还要写成[h1 h2 h3]=λA[r1 r2 t]呢?这个λ是那哪里来的呢?我觉得这个应该这么是这么回事,根据上面透视变换矩阵的知识。
如果左边的s等于z/za的话,H阵的h33才等于1,原来的s是等于Zc,也就是z的,这样的话h33=za,虽然za是一个常数,但是它也是未知数,所以其实这样的H阵未知数其实还是9个,为了让h33=1,我们搞来了这么一个λ,λ=1/za,这样的话,[h1 h2 h3]=λA[r1 r2 t]的h33就等于1了,H阵就只有8个未知数了。这样的处理一开始就别让H=A[r1 r2 t]啊,这个也是有点搞笑啊。由于za不可能等于0,因为相机不可能拍到在光心处的物体吧。
其实这些约束中的1/λ都可以消掉,它就是一个非零的常数而已。
如果i=j,上面就是一个标准二次型。
上面都是一些简单的线性代数处理。
我们知道H有九个参数,不过只有8个未知数,因为h33=1,我们可以根据4对点的信息求出。因为[u,v]可以根据找出来的相片得到,而[X,Y]是我们自己建立的坐标系,坐标是我们自己选择的,也是可以知道的,也就是说[h1,h2,h3]我们都是可以知道的。但是怎么求b呢?b中有6个未知数,需要6个方程,每一组[h1,h2,h3]可以提供两个方程,所以需要三组无关的[h1,h2,h3],所以需要三张不同角度的照片,并且还要满足一定条件,让B的6个参数都是唯一解,这个条件一般还是容易满足的,每次换一个角度的照片,世界坐标系的z=0平面就移动一次(如果是动棋盘的话,如果是动相机,则相机坐标相对于世界坐标系移动可以等效为棋盘坐标系移动),然后我们可以求出b,就求出了B。而B=A-TA-1。这里需要说明的是λ和上面的λ=1/za是不一样的含义。这个λ=1/za每次换一次角度的照片就变一次,也就是说其实这个λ是一个变量,只不过在每次固定角度的时候是一个常量。而上面的式子
求出的λ是一个定值,为什么说是一个定值呢?因为内参数矩阵A是个定值,那么B矩阵的元素就也是定值,v0也是定值,那么这求出来的也是一个定值,这里引入的λ就只是一个赋值而已,是为了让表达式不要那么长而已,这个其实完全可以不用λ的,用其它字母更好,用λ会引起不必要的误解。
关于怎么求A,需要用Cholesky分解法。参考https://blog.csdn.net/billbliss/article/details/78559387
上面B是对称正定的,对称是显然的,正定可以求出各阶顺序主子式,这个时候确实都是正的。
其实到这里就能看出来怎么求解了,用的原理很简单,就是对应位置参数相等,最后列方恒呗,这个简单的过程我们取了一个名字而已,不过我们姑且继续看它是怎么推出通式的。
这里用的是旋转矩阵的每一列都是正交的性质,r3=r1×r2这个可以参考下已知平面中两条相交直线求这个平面的法向量的时候,若r1,r2是两条直线的方向向量,那么它们的叉乘就是这个平面的法向量。另外,r3的L2范数也是1。
这里λ可以求出来,因为A的逆和h1,h2我们都求出来了,然后就可以求出三个角度的不同外参矩阵了。
关于奇异值分解,这里不再扩展,可以自行百度,或者:https://blog.csdn.net/u013108511/article/details/79016939
也就是说我们可以把奇异值分解的结果中的D换成单位阵,原来是什么无关紧要,来得到正交阵R。不过到这里还没有结束,因为上面没有考虑噪声。
关于最大似然估计是怎么得到这个式子的:
这个算法此处也先不展开说明,上面的过程,我们可以求出不考虑畸变的相机的内外参数。