从摄影测量到计算机视觉----以SFM算法为例,用python+opencv 实现
因为这篇公式和图比较多,所以笔者以贴图像的形式来,附上最终的结果图。如果你需要笔者的代码,可以发邮件或者去github,笔者后续会贴上github链接。
1、 两者之间的关系
摄影测量是研究被摄物体的形状、大小、和相对位置关系的一门学科;计算机视觉可以看作是图像处理的升华(image—knowledge)。两者之间有太多的相似之处,如bundle adjustment,摄影测量中称之为光束法平差,即是整体求解相片的外方位元素和加密点坐标。而对于computer vision,以slam 为例,总结如下:
Points 摄影测量 Computer vision
3D-3D 物点到物点 坐标转换,如七参数变换 Slam 其中一部分(这个没有具体研究)
2D-3D像点到物点 单像后方交会\光束法平差 光束法平差
2D-2D 像点到像点 相对定向
2、摄影测量和CV中2D-3D公式(很重要)
原理都是小孔成像,对于摄影测量,由共线条件方程可得:
)
所以想利用opencv 中一些函数求解相机位姿的话,对于摄影测量给了像平面坐标(单位mm),只需要将y 变为负
3、以SFM 算法为列,2D-2D points
1) 图像匹配
2) 找基本矩阵F
3) 找本质矩阵E
4) 分解E
1) 利用opencv 中的recoverPose 函数,其中输入参数是E,Points1(N*2),Poins2(N*2),返回值是points,R,T,mask 。其中points 是内点,R,T是右相机相对与左的旋转和平移,这时候是假设左相机为世界坐标系源,即旋转的角度为0、平移为0
2) 自己去分解,详情见《计算机视觉中的多视图几何》,两视图几何章节中的本质矩阵小节,分解E有四种结果,但是重构点在两个相机前面的情况只有一种,故可以利用这个约束来获取唯一解。
3) Opencv 中decomposeEssentialMat这个函数不要用,因为它返回R1,R2,T。其中R1不等于[E|0],官方文档说:这个函数只能得到平移的方向。
至于如何判断重构点在两个相机前面,我看到一个外国小哥的代码,如下。我没看懂他的,我就自己写了,很简单,就是随便选择一同名点前方交会(CV中叫三角化),来判断Z否大于0.
外国小哥代码: