sfm点云代码_SfM实现过程分析

sfm点云代码_SfM实现过程分析昨天立了flag,今天要学SfM过程,大概看了看SfM的各个文件目录,build&make出来的linux-release-x86大概叫这个名字的文件夹里面有很多可执行文件,直接根据文档里给的参数跑就可以,要搞源码的话实在是搞不起,太复杂,太庞大了。下面的代码是从他给出的easytouse的python脚本中截取的核心代码,注释的也很赞,清晰明确。SfMglobalpipeline…

大家好,又见面了,我是你们的朋友全栈君。

昨天立了flag,今天要学SfM过程,大概看了看SfM的各个文件目录,build&make出来的linux-release-x86大概叫这个名字的文件夹里面有很多可执行文件,直接根据文档里给的参数跑就可以,要搞源码的话实在是搞不起,太复杂,太庞大了。下面的代码是从他给出的easy to use的python脚本中截取的核心代码,注释的也很赞,清晰明确。

SfM global pipeline代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31print (“1. Intrinsics analysis”)

pIntrisics = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_SfMInit_ImageListing”), “-i”, input_dir, “-o”, matches_dir, “-d”, camera_file_params] )

pIntrisics.wait()

print (“2. Compute features”)

pFeatures = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_ComputeFeatures”), “-i”, matches_dir+”/sfm_data.json”, “-o”, matches_dir, “-m”, “SIFT”] )

pFeatures.wait()

print (“3. Compute matches”)

pMatches = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_ComputeMatches”), “-i”, matches_dir+”/sfm_data.json”, “-o”, matches_dir, “-g”, “e”] )

pMatches.wait()

# Create the reconstruction if not present

if not os.path.exists(reconstruction_dir):

os.mkdir(reconstruction_dir)

print (“4. Do Global reconstruction”)

pRecons = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_GlobalSfM”), “-i”, matches_dir+”/sfm_data.json”, “-m”, matches_dir, “-o”, reconstruction_dir] )

pRecons.wait()

print (“5. Colorize Structure”)

pRecons = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_ComputeSfM_DataColor”), “-i”, reconstruction_dir+”/sfm_data.bin”, “-o”, os.path.join(reconstruction_dir,”colorized.ply”)] )

pRecons.wait()

# optional, compute final valid structure from the known camera poses

print (“6. Structure from Known Poses (robust triangulation)”)

pRecons = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_ComputeStructureFromKnownPoses”), “-i”, reconstruction_dir+”/sfm_data.bin”, “-m”, matches_dir, “-f”, os.path.join(matches_dir, “matches.e.bin”), “-o”, os.path.join(reconstruction_dir,”robust.bin”)] )

pRecons.wait()

pRecons = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, “openMVG_main_ComputeSfM_DataColor”), “-i”, reconstruction_dir+”/robust.bin”, “-o”, os.path.join(reconstruction_dir,”robust_colorized.ply”)] )

pRecons.wait()

过程分析

SfM_GlobalPipeline.py的核心代码清楚地展示了Multi-view structure from motion(SfM)的实现步骤:

读取并存储输入图像的信息于sfm_data.json中

views中的每个子集都代表存储图像信息,包括文件名,图像尺寸,相机内参数(optional),如果已知相机内参数,可以在图像文件夹中增加txt写出内参数矩阵

sfm_data.json文件格式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54{

“sfm_data_version”: “0.3”,

“root_path”: “/home/jf/openMVG_Build/software/SfM/ImageDataset_SceauxCastle/images”,

“views”: [

{

“key”: 0,

“value”: {

“polymorphic_id”: 1073741824,

“ptr_wrapper”: {

“id”: 2147483649,

“data”: {

“local_path”: “”,

“filename”: “100_7100.JPG”,

“width”: 2832,

“height”: 2128,

“id_view”: 0,

“id_intrinsic”: 0,

“id_pose”: 0

}

}

}

},

],

“intrinsics”: [

{

“key”: 0,

“value”: {

“polymorphic_id”: 2147483649,

“polymorphic_name”: “pinhole_radial_k3”,

“ptr_wrapper”: {

“id”: 2147483660,

“data”: {

“width”: 2832,

“height”: 2128,

“focal_length”: 2881.25212694251,

“principal_point”: [

1416.0,

1064.0

],

“disto_k3”: [

0.0,

0.0,

0.0

]

}

}

}

}

],

“extrinsics”: [],

“structure”: [],

“control_points”: []

}

这个代码高亮丑丑的,差评

根据输入的sfm_data.json文件计算并储存每个图像的描述子

利用上一步的描述子进行特征点匹配

前提是图像之间存在overlap.建立相应的推测光度匹配,并使用一些鲁棒的几何滤波器来过滤所得的对应关系,还给出svg图像来描述这个关系,在程序中得到matches文件夹

sfm点云代码_SfM实现过程分析

GlobalSfM

这个方法是基于在2013年发表于ICCV的论文 “Global Fusion of Relative Motions for Robust, Accurate and Scalable Structure from Motion.”来自运动的多视图结构(SfM)估计图像在公共3D坐标系中的位置和方向。 当逐步(Incrementally)处理视图时,与外部均匀分布残差的全局方法相反,此外部校准可能会发生漂移。 这里该方法提出了一种基于图像对之间的相对运动的融合的新的全局校准方法。(以上谷歌翻译…)所以这种方法听上去比IncrementalSfM更好些,就用它了。

该算法:

输入:相机内参数;具有几何一致性的匹配点

输出:三维点云;相机位姿

计算sfm_data场景的颜色

##(optional)构建已知位姿(鲁棒的三角测量),再构建颜色

GlobalSfMpipeline测试

11张图像(valid),尺寸2128×2832,耗时18 seconds

最后,利用PMVS工具得到稠密点云,这个最耗时…保守估计1分钟吧,毕竟我只会在脚本里加时间函数。

点云是不够的,噪点不少,而且疏密不定,Quan Long 的ppt里对比了Mesh和Volumetric的优劣,表示三角面片形式的mesh更适合作为点云重建的输出,不过转换的方法不好选择,meshlab自带了几种,都不太好用,有闪退的,还有没变化的,还有细节缺失较多的…或许是参数调的不好,只能再搜罗搜罗现成的方法。

(题外话)前天在github上comment openMVG文档的小错误,今天早上居然收到了邮件回复(一位叫Pierre Moulon的开发人员),我也明白了他的原意,不过在指出了ambiguous之处后,他把相关的几处都改了

1月4日更新:

图像集仍是例程克隆下来的Castle的11张照片

耗时:

特征提取 14seconds

特征匹配 4seconds

点云重建 86seconds,共240,000左右个点

为了检测普适性,我用手机(iPhone SE)拍了五张宿舍一角的照片,分辨率为4K,结果尝试多次都出Invalid data的错误,后来查看文档发现The chain will only consider images with known approximate focal length. Image with invalid intrinsic id will be ignored. 又去找sensor_width_camera_database.txt,结果里面根本木有SE的参数(mmp)。

其实最主要的参数是focal length in pixel,畸变系数之类的直接可以忽略掉,然而就这一个参数EXIF里都没有,如果手动算的话还要已知CCD width,公式:focal length in pixels = (image width in pixels) x (focal length in mm) / (CCD width in mm)。最后无奈只得切回windows下了个修改EXIF 的软件,把型号改成iPhone 6s Plus,美滋滋。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151339.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows小知识—恶意软件删除工具(mrt)

    Windows小知识—恶意软件删除工具(mrt)使用方法:打开运行窗口:win+r; 输入”mrt”,回车;3、在弹框之后一直下一步或者自定义都行;

    2022年6月24日
    33
  • 常用进程调度算法_进程调度算法例题

    常用进程调度算法_进程调度算法例题写在前面:我是【程序员宝藏】的宝藏派发员,致力于创作原创干货。我热爱技术、热爱开源与分享,创作的【计算机基础面试问题】系列文章和【计算机基础主干知识】系列文章广受好评!后期会创作更多优质原创系列文章!如果您对计算机基础知识、编程等感兴趣,可以关注我,我们一起成长!本人力荐:如果觉得CSDN排版不够美观,欢迎来我的个人原创公zong号【程序员宝藏】(号如其名,诚不欺你!)查看有红色重点标记和排版美观的全系列文章(不细你来找我要红包)参考链接:TCP三次握手四次挥手好多同学问我要pdf版,我干脆.

    2022年9月29日
    4
  • 2022年化工自动化控制仪表考试模拟100题及答案详解_化工仪表及自动化答案

    2022年化工自动化控制仪表考试模拟100题及答案详解_化工仪表及自动化答案题库来源:安全生产模拟考试一点通公众号小程序2022化工自动化控制仪表上岗证题目系化工自动化控制仪表培训试题上机考试练习题!2022年化工自动化控制仪表考试模拟100题及答案根据化工自动化控制仪表考试大纲。化工自动化控制仪表判断题通过安全生产模拟考试一点通准确把握考试要点。1、【单选题】“硬水”是指水中所溶的()离子较多的水。(B)A、钙和钠B、钙和镁C、镁和铁2、【单选题】串级控制系统具有一定的自适应能力可用于负荷和操作条件有较大变化的场合,是由于增加了()。(B…

    2025年9月27日
    5
  • Goland 2021.5 激活码【在线注册码/序列号/破解码】

    Goland 2021.5 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    60
  • 万能量产工具_u盘量产工具怎样使用

    万能量产工具_u盘量产工具怎样使用MPALLv3.23.00版本量产工具可以用来给16G金士顿U盘(PS2251-50)主控刷固件量产。当然也适合其他ps22XX主控的量产只是不用刷固件,一般是量产坏了或者量产不了才涉及到刷固件。做设置分区数量,制作u盘启动盘、低级格式化等不需要刷固件即可成功量产。包含固件为50的固件:BN50V313M-8K.BIN BN50V3122KM-2@4k.BIN FW50FF01

    2025年10月12日
    4
  • BosonNLP情感词典 评论情感分析[通俗易懂]

    BosonNLP情感词典 评论情感分析[通俗易懂]fromsnownlpimportSnowNLPimportpandasaspdfromcollectionsimportdefaultdictimportosimportreimportjiebaimportcodecs”’#读取评论内容的.txt文件txt=open(‘C:/Users/24224/Desktop/1.txt’,encoding=’utf-8′)text=txt.readlines()print(text)#确认读取文件成功,

    2022年8月23日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号