简明稀疏重建(SFM)教程

UTF8gbsn

本文主要做一个简要的稀疏点云重建方法的梳理,
梳理的粒度比较大.略去了非常多的技术细节.
其实这项技术也叫做SFM(Structured From Motion).

特征

在3D重建中, 我们的输入是一系列的照片.
这些图片通常是围绕一个物体并拍摄的一系列照片.
实际上对于同一个物体所拍摄的照片中存在一些特征点. 这些特征点,
和拍摄角度位置无关. 我们可以通过算法去计算出这些特征点.
这个方法就是SIFT方法, 注意SIFT方法, 只是一个函数. 他的作用如下.

f e a t u r e s = S I F T ( i m a g e ) features=SIFT(image) features=SIFT(image)

它通过一个图像的输入,
计算出这个图像的不变形特征.这些特征是一个集合 f e a t u r e s = { f 1 , f 2 , ⋯   , f n } features = \{f_1,f_2,\cdots , f_n\} features={f1,f2,,fn}.
f i = { p o s i t i o n , s c a l e , d i r e c t i o n } f_i=\{position, scale, direction\} fi={position,scale,direction}. 由此可见.
每一张图片都有一个这样的features向量. 在图像与图像之间.
这些特征实际上有一个对应关系.
但是我们通过 S I F T SIFT SIFT计算,并不知道这个对应关系.
我们只是朴素的提取每一张图片的不变性特征.
这些特征在不同图片之间怎么一一对应的, 我们目前不得而知.

特征匹配

特征比配的策略主要是比较SFIT特征.
这些特征靠计算欧拉距离和优化算法可以得到一个个一一对应的关系.形式化表示就可以.对于任意两张图片上的2D点 x i m g 1 , x i m g 2 \mathbf{x}^{img_1}, \mathbf{x}^{img_2} ximg1,ximg2.会有一个对应关系.
也就是说, 有一个这样的列表.

( x 1 i m g 1 x 1 i m g 2 x 2 i m g 1 x 2 i m g 2 ⋮ ⋮ x n i m g 1 x n i m g 2 ) \left( \begin{array}{cc} \mathbf{x}^{img_1}_1 & \mathbf{x}^{img_2}_1 \\ \mathbf{x}^{img_1}_2 & \mathbf{x}^{img_2}_2\\ \vdots & \vdots \\ \mathbf{x}^{img_1}_n & \mathbf{x}^{img_2}_n \end{array} \right) x1img1x2img1xnimg1x1img2x2img2xnimg2

稀疏重建过程

对于上一步获得对应2D点.
我们可以利用这个对应关系一步一步计算出很多东西.其中包括 K , R , T , X \mathbf{K, R, T, X} K,R,T,X.
我们慢慢来看这些东西是什么.

  1. x = ( x y 1 ) \mathbf{x}=\left( \begin{array}{c} x \\ y \\ 1 \end{array} \right) x=xy1, 2D点坐标的齐次表示形式. 数据是成对的.
    因为2D点对是一一对应关系.

  2. K \mathbf{K} K 相机内参. ( f x 0 c x 0 f y c y 0 0 1 ) \left( \begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array} \right) fx000fy0cxcy1 相机内参的初始化方式可以有两种.
    一种是读取输入图片中的exif信息.另一种是设一个初始的值.
    然后这些设置仅仅是初始值. 后面会有算法来优化它们.
    也就是说到目前为止, 可以人为 K \mathbf{K} K是已知的

  3. X \mathbf{X} X, 为世界坐标系下的3D点的齐次坐标 X = ( x y z 1 ) \mathbf{X}=\left( \begin{array}{c} x\\ y \\ z \\ 1 \end{array} \right) X=xyz1

  4. R , T \mathbf{R, T} R,T, 相机外参. R 3 × 3 \mathbf{R}_{3\times 3} R3×3是一个旋转矩阵.
    T 3 × 1 \mathbf{T}_{3\times 1} T3×1是一个位移向量.
    实际上 [ R ∣ T ] ⋅ X [\mathbf{R}|\mathbf{T}]\cdot \mathbf{X} [RT]X
    的作用就是把3D点变换到摄像机坐标系中.

再次强调:到目前为止, 我们可以说我们的已知为 x \mathbf{x} x点对,
K \mathbf{K} K, 而未知的东西位 X , R , T \mathbf{X, R, T} X,R,T.
我们来看看怎么来求这些东西.

求解 R , T \mathbf{R, T} R,T

实际上, 我们还需要另外的知识. 也就是essential matrix 本质矩阵.
对于两张图片摄像机坐标系中的配对点理论上存在一个本质矩阵 E 3 × 3 \mathbf{E}_{3\times3} E3×3使得
x ~ 1 T E x ~ 2 = 0 \tilde{\mathbf{x}}^{T}_{1} \mathbf{E} \tilde{\mathbf{x}}_{2}=0 x~1TEx~2=0

其中 x ~ ∈ \tilde{\mathbf{x}}\in x~ 第一张图片的摄像机坐标系.
x ~ 2 \tilde{\mathbf{x}}_{2} x~2 属于第二张图片的摄像机坐标系. 又因为

x ~ = K − 1 x \tilde{\mathbf{x}}=K^{-1}x x~=K1x 也就是说, 把2D点逆变换到摄像机坐标系里面.
通过上面的变换 x ~ \tilde{\mathbf{x}} x~ 就变为已知了.
那么我们同样可以解方程组接触 E \mathbf{E} E.
注意 E \mathbf{E} E是一个选对旋转矩阵.
所以我们这里要假设图片1的摄像机坐标系位 R = I , T = 0 \mathbf{R=I, T=0} R=I,T=0.
这样我们对 E \mathbf{E} E做SVD分解就可以解出一个 R E , T E \mathbf{R}_E, \mathbf{T}_E RE,TE.
因为我们假设第一个相机位基准相机.
所以虽然 E \mathbf{E} E是一个相对旋转矩阵.
是从第一章图的摄像机坐标系旋转到第二张图的摄像机坐标系.
可是由于第一张图是基准 R = I , T = 0 \mathbf{R=I, T=0} R=I,T=0.
那么我们从 E \mathbf{E} E中分离出来的 R E , T E \mathbf{R}_E, \mathbf{T}_E RE,TE
就是第二张图的摄像机坐标系 R 2 , T 2 \mathbf{R}_2, \mathbf{T}_2 R2,T2.

再次强调: 到目前为止,我们知道了 K , R , T , x \mathbf{K, R, T, x} K,R,T,x,
注意 x \mathbf{x} x是点对. 要求的对象变为 X \mathbf{X} X

求解 X \mathbf{X} X

现在求解 X \mathbf{X} X就变得十分的简单了. 就是一个线性优化问题.
而且变成一个线性最小二乘法.
假设我们有N张图片中含有同一个 X \mathbf{X} X那么,可以把优化函数写为
X = arg ⁡ min ⁡ X ∑ i = 1 N ∥ P i X − x i ∥ 2 2 , P i = K i [ R i , T i ] \mathbf{X}=\arg \min_{\mathbf{X}} \sum_{i=1}^{N}\| \mathbf{P}_{i} \mathbf{X}-\mathbf{x}_{i} \|^{2}_2, \mathbf{P}_i=K_i[R_i,T_i] X=argXmini=1NPiXxi22,Pi=Ki[Ri,Ti]

下标 i i i,表示第几张图片. 用这个方法可以成功的解出一个 X \mathbf{X} X.
也就是一个3D点. 最后, 解若干个这样的方程.
你可以恢复出一个3D点云.也就是2D像素对应的3D点云. 至此我们的目的就完成了.
我们最终解出了 X \mathbf{X} X. 可是遗憾的是, 还不够.
因为误差和匹配错误的问题. 效果不够好. 所以最后还需要做一次优化.

优化 K , R , T , X \mathbf{K, R, T, X} K,R,T,X

[ P , X ] = arg ⁡ min ⁡ P , X ∑ i = 1 N ∑ j = 1 D ∥ P i X j − x j ∥ 2 2 [\mathbf{P, X}] = \arg \min_{\mathbf{P, X}} \sum_{i=1}^{N}\sum_{j=1}^{D} \|\mathbf{P}_i\mathbf{X}_j-x_j\|^2_2 [P,X]=argP,Xmini=1Nj=1DPiXjxj22
其中 P = { P 1 , P 2 , ⋯   , P N } , X = { X 1 , X 2 , ⋯   , X D } \mathbf{P}=\{\mathbf{P_1, P_2, \cdots , P_N}\}, \mathbf{X}=\{\mathbf{X}_1, \mathbf{X}_2, \cdots, \mathbf{X}_D\} P={P1,P2,,PN},X={X1,X2,,XD},
其中N N N N是图像数量. D D D是特征点数量. 這個優化是一個非線性最小二乘法.
優化具體細節在這裏暫時不提. 不过至此我们就完成了所有SFM过程.
注意我这里简化了变量实际上 P i = K i [ R i , T i ] \mathbf{P_i=K_i[R_i,T_i]} Pi=Ki[Ri,Ti]. 具体来说,
非线性最小二乘是怎么优化这些参数的.还要具体详细的查阅这方面的资料.
加粗样式

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三维重建是通过多个二维图像来还原物体的三维结构。在Matlab中,可以使用Structure from Motion (SfM)算法进行三维重建。下面是一个简单的流程示例: 1. 加载图像和相机标定: ```matlab imageDir = fullfile('D:','picture','box'); % 图像文件夹路径 imds = imageDatastore(imageDir); % 加载图像数据集 load('calibrationSession'); % 加载相机参数 cameraParams = calibrationSession.CameraParameters; % 获取相机参数 ``` 2. 提取图像特征点: ```matlab % 创建一个视觉里程计对象 vSet = viewSet; % 遍历每个图像,提取特征点并添加到视觉里程计对象中 for i = 1:numel(imds.Files) I = readimage(imds, i); % 读取图像 grayImage = rgb2gray(I); % 转换为灰度图像 % 提取特征点和特征描述符 points = detectSURFFeatures(grayImage); [features, validPoints] = extractFeatures(grayImage, points); % 添加特征点到视觉里程计对象中 vSet = addView(vSet, i, 'Points', validPoints, 'Features', features); end ``` 3. 估计相机姿态: ```matlab % 估计相机姿态 vSet = estimateCameraPose(vSet, 'MaxReprojectionError', 1); ``` 4. 三角测量: ```matlab % 三角测量 vSet = find3D(vSet); % 获取三维点云 pointCloud = vSet.Views.Points; ``` 5. 可视化结果: ```matlab % 可视化三维点云 pcshow(pointCloud); ``` 请注意,这只是一个简单的示例流程,实际的三维重建过程可能更加复杂。你可以根据自己的需求和数据进行相应的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值