大家好,又见面了,我是你们的朋友全栈君。
通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。
它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可,因此成本更低廉,且受环境约束较小,
在室内和室外均能使用。
小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。 在这种情况下,往往将小孔称作光心(Optical Center)。
根据相似三角形关系可以得到 x = f X Z x=\frac{fX}{Z} x=ZfX, y = f Y Z y=\frac{fY}{Z} y=ZfY。 图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为 ( c x , c y ) (c_x,c_y) (cx,cy),因此 x = f X Z + c x x=\frac{fX}{Z}+c_x x=ZfX+cx, y = f Y Z + c y y=\frac{fY}{Z}+c_y y=ZfY+cy。 矩阵形式 Z [ x y 1 ] = [ f 0 c x 0 f c y 0 0 1 ] [ X Y Z ] Z\begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \\ \end{bmatrix} Z⎣⎡xy1⎦⎤=⎣⎡f000f0cxcy1⎦⎤⎣⎡XYZ⎦⎤ 其中K为内参矩阵,它只和相机自身的内部参数有关(焦距,光心位置)。 K = [ f 0 c x 0 f c y 0 0 1 ] K=\begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix} K=⎣⎡f000f0cxcy1⎦⎤
设X到两个相机像面的垂直距离分别为 s 1 s_1 s1和 s 2 s_2 s2,且这两个相机具有相同的内参矩阵K,与世界坐标系之间的变换关系分别为 [ R 1 T 1 ] \begin{bmatrix} R_1 & T_1 \end{bmatrix} [R1T1]和 [ R 1 T 1 ] \begin{bmatrix} R_1 & T_1 \end{bmatrix} [R1T1],那么我们可以得到下面两个等式 x 1 s 1 = K ( R 1 X + T 1 ) x 2 s 2 = K ( R 2 X + T 2 ) \begin{matrix} x_1s_1 = K(R_1X + T_1) \\ x_2s_2 = K(R_2X + T_2) \end{matrix} x1s1=K(R1X+T1)x2s2=K(R2X+T2) K是可逆矩阵,则 K − 1 x 1 s 1 = R 1 X + T 1 K − 1 x 2 s 2 = R 2 X + T 2 \begin{matrix} K^{-1}x_1s_1 = R_1X + T_1 \\ K^{-1}x_2s_2 = R_2X + T_2 \end{matrix} K−1x1s1=R1X+T1K−1x2s2=R2X+T2 设 K − 1 x 1 = x 1 , , K − 1 x 2 = x 2 , K^{−1}x_1 = x_1^,,K^{−1}x_2 = x_2^, K−1x1=x1,,K−1x2=x2,,则有 x 1 , s 1 = R 1 X + T 1 x 2 , s 2 = R 2 X + T 2 \begin{matrix} x_1^,s_1 = R_1X + T_1 \\ x_2^,s_2 = R_2X + T_2 \end{matrix} x1,s1=R1X+T1x2,s2=R2X+T2 我们一般称 x 1 , x_1^, x1,和 x 2 , x_2^, x2,为归一化后的像坐标,它们和图像的大小没有关系,且原点位于图像中心。我们将世界坐标系选为第一个相机的相机坐标系,则 R 1 = I , T 1 = 0 R_1 = I, T_1 = 0 R1=I,T1=0。上式变为 x 1 , s 1 = X x 2 , s 2 = R 2 X + T 2 x_1^,s_1 = X \\ x_2^,s_2 = R_2X + T_2 x1,s1=Xx2,s2=R2X+T2 将式一带入式二,则 s 2 x 2 , = s 1 R 2 x 1 , + T 2 s_2x_2^, = s_1R_2x_1^, + T_2 s2x2,=s1R2x1,+T2 x 2 , x_2^, x2,和 T 2 T_2 T2都是三维向量,它们做叉积之后得到另外一个三维向量 T 2 ^ x 2 , \hat{T_2}x_2^, T2^x2,(其中 T 2 ^ \hat{T_2} T2^为叉积的矩阵形式, T 2 ^ x 2 , \hat{T_2}x_2^, T2^x2,代表 T 2 ^ × x 2 , \hat{T_2}×x_2^, T2^×x2,),且该向量垂直于 x 2 , x_2^, x2,和 T 2 T_2 T2,再用该向量对等式两边做点积,则 0 = s 1 ( T 2 ^ x 2 , ) T R 2 x 1 , ⇒ x 2 , T 2 ^ R 2 x 1 , = 0 0 = s_1(\hat{T_2}x_2^,)^TR_2x_1^, \\ \Rightarrow x_2^,\hat{T_2}R_2x_1^, = 0 0=s1(T2^x2,)TR2x1,⇒x2,T2^R2x1,=0 令 E = T 2 ^ R 2 E=\hat{T_2}R_2 E=T2^R2,则 x 2 , E x 1 , = 0 ⇒ x 2 T K − T S t 2 R 2 K − 1 x 1 = 0 其 中 F = K − T S t 2 R 2 K − 1 x_2^,Ex_1^, = 0 \\ \Rightarrow x_2^TK^{-T}S_{t2}R_2K^{-1}x_1 = 0 \\ 其中 F = K^{-T}S_{t2}R_2K^{-1} x2,Ex1,=0⇒x2TK−TSt2R2K−1x1=0其中F=K−TSt2R2K−1 这里 S t 2 S_{t2} St2为反对称矩阵 S t 2 = [ 0 − t 3 t 2 t 3 0 − t 1 − t 2 t 1 0 ] S_{t2}=\begin{bmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{bmatrix} St2=⎣⎡0t3−t2−t30t1t2−t10⎦⎤ 上式是同一点在两个相机中的像所满足的关系,它和点的空间坐标、点到相机的距离均没有关系,我们称之为极线约束(外极约束)。而矩阵E则称为关于这两个相机的本质矩阵(基础矩阵F)。如果我们知道两幅图像中的多个对应点(至少5对),则可以通过上式解出矩阵E,又由于F是由 T 2 T_2 T2和 R 2 R_2 R2构成的,可以从F中分解出 T 2 T_2 T2和 R 2 R_2 R2。由于det(F)=0,所以基础矩阵的秩小于等于2,在估计F的算法中会用到这些性质。
主要包括两种重建的接口cv::sfm::reconstruct,一种是输入图像序列,一种是输入跟踪点序列,计算出相机在两帧空间场景间的R和T,算法具体实现基于libmv库。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151277.html原文链接:https://javaforall.cn