三维重建(SFM):图像形变对重建的影响与优化

三维重建(SFM):360全景摄像机采集街景图像对重建的影响与优化

 

 

采集工具:insta one 360

数据:360自动拼接的“全景”视频文件(截帧,转换,切割)。

切图工具:open MVG  pano2pinhole(已有功能,绕y轴旋转,横向选取n个pinhole点,并且选择每个点切割图形的FOV)(切图已经是针对全景图应用,并非机械crop,但仍不能避免图像形变)

问题简述:大FOV产生严重形变,影响行进方向图片的匹配(RANSAC)被干扰,关联度不够;小FOV画幅小,窄街横向图片景深不够,关联度不够。

 

行进方向匹配实验:

sift2048,FOV40:

两图跨9帧(帧不确切指定真实视频的fps(此例一帧可能是1/2秒),作为统一切割完成的数据集的相对标尺)

两图跨13帧

18帧

FOV120

5帧

 

 

FOV120,5帧,但是截取中间部分,好了很多,只为了证明图片中部匹配不错,但是周边形变,被RANSAC过滤后,好的匹配对也会消失!!!

FOV160,5帧,切割局部

 

切割组数实验

sift2048,FOV80下,产生5组,重合度较低。

FOV80下,产生6组,明显增加重合度。

FOV80下,产生4组,无重合度,损失信息。

结论:并非先平均切割指定组数再拉伸(360/5=72,72度拉伸至80度),而是根据组数选取中心点,每个中心点指定FOV切割。多组切割有利于增加重叠数据与总的匹配对数,有利于建模过程中的匹配鲁棒性(但不确定视角是否正确,是否因为畸变干扰不同视角间匹配关系,否则应使用小fov多组数的方式进行切割,高低视角的损失再做补救)

1.不用担心增加组数会产生额外畸变(比如,先平均得到360/6=60度,再拉伸到期望的80度)

2.组数超额可能有额外收益(建议:同FOV下,可以尝试更多组数,使视角覆盖度数更大,FOV80*6=480度>FOV80*5=400度,FOV40*10=400度>FOV40*9=360度。)

 

后续经过实验证明:增加组数n与同一帧下不同视角间的重叠度,能提高总的匹配对。

 

基于特征匹配实验结论,使用小FOV更优,但画幅不够,侧向匹配变差

改善方案

根据前边分析,在FOV45-120之间,根据图片形变量(“畸变”)和画幅大小,折中取了FOV50~FOV80等不同参数进行对比实验,在某些场景下,确实产生了质的变化——原本不能重建的数据集重建成功。

 

 

定量分析实验

为了让自己的各种“猜测”不变成玄学,从增量重建过程拆解出很多参数进行统计。

例:

total_images:90
total_image_pairs:1961
max_corrs:1570
min_corrs:30
total_corrs:430529
corrs_avg:219
corrs_rms:179
total_tri_corrs:251609
tri_corrs_avg:128
tri_corrs_rms:339
avg_recall:0.623677
total_track_len:89318
rms_track_len:8.46855
avg_track_len:6.1688
track3_cnt:5437,   percentage:0.375509
track6_cnt:5239,   percentage:0.361834
track10_cnt:2009,   percentage:0.138753
track15_cnt:916,   percentage:0.063264
track30_cnt:716,   percentage:0.0494509
trackInf_cnt:162,   percentage:0.0111886
total 3d points:14479

此外还有:重投影误差等。

参数分析依据:

3d点,越多,证明场景覆盖越好,特征点提取越全面;

corrs相关都是匹配对,事关匹配质量和数量,影响重建过程;

track是每个3d点属于多少张图,反映图片之间相关度;

track3_cnt意为:track长度小于等于3;后边的percentage为占所有3d点的百分比

track3_cnt意为:track长度小于等于6(大于3);

 

 

 

 

 

 

实验结果统计

 

有个组合技巧:例如,用u60v60n8切割全景图,再用u80v80n8切割全景图,从u60数据集下选取某两个和行进有关的组,从u80数据集下选取几个与横向视角(店铺)有关的组,拼在一起进行重建,大量实验表明,有明显改善,甚至丢失一侧墙壁也可重建成功,鲁棒性大幅增强。

 

291_320小图集基础实验

 total_imagestotal_image_pairs total_corrs corrs_avg corrs_rmstotal_tri_corrs tri_corrs_avg tri_corrs_rmsavg_track_lenrms_track_lenmedian_number_of_key_points_per_photonum_of_points(平均3D点)RMS_of_rep
rojection_errors
报告3d点(无过滤)报告3d点3d点召回率说明
340u80v80n51504707 711927 151 149424803 90 244  51501511.01744546608315900.67778063980虽然3d点召回率优于72,但是因为有视角重叠,并且纵向视角也更大,而且这是340的
                  
320u72v72n5150 302455176156178126104276  52172180.93937822727151870.668236019重投影误差:
72是否优于60?因为组数?因为视角?30张图过少,rms不能反应所有问题,加大数据量单独对比此项
(不对等条件,u72对应v72,而u60对应v60)
NLGX320_u90v90n4               #DIV/0!调试流程用
                #DIV/0! 
重叠改善对比
320u120v120n390868182911210 111880128   56732381.0390851525791980.602870813 
320u120v120n41201705265318155159174546102249  54732571.10793121597131280.607862203增加重叠度,误差加大
多组数重叠有利于提升3d点召回率
                #DIV/0! 
同uv下对比不同n
320u60v60n6180 32015916814318558497258  47701940.97059523036154130.669083174 
320u60v60n82404396763619173139440183100262  46762280.95822138183247110.647172826视角重叠:匹配效果增加、点云增加,加滤波后点云仍明显多于n6
                  
v对比,n无重叠
320u45v60n8240 35380413810518000970205  45971660.95461124884162790.654195467较u60v60n6,总度数相同,无重叠
tri_corrs提升不明显
3d点增多
重投影误差降低
320u60v60n6180 32015916814318558497258  47701940.97059523036154130.669083174 

 

u72n5下对比不同v,证明小v画幅瓶颈。

 total_imagestotal_image_pairs total_corrs corrs_avg corrs_rmstotal_tri_corrs tri_corrs_avg tri_corrs_rmsavg_track_lenrms_track_lenmedian_number_of_key_points_per_photonum_of_points(平均3D点)RMS_of_rep
rojection_errors
报告3d点(无过滤)报告3d点3d点召回率说明
 
NLGX320_u72v40n5150159127785517414315613298265  46881630.9774618282122410.669565693从刚重建结束,到最后产生报告,两个3d点数据有何不同,是否被过滤?二次空三?没有gcp应该没有
NLGX320_u72v60n51291231237837193163142847116288  48621720.9424117949120080.66900663注册不全
NLGX320_u72v72n5  302455176156178126104276  52172180.93937822727151870.668236019 
NLGX320_u72v90n5150175728397116114716887296254  49672400.91781622323149350.6690409 
NLGX320_u72v120n5 197129862215114218053091237  56462860.98088522812146770.6433894443d点召回率下降:过滤基于体素过滤,证明从结构讲,或者至少从目前的版本讲,v120多冗余3d点并没有使用价值,反而增大误差。

 

 

 

 

 

小FOV确实取得了更好的平均track长度

 total_imagestotal_image_pairs total_corrs corrs_avg corrs_rmstotal_tri_corrs tri_corrs_avg tri_corrs_rmsavg_track_lenrms_track_lenmedian_number_of_key_points_per_photonum_of_points(平均3D点)RMS_of_rep
rojection_errors
报告3d点(无过滤)报告3d点3d点召回率说明
 
NLGX320_u90v90n412012472513272011841578041263064.6133638495.472636361   20099    total_track_len 92724.000000000000 double
 
NLGX320_u72v72n515017073024031771571780531042774.6886850695.586258069  0.92458922678  
  total_track_len 106330.00000000000 double
NLGX320_u60v60n61801903320829168143185874972594.7573259685.708141885  0.94067523171  
  total_track_len 110232.00000000000 double
 
NLGX320_u45v60n82402547353903138116205610802054.8621219285.872982768  0.92511325392  
  total_track_len 123459.00000000000 double
 

同n下同group对比

因为单视角无法重建,选择了n个视角下的group2、3、4,但是同n8下,不同u总覆盖与重叠度不同,有一定干扰,最后使用u60g2\u60g4+u110g3的组合方式控制,g3更偏行进方向(大景深),最后证明小fov确实在行进方向能获取匹配优势。

 

 total_imagestotal_image_pairs total_corrs corrs_avg corrs_rmstotal_tri_corrs tri_corrs_avg tri_corrs_rmsavg_track_lenrms_track_lenmedian_number_of_key_points_per_photonum_of_points(平均3D点)RMS_of_rep
rojection_errors
报告3d点(无过滤)报告3d点3d点召回率说明
track统计实验:证明大FOV的平均纵向关联度更差(控制变量,用同样的n,n=8,选中单一视角,6点钟方向:group_index=3)
单视角重建失败,改用group_index=2,3,4
                  
NLGX320_u45v60n8_g2g3g49096916525517014195791982425.120441226.23330723248611380.92180810063    total_track_len 51527.000000000000 double
NLGX320_u70v70n8_g2g3g49019714306422181792515801273386.1647318968.46744489253341580.93798114472    total_track_len 89216.000000000000 double
NLGX320_u90v90n8_g2g3g49020204038761991682387381182985.9301919728.0732510352791851.01596414325    total_track_len 84950.000000000000 double
NLGX320_u120v120n8_g2g3g4                 
NLGX320_u60v60n8_g2g3g4        5.860927.9377  0.8805213933   
NLGX320_u60v60g2g4_u110v110g3        5.430786.96349  0.97586312777   
NLGX320_u60v60g2g4_u90v90g3                程序崩溃CheckErrorCUDA

单独对比u60g2\g3\g4与u60g2\u110g3\u60g4,明显u110获得了很大的劣势

 

 

大数据集下重建结果:

最后,不光在有竹林的子集小场景(badcase)重建成功,包含同样场景的大场景也重建成功。(对照组均失败)

 

 

下图:南锣鼓巷634张图,u70v80n8

 

 

补充:这个很像orbslam2的场景,orbslam2通过特征均匀分布来增加关键帧的鲁棒性。现在也是因为误匹配导致正确的特征点消失。(当然,思路落实到操作,不一定相似,现在排除外点才是更好的——也就是裁剪)

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
三维重建是通过多个二维图像来还原物体的三维结构。在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); ``` 请注意,这只是一个简单的示例流程,实际的三维重建过程可能更加复杂。你可以根据自己的需求和数据进行相应的调整和优化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值