该系列为条纹投影结构光学习笔记,一共分为四篇。第一篇记录文献阅读的笔记,对重要知识点进行摘录介绍;第二篇为相位求解和相位展开;第三篇为相高模型的标定;第四篇为重构篇。
本篇以理论知识为主,主要从以下三个方面进行介绍,首先介绍条纹投影的三维重建测量原理;然后介绍相位和高度的模型,即相-高模型,最后介绍相位主值的求解和相位展开。本篇博文不涉及具体的代码实现。
参考论文来源:结构光三维成像技术,四川大学,苏显渝
结构光三维成像技术是一种利用辅助的结构光照明获取物体三维像的技术,它采用的技术方案是投影一个载频条纹到被成像的物体表面,利用成像设备从另一个角度记录受被成像物体高度调制的变形条纹图像,再从获取的变形条纹图中数字解调重建出被测物体的三维数字像。其成像系统示意图如下图所示:

为什么相位可以反映物体的高度信息?
当一个正弦光栅图形被投影到三维漫反射物体表面时,从成像系统获取的变形光栅像可表示为:

式中R(x,y)是物体表面不均匀的反射率,即光学影像,包括物体表面的灰度和色度信息,C表示均匀的投影光强,相位函数Φ(x,y)表示了条纹的相位。当漫反射物体是一个标准平面(参考平面)时,条纹的相位具有线性分布的特点:

式中Po为在参考平面上条纹的周期。当漫反射物体是分布在h(x,y)的三维表面时,增加了由高度引起的附加相位调制:

式中λe为等效波长,一个等效波长正好等于引起2π相位变化量的高度变化。这时,从成像系统获取的变形光栅像可表示为

由于物体表面的高度变化引起的条纹相位变化,导致观察到变形条纹。通过相移技术人们很容易从多帧相移条纹图形种分离出Φ(x,y),从而重建h(x,y)的分布,通过相移技术也可以从条纹的调制度中分离 出R(x,y),获 得 物 体 表 面 的 光 学 影 像。
因此,市面上主流的投影重构方法基于Φ(x,y)求解出物体的真实高度信息;基于R(x,y)还原出物体的本身的色彩。
重要点:
1、条纹投影实现物体的三维重建,是将相位-高度建立一个数学模型,得到相位之后可以得到物体的高度信息。
2、我们知道相位是有取值范围的,为[0,2π],但真实世界中物体的高度没有这种局限性,相位求出来是一个周期振荡的范围值。
基于上面两个重点,引出后续两个重要概念:标定模型即相-高模型,相位值的求解和展开。
参考来源:Calibration of fringe projection profilometry: A comparative review,南京理工大学,左超
标定模型一般可以分为两种,第一种为我们一直提到的相-高模型,即相位与真实世界高度的模型;第二种为三角立体模型,投影仪被当做逆相机(投影图案即当做投影仪成像图案),通过匹配相机、投影仪的相位同名点,利用三角测距法进行重建。第二种就是双目结构光,相位的作用用于标记每个图像上的像素点,然后相机1和相机2根据匹配到的点,利用三角测量进行重建。这部分内容在此不再赘述。下面对相高模型进行展开:
根据三角测量原理,我们可以得到相高模型如下:

非平行轴模型消除了光轴平行假设,保持距离𝑑不变,并稍微旋转相机或投影仪,如图所示。
在平行轴相位—高度模型基础上,如果l>>DE,则公式可以进一步简化

可以得到如下模型:

相位-高度可以由如下关系表示:

数学模型表达式为:

其中,ΔΦ(x,y)是相位差,a(x,y),b(x,y)是待标定参数。
对于上述公式,进行移项可得:

上述逆线性相位—高度模型也可以表示为:


基于这个模型可以看到,相高模型标定的过程为a、b、c三个参数求解的过程。这里参考的来源为:利用三频外差实现的小视场三维测量系统,四川大学,艾佳;后续相位的求解和展开也是基于这篇论文。
至此,相高模型总结完毕。接下来,对相位求解和相位展开进行阐述。
相位计算主要分为两步,第一步为相位主值求取;第二步为相位展开。这里针对四步相移法和三频外差法进行阐述。
由上面可以计算得到的相位函数Φ(x,y)为

由于是通过反正切 函数计算相位信息,因此所得的相位值都是被截断在(-π,π]区间内的不连续相位。 为 了得到连续 的相位分布 ,需要进行相位展开。采用三频外差方法进行相位展开。
其中NINT(·)为四舍五入取整运算。 然后外差得到的条纹周期数为1的相位分布等同于Φw(1)等同于已展开的相位Φu(1),以它为起始相位逐级向上进行相位展开: 其中v=√s表示不同外差级次的倍率,而k逐级去2、3。通过最小二乘法对展开相位进行拟合,计算得到的斜率表示为: 再将斜率乘以最大投影条纹数,即可得到最终的展开相位ΔΦ。 综上上述,总结完毕。 接下文:



我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto
我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的
它们可以这样定义Struct.new(:x,:y)但是用它们能做什么?具体来说,如何创建这种结构的实例?这行不通Struct.new(:x=>1,:y=>1)(您收到TypeError:can'tconvertHashintoString)。我正在使用Ruby1.9.2。更新:目前为止很好的指点,谢谢。我想我问这个的原因是我有好几次发现自己想要这样做Struct.new(:x=>1,:y=>1)这样我就可以在可以编写obj.x的地方传递一个对象,而不是说,实例化一个散列并必须编写obj[:x].在这种情况下,我希望该结构真正是匿名的-我不想通过命名从Struct.new调用返回的内容来
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我很难找到在ruby中使用的树数据结构。我可以研究一些众所周知的吗?我的要求很简单。我想创建一棵树(或者可能是一个图)并找到一些节点之间的距离。例如,我可能有一个像下面这样的树/图A/\B-----C/\\DEF我希望能够找到根节点
SO上有几个关于在Ruby中解析结构化文本的问题,但没有一个适用于我的情况。我是RubyWhoislibrary的作者.该库包含多个解析器,用于解析WHOIS响应并从内容中提取属性。到目前为止,我使用了两种方法:基本解析器的正则表达式(例如whois.aero)StringScanner对于高级解析器(例如whois.nic.it)正则表达式效率不高,因为如果我需要提取15个属性,我需要至少扫描同一个响应15次。StringScanner是一个不错的库,但创建一个高效的扫描器并不是那么简单。我想知道您是否建议使用其他一些Ruby工具来实现WHOIS记录解析器。我正在阅读有关Treeto