【三维重建】运动恢复结构
https://www.bilibili.com/video/BV1nz4y197Qv?p=4&vd_source=1010463c54126efeefa78f5ce81fbd7e
运动恢复结构问题,SFM(Structure from Motion)
概念:通过三维场景的多张图像,恢复出该场景的三维结构信息以及每张图片对应的摄像机参数。
运动恢复结构问题:
自己总结一下,就是通过m张图片中相同的特征点求解m个相机的投影矩阵$ m_i $ 以及 n个三维点\(X_j(j=1,...,n)\)的坐标,这些三维点也就是三维空间中的n个3D点\(X_j\)。
三种典型的运动恢复结构任务
- 欧式结构恢复(摄像机内参数已知,外参数未知)
情况就是相机用标定板拍了一堆照片,首先求出相机的内参数,再接着进行其他的操作。 - 仿射结构恢复(摄像机为仿射相机,内、外参数均未知)
- 透视结构恢复(摄像机为透视相机,内、外参数均未知)
\(M=k[R , T]\),R,T是摄像机针对世界坐标系的旋转和平移。
欧式结构恢复实际情况:
有一个扫地机器人,在机器人上面内置了一个相机,相机的内参数可以在标定前给他标定好,存储到系统里,当摄像机 开始工作的时候,那么这就是一个欧式结构恢复的问题。
1、欧式结构恢复问题
已知:
- n个三维点\(X_j(j=1,...,n)\)在m张图像中的对应点的像素坐标\(x_{ij}\)
- m张图像对应的摄像机的内参数矩阵\(K_i(i=1,...m)\)且\(x_{ij}=M_iX_j=K_i[R_i,T_i]X_j\),\(i=1,...,m(m为图像个数;j=1,...,n(n为3D点个数)\),其中,\(M_i,K_i,[R_i,T_i]\)为第i张图片对应的摄像机的投影矩阵、内参数以及外参数矩阵。
求解:
- n个三维点\(X_j(j=1,...,n)\)的坐标
- m个摄像机的外参数\(R_i\)及\(T_i\) 其中 \((i=1,...,m)\)
1.1 两视图
首先假设第一个摄像机是世界坐标系,世界坐标系对于重建而言放哪都可以,虽然空间坐标位置在变,但是重建的结构是不会变的,相对关系是不会变的。
所以这个点和二维点的对应关系就已知了,虽然左边那个\(X_j\)不知,但是\(K_1[I,0]\)是完全已知的,所以这一路需要求的就是\(X_j\)。
对于右边那路,旋转平移\(R,T\)(从01到02的那个R,T)是不知道的,这边的R,T也就是摄像机2相对于摄像机1(即世界坐标系,此处摄像机1即世界坐标系),把这个世界坐标系的点(\(X_j\))经过旋转平移,经过内参\(K_2\),就投影到了图像平面上。
所以现在的问题就转化为了,已知\(x_{1j},x_{2j},K_1,K_2\),然后求解\(X_j,R,T,X_j\)(图中4个红的)
1.2 两视图问题求解
问题:
- $ x_{1j}=M_1X_j=K_1[I,0]$ \(X_j\)
- $ x_{2j} = M_2X_j = K_2[$ \(R, T]X_j\)
其中,$ j = 1,...,n $
求解步骤:
- 求解基础矩阵F,归一化八点法
- 利用F与摄像机内参数求解本质矩阵E,$ E=K^T_2FK_1 $
- 分解本质矩阵获得R与T,\(E ——>R、T\)
- 三角化求解三维点\(X_j\)坐标,\(X^*_j = argmin_{X_j}(d(x_{1j},M_1X_j)+d(x_{2j},M_2X_j))\)
求解步骤1中
左图和右图通过SIFT特征点提取,然后对提取到的特征点进行128维描述,然后在右图上找他的对应点,然后在两张图之间建立关系,在建立对应点关系的时候可能有错的,比如这里面有1000对点(即1000对对应关系)。
因为有错的点,所以可以用RANSAC(随机抽样一致算法,Random Sample Consensus)的方法来估计。我们知道这两个之间有个矩阵可以估计两个之间的相对变换关系,就用RANSAC来估计,这1000对点应该都满足这个矩阵,如果都正确的话应该有且仅有一个矩阵,能把这1000对点从左边归到右边,但是很多情况下有很多噪声的存在,所以我们只能找到一个满足所有内点数最大的那个矩阵H,这样就可以建立从一个点到另一个点的对应关系,有了对应关系之后就可以使用归一化八点法,只要有八对对应关系我们就可以求得F矩阵,实际情况下用的不只是八对点,有时候可能点对更多。所以这里面用到的技术是1.SIFT,2.特征匹配技术,3.RANSAC技术,这个就是图与图之间匹配关系。
求解步骤2中
经过步骤1求取之后,相当于基础矩阵F已知了,另外相机内参\(K_1,K_2\)也已知了,所以相当于本质矩阵E也已知了。所以接下来的问题就是求解R,T。
求解步骤3中
因为这边由之前本质矩阵的推导中可以知道\(E=T\)x\(R\)(或表示为T^R),叉乘。
那怎么通过E求得T和R呢,这个就涉及到本质矩阵的分解。
可以参考: 立体视觉入门指南(2):关键矩阵(本质矩阵,基础矩阵,单应矩阵)和 自己的博客
$x^T_2Fx_1 = 0 $ ——> \(E=K^T_2FK_1\)
无法确定F的符号
和尺度
;-F或者kf都满足上式。
所以,也无法确定E的符号
和尺度
。
本质矩阵分解总结:
RANSAC算法主要是为了提高特征点匹配精度的。
RANSAC算法假设所有数据符合一定的规律,通过随机抽样的方式获得这个规律,并且通过重复获取规律寻找使得较多数据符合的规律。RANSAC算法之所以能应用到特征点匹配中,是因为两种图像的变换为单应矩阵所对应的变换规律。单应矩阵可以由4个对应点得到单应矩阵,而图像中所有对应点都应符合这个单应矩阵变换规律,因此可以使用RANSAC算法进行特征点匹配的优化,利用RANSAC算法优化特征点匹配可以概括为以下3个步骤:
1、在匹配结果中随机选取4对特征点,计算单应矩阵。
2、将第一帧图像中的特征点根据单应矩阵求取在第二帧图像中的重投影坐标,比较重投影坐标与已知匹配的特征点坐标之间的距离,如果小于一定的阈值,那么认为是正确匹配点对,否则视为错位匹配,并记录正确匹配点对的数量。
3、重复第一步和第二步,比较多次循环后统计的正确匹配点的数量,将正确匹配点对数量最多的情况作为最终结果,剔除错误匹配,输出正确匹配对,从而实现特征点匹配的筛选。
OpenCV中提供了利用RANSAC算法计算单应矩阵并去掉错误匹配的findHomography()函数
欧式结构恢复(2视图)总结
欧式结构恢复歧义
就是它恢复出来的和真实解之间不一定是一致的,会相差一个尺度。(就是恢复出来的场景在真实世界中是1m高还是2m高是不知道的)所以仅靠图像重建出来的三维场景和真实场景是相差一个尺度关系的,但是结构是相同的。
- 恢复出来的欧式结构与真实场景之间相差一个相似变换(旋转、平移、缩放)。
- 恢复的场景与真实场景之间仅存在相似变换的重构称为
度量重构
。
欧式结构任务条件:
- 知道两个图像的内参数
- 其他的都不知道(\(R,T,X_j\))