现在把以前做的一些项目整理一下,算法代码巩固一下,想交流技术的朋友,qq:861045644,人在北京,欢迎骚扰。
这一部分是,已知:1.两张照片的同名点对;2.两个相机的P矩阵。
核心思想:两张照片上的同名点(图像上的点),共同描述实际物体一点(世界坐标系同一个点)
故:首先,我们分别在一幅照片找构建空间点与照片点的关系
其次,用空间点为同一点连接两个方程
即可求出空间点坐标。
算法:
一。获得AX=0
x=PX (x是图像中一点,X是空间一点,P矩阵是相机内参和外参构成3X4)
x`=PX`(第二张照片)
x(x,y,1)与PX叉乘 ---->
x(P3 tX)-P1 tX=0(1)
y(P3 tX)-P2tX=0(2)
x(P2 tX)- yP1tX=0 (3)
三个方程,方程(1)(2)是独立的。
提出X得到------>AX=0,
x(P3 t)- P1t
A= y(P3 t)- P2t
x`(P`2 t)- y`P`1t
y`(P`3 t)- P`2t
二。求解X
容易知道,X是(X,Y,Z,1),并且A是4X4矩阵,现在面临方程数比未知数多一个的局面。
现在有两种方法来应对这种情况
(1)SVD分解
SVD(Singular Value Decomposition)
我们在线性代数中学习过,对方阵进行分解,那就是对角化,对称阵更加特殊(特征向量的特征值正交),但是书里面没讲面对非方阵该怎么办。
SVD 就是解决非方阵矩阵的。
SVD分解过程,多视图几何和网上有些博客对于U是mXm 还是mXn不一样,我也没有弄明白。
但是SVD分解的结果,是x的值等于v的最后一列的值(不要忘了第四个数要为1)
math::Matrix<double,4,4> V;
math::matrix_svd<double,4,4>(A,nullptr,nullptr,&V);
math::Vector<double,4> x=V.col(3);
x[0]/=x[3];
x[1]/=x[3];
x[2]/=x[3];
x[1],x[2],x[3]就是空间的坐标。