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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle错误 904,IMP-00058: 遇到 ORACLE 错误 904

    oracle错误 904,IMP-00058: 遇到 ORACLE 错误 904我将A服务器下的导入B服务器时其中一个表出现以下错误,出错误后我单独将这个表导出,然后导入。B服务器下已有T_CALLREORDS表,并且已有新数据,T_CALLREORDS有外键约束T_USER表。我的语句如下C:UsersAdministrator>impgxcfkefu/gxcfkefufull=yfile=e:/gxcf_T_CAL…显示全部我将A服务器下的导入B服务器时…

    2022年9月20日
    2
  • wireshark抓取dns数据包_2021年dns

    wireshark抓取dns数据包_2021年dns实验步骤一根据实验环境,本实验的步骤如下:1、测试环境中获取DNS数据包。2、分析DNS数据包。任务描述:获取两种类型的DNS数据包(1)通过浏览器访问域名(www.baidu.com)来获取DNS数据虽然合天实验室环境下,无法抓取此部分数据包(其实也可以自己搭建服务器,配置DNS服务器,但设计者比较懒,就将就下吧),但设计者希望学习的人能根据例子在自己的笔记本上抓取,然后分析。我们以登录www.baidu.com来获取DNS数据,启动Wireshark,在Filter中输入dns。打开浏览器

    2025年5月27日
    3
  • 面向APP抓包方法

    面向APP抓包方法面向APP抓包方法,采用Fiddler软件进行抓包。

    2022年5月30日
    32
  • python和java哪个就业更好_python和JAVA的区别

    python和java哪个就业更好_python和JAVA的区别一、从几个方面进行比较Python和Java都是目前最为流行的编程语言,到底哪一个更好找工作,比较以下几个方面可以提供一些参考价值。1、就业现状从目前的就业现状来看,Java的工作机会肯定是更多的,如Web开发、大数据开发和移动互联网开发等都是基于Java的应用方向。正是因为应用方向多,所以存在人才发展跟不上市场的需求的现状,因此长期来看Java的霸主地位是不会动摇的。但Python是更面向未来的。毕竟我国把发展人工智能作为国策大力推动。大数据、人工智能、数据分析都是基于Python…

    2025年7月31日
    2
  • c语言开发ETL,【ETL开发工作内容|工作职责|ETL开发做什么】-看准网「建议收藏」

    c语言开发ETL,【ETL开发工作内容|工作职责|ETL开发做什么】-看准网「建议收藏」工具应用ETL工具的典型代表有:Informatica、Datastage、OWB、微软DTS、Beeload、Kettle、久其ETL……开源的工具有eclipse的etl插件:cloveretl数据集成:快速实现ETLETL的质量问题具体表现为正确性、完整性、一致性、完备性、有效性、时效性和可获取性等几个特性。而影响质量问题的原因有很多,由系统集成和历史数据造成的原因主要包括:业务系统不同时期…

    2022年6月5日
    32
  • 【云原生】第十二篇–docker容器镜像仓库Harbor部署[通俗易懂]

    【云原生】第十二篇–docker容器镜像仓库Harbor部署[通俗易懂]由于国内访问国外的容器镜像仓库速度比较慢,因此国内企业创建了容器镜像加速器,以方便国内用户使用容器镜像。Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(RoleBasedAccessControl),AD/LDAP集成、以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。…

    2025年7月29日
    4

发表回复

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

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