python 3d重建_一起学opencv-python三十九(相机校准和3D重建一)

926a49fbc22952db633e255f8358ca85da1f05e7.pngs

毕业设计定的题目是SLAM,这个有点不太好做呢,不过前面已经学了很多知识,我相信自己还是能做出来的。

首先我们了解为什么需要进行相机标定。a895a153fd9fdc6afa35ee6a0cd0f9227db579d9.png

有人说买摄像头的时候不是会给我们一些参数吗?没错,但是给的参数是比较少,参考某宝的页面:e8df41d61ec7ec1c0b92d93b6887a4a36b0847bf.png

关于摄像机的参数其实只给了一个焦距,下面会看到关于摄像机的内参数我们不止需要这一个,没提供怎么办呢?我们就得自己建立模型,建立方程来求。

相机标定的四个坐标系和转换关系

参考: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.htmlc3a6d9360da08e98736140dd5e049d9e1c502ef5.png

dd3776a730fb82d1613b0b3002b5326130d5b7ae.png

2fb7ae87b0aecffd0bb27a5b8e98db537bf4700f.png

这个像素坐标系是我们处理图像的时候用的坐标系。51f1b712c28085dfa3097fad2b08ba694f7489b3.png

(u,v)是像素坐标系的坐标。其实u,v都应该是整数的,不过考虑到亚像素,就没有取整了。7a0381edee48e39bec3f4c654bf300ac6378c831.png

这个转换矩阵的行列式恒不为0,所以一定有逆矩阵。22325e4f3303ce2acb6a704f196be3d897b7ab7f.png

eb0d078c9ae922d4cbc3bc0cd4b75d9a25057fb9.png

28f208fbda75370938cae8eb23dbfa8e181cd6ab.png

6c59bd2d1a5f184b89e1f317e2dbadc383877c82.png

从世界坐标系变到摄像机坐标系也是差一个R和T,所以c553f99a0c70e52654c21cd3092d1733947df0e2.png

(X,Y,Z)是摄像机坐标系的坐标,(Xc,Yc,Zc)是世界坐标系的坐标。c80f9358f34ec11de3a6a097ffe0b02c46d26081.png

那么任意方向的旋转都可以用r1,r2,r3来合成了,上面的r1,r2,r3中的角度不一定都一样,我看上面都用θ,这样容易产生误解。这样就很好:74d9dd9f98e54085382e655b32786db6f81e3690.png

eb2336a6e0ed386d3f3db979a4a949ab04cc41b1.png

c49d59ddb90c295300e372e4c1fcbb36f56214fd.png

根据上面式子,可以得出:95813a5eb35e972b073a132c6cb9db3831f42f5b.png

当然其实也可以写作下面的简单形式,上面这么写是为了运算方便。b82f29b58d58d092d77fd75f8a7fb609c8c65c45.png

最后一列都是0,其实可以不要的。这个光心是投影中心,也是透视变换的中心。上式通过相似很容易得到。成像平面是放置感光元件的平面,比如CCD。为什么成像图会是上面的呢?参考了https://www.cnblogs.com/wangguchangqing/p/8126333.html

和https://blog.csdn.net/hongbin_xu/article/details/78934897

其实这个成像的原理就是初中物理中的小孔成像:88d6ba5b72b5a512e79b8e099ef2171ac1dd0654.png

2e16ba4865f4c369b957aa0ff6b069b11bb43971.png

如果是上面的话,摄像头坐标系和像素坐标系之间的关系:3a647b504a3673a85a3f28fe5d63b963909bd8e8.png

或者5d358955b9c345e535190403dc13a39dc6b76b60.png

2a01cfb593bae79f97e78708cb0a282213935fad.png

fx=f/dx,fy=f/dy。其实上面多出来的cx,cy完全可以解决的,因为u0,v0也是未知数,也就是说图像坐标系的原点其实不一定要在像素坐系的中心点,我们就以光心(投影中心)作为图像坐标系的原点就可以了,所以cx,cy参数就包含在u0,v0里面了,其实完全不用担心。7f6a6c91cd489f0b8e96f43fa6d10676508cc2d3.png

fa32ba574cf6f869c5f9d853cdaeec006b4e1e25.png

摄像机模型及其中涉及的坐标系等,是弄清3D重建几何框架的基础。可以把它们视为基本运算关系。后面对于三维重建几何框架的推导,都是要用到三个基本坐标系和摄像机模型的。

张正友标定法

摄像头标定是我们使用摄像头前应该做的工作。9a712b183b92013d27a72143b27e18930b097b58.png

参考: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

上面从像素坐标系到世界坐标系的转换关系为:fbeff1e057f76ef6cb6013f4c6fb55b3742c4bd1.png

参考https://www.cnblogs.com/Jessica-jie/p/6596450.html

有一个假设已知某些参数,计算相机内参的例子:2714b93b214ada37f765cadf1b128fce5cfdf34a.png

不过一般我们是不知道上面这些参数的,所以内参数需要为我们进行标定计算。3b5667c64cbe47e36572e5d1f034ba2e72bb1118.png

对比上面的转换方程和f48b736c9d6930cd42e835f447be3acb020f21a8.png

其实s就是Zc,我们把它叫做尺度因子。fbb2ea41212473c94f9d3cb1ab7376b92b29f528.png

也就是我们把世界坐标系的的原点定在物体上。不过上面是有些问题的,上面左边应该是[u v 1],这样矩阵的维数才是对应的。7baeec0a3e1908f1b41d72c38866e6d8f645a881.png

这个其实和7a9325e3bc21bc4b8b24c2491cb7cd4424c02535.png

里的透视变换矩阵很像:86616b4da832bef27a63c89c26266b8e4c3af4ec.png

既然上面取Z=0,就说明标定物体在z=0这个平面上,其实也就是把一个平面从世界坐标系透视变换到像素坐标系里,那么变换矩阵其实有只有8个未知数。其实张正友标定用的就是一个棋盘,也就是一个平面去标定。2cd24a038bc2cba6bb7528e5b5ec9912d72dabdc.png

并且我们也可以借助这个理解s的由来,s这样理解是一个变量,就是上面透视变换矩阵里面的z/za,这个和上面s=Zc的理解又如何统一呢?4fb4ad1580ab22f27d1304a865edd555a86d0bc7.png

按照这一讲把世界坐标系的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的值,因为可以通过比值来获取变换后的坐标。c9f205f1ca89728c83f3ce0e53387194c952da70.png

用四对点求透视变换矩阵的8个参数,列出的方程是787ce60dbd01f63a45c718281ab9d682c6bc0802.png

这种形式的,未知数是a11到a32,已知的是4对点的坐标,上面只是列出了(u1,v1),(x1,y1)和

(u2,v2),(x2,y2)两对的约束方程。152a2ff74fccf5038f2888734ff9c1a825854477.png

这个A阵,如果c=0,其实就是一个放缩变换加平移,当坐标系不垂直的时候c不等于0又如何理解呢?推导一下,假如摄像头坐标系之间夹角为θ。的确是c的位置不等于0。不过下面的推导过程忘了除以dx和dy了。为什么会出现这种呢,可能有的成像感光阵列就不是矩阵排列的,而是平行四边形排列的?存在即合理。dd7e9b211135f498f6431bedcfb6da7d6aafaa45.png

下面的m也需要修正。5ba11ae1e4baafc8b7429f61af3d19e592554aa3.png

所谓单应性矩阵:02acfdc7106a12080cd4b1e10e13fefdd7f55416.png

这个就是透视变换矩阵。ca88dce1071faff04407de70f5081c91710c778c.png

关于旋转矩阵的性质分析:https://blog.csdn.net/zhang11wu4/article/details/49761121

旋转矩阵是正交的4矩阵真的是一个很重要的性质。0e3bc63d9851689d873e9144d0d3384330649e56.png

上面写的是H=A[r1 r2 t]=[h1 h2 h3],为什么还要写成[h1 h2 h3]=λA[r1 r2 t]呢?这个λ是那哪里来的呢?我觉得这个应该这么是这么回事,根据上面透视变换矩阵的知识。86616b4da832bef27a63c89c26266b8e4c3af4ec.png

如果左边的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,因为相机不可能拍到在光心处的物体吧。21690cee2b26537238fb86227c044aa543a65594.png

其实这些约束中的1/λ都可以消掉,它就是一个非零的常数而已。22aabc237d9fc6954d569e58aeb362b63cc24f28.png

7145de67a90c40cab752d99d651cd108dc96e029.png

如果i=j,上面就是一个标准二次型。a12424d7221f18e65cfa998d9c72937a9482c26b.png

f47eafe327dec1ab8d3fb8de54627a716a8b2a40.png

上面都是一些简单的线性代数处理。0d9919aa7284406ccdd2126fd611a199adc6f428.png

我们知道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每次换一次角度的照片就变一次,也就是说其实这个λ是一个变量,只不过在每次固定角度的时候是一个常量。而上面的式子f74ece16e5499a2d853bfcb87fd23084766ab036.png

求出的λ是一个定值,为什么说是一个定值呢?因为内参数矩阵A是个定值,那么B矩阵的元素就也是定值,v0也是定值,那么这求出来的也是一个定值,这里引入的λ就只是一个赋值而已,是为了让表达式不要那么长而已,这个其实完全可以不用λ的,用其它字母更好,用λ会引起不必要的误解。

关于怎么求A,需要用Cholesky分解法。参考https://blog.csdn.net/billbliss/article/details/78559387cd12537c0e209dd69d8602a7e17a50f069846d7d.png

上面B是对称正定的,对称是显然的,正定可以求出各阶顺序主子式,这个时候确实都是正的。364809c3e6f8849d8df03e8c2a0b6ad7df10e5e9.png

其实到这里就能看出来怎么求解了,用的原理很简单,就是对应位置参数相等,最后列方恒呗,这个简单的过程我们取了一个名字而已,不过我们姑且继续看它是怎么推出通式的。3f4bb27ea8f2ff87fe244208f3153e6172df2118.png

152c94fd125b7377cdf1c4b6b675566b14b65693.png

9f34038545ac79ef6ffde36dc43f85e4a563693a.png

这里用的是旋转矩阵的每一列都是正交的性质,r3=r1×r2这个可以参考下已知平面中两条相交直线求这个平面的法向量的时候,若r1,r2是两条直线的方向向量,那么它们的叉乘就是这个平面的法向量。另外,r3的L2范数也是1。93385f32112faf535854be051dbb4eca0edbc51c.png

这里λ可以求出来,因为A的逆和h1,h2我们都求出来了,然后就可以求出三个角度的不同外参矩阵了。deb8f8b2111397c2a54d6a1e02a7c1cb5b2bb6c3.png

关于奇异值分解,这里不再扩展,可以自行百度,或者:https://blog.csdn.net/u013108511/article/details/79016939

也就是说我们可以把奇异值分解的结果中的D换成单位阵,原来是什么无关紧要,来得到正交阵R。不过到这里还没有结束,因为上面没有考虑噪声。67428686fbc657f3a37aed26e1058524c335ec55.png

关于最大似然估计是怎么得到这个式子的:abe8e5b17f213aedcea1af37eba5df60835aebe5.png

这个算法此处也先不展开说明,上面的过程,我们可以求出不考虑畸变的相机的内外参数。1e580e66ca9d431b9d6462d5a6eb91360b2a727f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值