多视图几何中的三维重建

1. 简介

资料来源为:

1)B站多视图几何三维重建视频讲解:https://www.bilibili.com/video/BV1Sj411f73e

2)武汉大学摄影测量与遥感专业博士李迎松的CSDN: https://blog.csdn.net/rs_lys/article/list/1

涉及的内容主要是 sfm, PatchMatch,刚开始看三维重建,可能有错误,欢迎指正。


2. 多视图几何中的三维重建

2.1 流程 :

      影像序列采集—> 稀疏重建—>稠密重建—>三角化—>纹理重建

2.2 sfm:

      a. 特征点匹配

          匹配到的左右视图同名点对作为Bundle Adjustment (BA)优化的真实值,以便找到合适的场景参数[R|T],

       使得重投影误差最小。

      b. 左右相机相对位姿[R|T]估计

           以第一幅影像作为参考影像,计算其余影像相对于第一幅影像的位姿,如果参考影像位姿为R=I(单位向量),

       T=0(零向量),重建出来的点云坐标为相对坐标,如果对第一幅影像的位姿进行绝对定向,重建出来的点云坐标

       为绝对坐标。

 

 

            法一:5点解算法或三角测量:

                  双视图极限约束:x{_{1}^{T}} F x{_{2}} = 0K{_{1}^{-1}} x{_{1}} [R|T] K{_{2}^{-1}}x{_2}}=0  =>  x{_{1}^{T}}K{_{1}^{-T}} [R|T] K{_{2}^{-1}}x{_2}}=0  => x{_{1}^{T}} F x{_{2}} = 0 =>                                                           X{_{1}^{T}} F X{_{2}} = 0X = K{^{-1}}x{_{1}}

                  极限约束将二维平面搜索压缩为一维极线搜索。

                  F 为右图像到左图像的基础矩阵,图像坐标系。

                  E= [R|T]=K{_{1}^{T}} F K{_{2}}  为本质矩阵,归一化的相机坐标系。

                 此处不考虑相机内参K,只求解E,E为3x4的矩阵,有三个叫参数和三个平移参数,原本需要6个点求解,通过

                 降维(具体什么降维没看)只需要5个点即可求解出[R|T]。

            法二:BA优化(光束平差法):

                  目标函数:min\sum{_i} \sum{_{j}} ( x{ij} - K [R{_i}|T{_j}] Xj )^{2}

                  Xj :第j个空间点(由左图KRT得到)

                  xij  : i-th view image 上由SIFT确定的Xj实际像素点

                  过程:随机初始化[R|T],根据初始化的值计算左图像素点在右图上的同名点像素坐标,并计算其与SIFT匹配

                            得到的实际同名点的像素坐标的误差平方。

       c. 稀疏点云重建

           单个点云的重建步骤:

                       有了K(相机标定)和[R|T],即可列出方程组求解:

                                       x{_{1}} = K{_{1}} [R{_{1}} |T{_{1}} ]X

                                       x{_{2}} = K{_{2}} [R{_{2}} |T{_{2}} ]X            

                       简化成AX=0的形式,对A进行SVD分解,最小的奇异值所对应的向量即为所求的空间点三维坐标。

           影像序列重建方式:

                        增量式重建:两两视图重建,由于得到的[R|T]总是会有误差,所以五误差会一直向后传递并累计,大场景

                                             重建时 会有场景漂移。而且迭代进行BA很耗时。此外,对初始影像对的选取和影像添加顺

                                            序 敏感。优点是用ransac过滤外点,精度高。

                         全局式重建:把结构一次性全部计算完,所有影像都和第一张参考影像求相对位姿,误差均匀分布在外极

                                             几何上(平差),这样误差就不会累积了。不需要考虑初始影像选取。仅执行一次BA优

                                              化,效率高,但鲁棒性不 足,相机相对平移对匹配外点敏感;过滤外极几何边可能会丢失

                                              部分图像。

                         混合式重建:先全局式为[R|T]提供一个初始值,再增量式捆绑调整。没有累积误差。


   2 .3 稠密重建(Multi-view system, MVS)

            MVS分类:

                    基于voxel的MVS

                    基于点对扩散的MVS

                    基于深度图的MVS

           流程:匹配代价构造—>代价累计(传播,聚合)—>深度估计—>深度图优化。

            只看了SGM和PatchMatch。

            经典PatchMatch算法 梳理:

                    a. Slanted support windows模型

                   

                               SGM等方法采用的是(a)视差相等的策略,整幅图所有像素视差相等,且视差值为整数, 如需得到

                        浮点型视 差,要做一元二次曲线拟合;而PMS采用的是倾斜视窗策略,每个像素的视差都是不同的,更

                        加贴合地物走势,而 且视差值是浮点型的。

                               具体的,PMS为每个像素点p(x,y)都初始化一个视差值d(d~(dmin,dmax), 左视图初始化正的视

                         差值, 右视图初始化负的视差值)和法向量n(n.x, n.y, n.z),并计算过点(x,y,d)且法向量为n的空间

                         平面方程fp:

                                                 fp = ax+by+c,    a = -n.x/n.z,    b = -n.y/n.z,

                                                   c = (n.x * x + n.y * y + n.z * d)/n.z)

                                根据平面方程计算匹配代价函数,并根据视差传播来调整更新四个值:平面fp,视差d,法向量n以

                         及代价 cost。

                         注意:此处的点(x,y,d)是在三维中构建了一个x-y-d坐标系,d是视差,绝不是空间点的z坐标值,

                                   点(x,y,d)代入fp求得fp = d,而周边落在平面fp上的点都满足fp公式,并可以根据公式求出它们

                                  各自对应视差。

                    b. 代价计算

                           思想:采用局部代价计算方式

                                像素点p的代价costp: 在以p为中心的窗口Wp内,计算所有像素q的代价并加权求和。加权是为了考

                         虑那些颜色差异大的地方,这些地方很可能是边界区域,因此允许他们存在较大的匹配代价,颜色差异

                         越大,他们和中心 点p的权值越小。

for q in Wp:
    // 计算q的视差dq
    dq = a * qx + b * qy + c
    //另一视图同名点坐标为q’ = q-dq,计算二者颜色和梯度不相似性:
    col = min (|r-r|+|g-g|+|b-b|, τcol)
    grad = min (|grad_x - grad_x| + | grad_y – grad_y|, τgrad)
    //计算两个同名点的代价
    ρ(q,q’) =(1-α)*col +α* grad
    //计算p和q的颜色不相似性col_pq(rgb的L1距离和)
    col_pq = min (|r-r|+|g-g|+|b-b|, τcol)
    //计算q的权值
    w(p.q) = exp(-col_pq/γ)
    // 计算q点加权后的匹配代价
    costq = w(p.q) *ρ(q,q’) = w(p.q) *ρ(q,q-dq)
    // 累加求和
    costp += costq

 

                  c. 迭代传播

                      实质是平面的传播,PMS建议迭代3次。                        

                     包括:空间传播,视图传播,时序传播,平面优化

                     思想:

                             空间传播:邻域像素可能有更合适的平面,检查 p邻域内的像素 q 的平面 fq​是否更适合 p ,

                                                  即检查 m(p,fq​)<m(p,fp​)是否成立,若成立,则把平面fq​作为像素 p的新平面;

                             视图传播:左右视图同名点应该有相似的平面;

                             时序传播:相邻帧同一位置的像素应该有相似的平面(适用于移动较慢,位移较小的情况);

                             平面优化:给视差和法向量添加抖动,看其是否代价更小。

                        

                      注意:每个像素做完上述所有过程,才可以处理下一个像素。并不是所有像素一起做空间传播再做视图传

                                播以及后续操作。

For (num_iter = 0; num_iter++; num_iter<3){
     
     //第一阶段:空间传播
    dir= (num_iter%2==0)? 1,-1;
    //传播起点像素坐标,偶数次迭代,从图像左上角->右下角传播;奇数次迭代,从图像右下角->左上角传播
    x = (dir == 1)? 0, width-1;
    y = (dir == 1)? 0, height-1;
    
    //偶数次迭代,取左侧和上侧像素的平面;奇数次迭代,取右侧和下侧像素的平面
   
    // 左侧/右侧
    qx=px-dir; 
   // 根据q的编号取出平面fq
    ind = y *width+qx;
    fq = plane(ind);
   //以新的平面参数重新计算视察和代价
    dp_new = fq(px, py);
    costp_new = computeA(fq, px, py);
    if (costp<costp) {
    costp=costp_new;
    fp =fq;
     }

    //同理,上侧/下侧 
     qy=py-dir; 
    // 根据q的编号取出平面fq
    ind = py *width+px;
    fq = plane(ind);
    //以新的平面参数重新计算视察和代价
    dp_new = fq(px, py);
    costp_new = computeA(fq, px, py);
    if (costp_new<costp) {
    costp=costp_new;
    fp =fq;
    }}



     //第二阶段:视图传播
    //找p在另一视图的同名点p’ :
    p’ = p-dp
    // 平面转换
    fp_new = aq xr + bq yr + cq 
           = aq (xl-dp) + bqyl + cq
           = aq xl + bqyl + (cq - aq * dp);
    dp_new = fp_new(px,py) ;
    costp_new = computeA(fp_new, px, py);
    if (costp_new<costp) {
       costp=costp_new;
       fp =fp_new;
          }

    //第三阶段:平面优化
    //随机生成抖动值d~(dmin,dmax) 和n(n.x,n.y,n.z~(-1.0f,1.0f)
    //当视差小于0.10f时,停止迭代
     stop_thres= 0.10f;
     while(disp_update > stop_thres) {
          delta_d = rand(dmin,dmax) ;
          //如果溢出,重新生成随机数
          d += delta_d;
         if (d <dmin || d>dmax){
               continue;}

         delat_nx = rand(-1.0f,1.0f);
         delat_ny = rand(-1.0f,1.0f);
         delat_nz = rand(-1.0f,1.0f);
         n+=[ delat_nx, delat_ny, delat_nz];
         n.normalize();

         //重新计算a,b,c,构成新的plane
          a = -n.x/n.z;  b = -n.y/n.z;
          c = (n.x * x + n.y * y + n.z * d)/n.z);
          fp_new = [a,b,c];
          costp_new = computeA(fp_new, px, py);
          if (costp_new<costp) {
              costp=costp_new;
              fp =fp_new;}
         //更新disp_update的范围和n的范围
          dmin = min(d_all);
          dmax = max(d_all);
          nmin = min(n_all);
          nmax = max(n_all);
          disp_update = dmax;
      }

 

             d. 后处理

                 Left-right check: 左右视差图的同名点处,视差值应该互为相反数,因此理论上相加接近于0。实践中,设置

                                           阈值 T=1(1个像素),若: |d(p) + d(p’)|=|d(p) + d(p-dp)|<T,则将(p,p’)放入

                                           Matches集合中,否则放入misMatches集合中。同时,设置misMatches中点的视差为无效

                                           值。

                

                 Fill: 无效值多是由于是背景区域或被前景遮挡而导致视差匹配错误。对于被遮挡或者背景区域,他们离相机

                        相对较远,视差也相对较小。因此对于无效值,左右各找一个有效视差,取他们的平面为当前无效像素

                        计算视差,视差小的作 为输出视差。

 

                 Weighted median filter:视差填充造成条带,因此进行中值滤波。具体操作是,将Wp中的权值w(p,q)和他

                                                       们的视差值dq组成数据对(w(p,q), dq),并按照w(p,q)从小到大排列,当累加

                                                        权值首次超 过总权值一 半时,所对应的视差值即为输出视差值。

 

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视图三维重建是一种通过利用多个视图角度的图像数据来恢复三维物体的空间结构和形状的方法。Matlab是一种强大的科学计算软件,也可用于实现多视图三维重建。 首先,我们需要获得多个视图的图像数据。可以使用不同角度拍摄的相机,或者通过使用一台相机在不同位置拍摄多个图像。确保每个图像涵盖所需的物体视角。 其次,我们需要将这些图像数据导入Matlab。可以使用imread函数逐个读取图像文件,并将其存储为Matlab的矩阵数据结构。 接下来,我们需要进行视图对齐。这是为了确保不同视角的图像在相机坐标系具有相同的位置和方向。可以使用计算机视觉技术,如特征点匹配和相机运动估计,来实现视图对齐。 然后,我们需要进行三维重建。可以使用Matlab的三维几何模型库,如点云库和三角剖分库,来构建三维物体的几何模型。可以根据视图对齐后的图像数据,恢复物体的三维点云,并使用三角剖分算法构建三角网格模型。 最后,我们可以对重建的三维模型进行可视化和编辑。Matlab提供了许多用于三维可视化和编辑的函数和工具箱,可以帮助我们检查和修改三维模型,以满足我们的需求。 综上所述,通过使用Matlab,我们可以实现多视图三维重建,并且可以对重建的三维模型进行可视化和编辑,以便于进一步的分析和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值