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,美滋滋。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 每天一个linux命令(34):du 命令

    每天一个linux命令(34):du 命令

  • ESP8266简介:三种编程方式「建议收藏」

    ESP8266简介:三种编程方式「建议收藏」随着互联网的日益发展,智能家居的观念也逐渐深入人心。想要玩转智能家居,就离不开互联网,今天给大家介绍一款模块——ESP8266。小编将手把手教大家利用8266实现家电的控制。ESP8266可以用来做串口透传,PWM调控,远程控制开关:控制插座、开关、电器等。该模块有三种工作模式,大家可以根据自己的具体情况来选择:STA模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互联网…

  • 身为程序猿——谷歌浏览器的这些骚操作你真的废吗!【熬夜整理&建议收藏】[通俗易懂]

    前言——几日前,我那上初中的妹妹突然发VX问我说她想复制网上里搜到的一些朋友圈文案拿去发朋友圈,但是问题是复制不了!听到这个问题我嘿嘿一笑(心想:难道网上还有我爬虫爬不到的数据吗?难道妹妹没听过江湖流传的一个传说——可见即可爬吗!),我嗖的一声从床上弹坐起来,坐到电脑前,打开我的谷歌浏览器输入妹妹的网址——果然:又是这熟悉的弹窗,又是这该死的VIP才能享受的特权,不过——这些对于我们爬虫人来说都是小问题,我打开我的pycharm,啪啪一顿猛敲,一会一个百度文库的小爬虫就写好了,输入网址,下载OK

  • LaTeX 换行

    LaTeX 换行LaTeX换行的几种方法方法一:输入\\结果即只进行单纯换行,并无缩进方法二:输入\par显示结果为自动换行加缩进

  • ADB 环境变量配置教学

    步骤如下:1、右击电脑图标点击电脑属性2、找到相关设置点击高级系统设置3、找到高级点击环境变量4、在系统变量中点击双Path5、点击新建6、确定

  • stringtokenizer java,Java中的StringTokenizer「建议收藏」

    stringtokenizer java,Java中的StringTokenizer「建议收藏」Java中的StringTokenizerjava.util.StringTokenizer类允许您将字符串分成令牌。这是打破字符串的简单方法。它没有提供区分数字,带引号的字符串,标识符等的功能,例如StreamTokenizer类。我们将在I/O一章中讨论StreamTokenizer类。StringTokenizer类的构造方法StringTokenizer类中定义了3个构造函数。Constr…

发表回复

您的电子邮箱地址不会被公开。

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