揭秘结构光解码:块投影方法的真相

作者:石昊 | 来源:3DCV

1、导读

本研究中提出的方法旨在解决结构光扫描中的互反射问题。当投射到物体上的条纹相互干扰时,就会发生互反射,从而导致3D重建不准确。为了缓解这个问题,研究人员采用了块投影。这涉及以块方式将条纹投影到对象上。这样做可以减少条纹之间的干扰,从而最大限度地减少互反射对重建过程的影响。一旦捕获了块投影图像,就应用多个滤波器来去除任何错误的解码区域。中值滤波器和标准差滤波器用于识别和消除不正确的解码值。此外,还利用极线来进一步细化解码结果。为了合并不同的解码块,提出了一种基于解码值连续性的新方法。该方法可确保合并过程顺利且准确,从而产生更可靠的3D重建。实验结果证明了该方法在合并不同解码块方面的有效性。该方法成功减轻了相互反射的影响,从而提高了重建3D模型的准确性。

2、研究内容

近年来,三维检测技术取得了长足的发展,双目视觉、结构光、飞行时间三种主要技术成为主流。双目视觉技术涉及使用两个相机来识别图像中的共同特征点并重建三维模型。另一方面,结构光技术用投影仪取代了双目视觉中的一个相机。投影仪将设计的图案投射到物体上,然后对捕获的图像进行解码以重建3D模型。飞行时间技术通过计算光的飞行时间来测量深度,通常用于全视角无人驾驶车辆技术的激光雷达系统中。在这些技术中,结构光因其准确性和开发成本(介于双目视觉和飞行时间之间)而在工业界通常受到青睐。然而,结构光三维扫描系统仍然面临一些挑战。其中包括相机像素过饱和、在黑暗环境中工作以及处理模糊的边缘。这些问题会影响结构光扫描系统的准确性和可靠性。因此,本研究提出了一种基于解码值连续性的合并方法,流程图如图1所示。捕获块投影图像,对解码块进行去噪,计算每个解码块的连续性值并合并最优解码结果。最后,用最优解码结果进行重构。

3、互反射现象

当物体的几何形状接近V形时,光的互反射变得更加明显,如图2所示。当投影仪的光线投射到物体上时,反射光可分为直接反射光和间接反射光。直接反射光是指照射到物体表面后直接进入传感器的光。另一方面,间接反射光是照射到物体表面并在进入传感器之前反射到另一个表面的光。在理想情况下,只会存在直接反射光,但由于物体的几何形状,相机接收到的反射光通常包括直接反射光和间接反射光。然而,当间接反射光的量超过直接反射光的量时,投影的条纹就会失真,从而导致解码过程中出现错误。

关于短程和长程效应,观察到当条纹频率太高时,条纹往往会变得模糊,而如果频率太低,则互反射变得更加明显。为了解决本研究中的这个问题,采用了大间隙格雷码,如图3所示。通过利用具有合适宽度的条纹,与传统格雷码方法相比,捕获条纹的质量得到了提高。这一改进有助于减轻与模糊和相互反射相关的问题。

4、方法(块投影和合并解码块过程)

4.1、设计块投影图案

在本研究中,基于Jiang提出的想法提出了一种块投影方法。然而,不同之处在于,Jiang的方法需要事先了解预计会出现相互反射干扰的区域。相比之下,本研究中提出的方法涉及在投影仪的整个视场上执行块投影,即使存在未知的几何形状。尽管这种方法可能会导致捕获过程较长,但它可以确保在投影范围内有效抑制互反射。此外,投影块的块边缘可能会受到点扩散现象的影响。为了克服这个问题,设计的块投影图像必须具有重叠像素,如图4所示。这种重叠有助于避免解码块合并过程中点扩散现象的干扰。

4.2、解码块去噪

对捕获的块投影图像进行二值化后,对图像进行解码,得到解码块,记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> D n D_{n} </math>Dn,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1 , 2 , 3 , ... , N n=1,2,3,...,N </math>n=1,2,3,...,N, <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N为该块投影的块数。然而,解码的块通常包含来自背景或相机的随机噪声。为了减轻噪声对解码块的影响,应用了中值滤波器和标准差滤波器。中值滤波器通过用其相邻像素的中值替换每个像素的值来帮助减少噪声。标准偏差滤波器计算每个像素周围的解码值的标准偏差。如果某个像素周围的解码值表现出明显的变化,则可以推断该像素是噪声点。值得注意的是,前景(解码区域)和背景(非解码区域)之间的边缘也可能具有高标准偏差。然而,解码块的边缘是准确的,不应被视为噪声。因此,需要对解码块的边缘进行补偿。除了中值滤波器和标准差滤波器之外,还采用赵帅提出的极线去噪方法来去除不正确的解码区域。光晕是结构光系统中遇到的一种现象,会影响解码结果的准确性。因此,使用极线来消除尽可能多的错误解码点。如图5 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( a ) (a) </math>(a), <math xmlns="http://www.w3.org/1998/Math/MathML"> D n ( x , y ) D_{n}(x,y) </math>Dn(x,y)的解码值对应于投影仪像素 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( u , v ) P_{(u,v)} </math>P(u,v),相机坐标 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( x , y ) (x,y) </math>(x,y)生成一条极线, <math xmlns="http://www.w3.org/1998/Math/MathML"> l ( x , y ) l_{(x,y)} </math>l(x,y),在投影仪图像上。理想情况下,投影仪图像上的匹配点 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( u , v ) P_{(u,v)} </math>P(u,v)应位于对极线 <math xmlns="http://www.w3.org/1998/Math/MathML"> l ( x , y ) l_{(x,y)} </math>l(x,y)上。然而,匹配点 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( u , v ) P_{(u,v)} </math>P(u,v)与极线 <math xmlns="http://www.w3.org/1998/Math/MathML"> l ( x , y ) l_{(x,y)} </math>l(x,y)之间常常存在距离误差。当该误差距离超过一定阈值时,则认为该匹配点无效,如图5 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( b ) (b) </math>(b)所示。

4.3、合并解码块

在对捕获的块条纹图像进行解码之后,需要将不同的解码块 <math xmlns="http://www.w3.org/1998/Math/MathML"> D n D_n </math>Dn合并为最终的解码结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> D f i n a i D_{finai} </math>Dfinai。然而,块投影可能会导致与其他块的相互反射,从而导致不期望的解码结果并且使得直接合并不同解码块变得具有挑战性。为了克服这个问题,利用了解码值的连续性,因为预计如果对象的表面是连续的,则解码值也应该表现出连续性。判断解码值连续性的计算方法如图6所示。使用[1 -2 1]的水平核对解码块 <math xmlns="http://www.w3.org/1998/Math/MathML"> D n D_n </math>Dn进行滤波。如果过滤后的值落在 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( − 2 , 2 ) (-2,2) </math>(−2,2)范围内,则认为是连续的。如果大于或等于2或小于或等于-2,则视为终点。将两个端点之间的距离视为连续线段,将连续线段的数量作为每个像素的连续度 <math xmlns="http://www.w3.org/1998/Math/MathML"> C n ( x , y ) C_{n}(x,y) </math>Cn(x,y)。对每个解码结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> D n D_n </math>Dn进行连续度的计算。最终的合并解码结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> D f i n a i D_{finai} </math>Dfinai是通过为所有 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m个块中的每个像素 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( x , y ) (x,y) </math>(x,y)选择最大连续性来获得的。换句话说, <math xmlns="http://www.w3.org/1998/Math/MathML"> D f i n a i ( x , y ) D_{finai}(x,y) </math>Dfinai(x,y)等于 <math xmlns="http://www.w3.org/1998/Math/MathML"> D m ( x , y ) D_{m}(x,y) </math>Dm(x,y),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> D m D_m </math>Dm表示具有最高连续性的解码块。从数学上来说,最终的合并解码结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> D f i n a i ( x , y ) D_{finai}(x,y) </math>Dfinai(x,y)等于 <math xmlns="http://www.w3.org/1998/Math/MathML"> D m ( x , y ) D_{m}(x,y) </math>Dm(x,y)。 <math xmlns="http://www.w3.org/1998/Math/MathML"> D f i n a i ( x , y ) D_{finai}(x,y) </math>Dfinai(x,y)表示为等式 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( 1 ) (1) </math>(1):

如图6所示:解码块使用核[1 -2 1]进行过滤,当数字大于或等于2或小于或等于-2时确定数字列表的端点。每个像素的连续度是计算连续列表的像素数。

5、实验

5.1、实验设置

为了保证实验结果不受环境光的影响,实验在完全黑暗的环境下进行。投影图案由大间隙格雷码的 11个垂直条纹和10个水平条纹组成。为了便于条纹的二值化,还添加了反转图案。因此,总共使用了42个投影图像。这42幅图像被分成10个垂直和10个水平的矩形块,总共产生840幅图像进行块投影。

5.2、重建结果

为了验证所提出的合并解码块方法,实验中使用了金属碗。碗的几何形状是凹形的,如图8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( a ) (a) </math>(a)所示。碗存在相互反射问题,导致扫描效果不佳。此外,碗的金属表面加剧了相互反射问题。然而,通过利用区域投影,如图8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( b ) (b) </math>(b)所示,可以有效缓解这个问题。本研究提出的方法旨在优化解码块的合并。实验结果如图8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( c ) ( d ) ( e ) ( f ) (c)(d)(e)(f) </math>(c)(d)(e)(f)所示。图8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( c ) (c) </math>(c)和8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( d ) (d) </math>(d)显示了不使用块投影的解码和三维重建结果。周围条纹中存在互反射光会导致解码结果不佳。另一方面,图8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( e ) (e) </math>(e)和8 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( f ) (f) </math>(f)展示了使用块投影获得的解码和三维重建结果。这些结果表明,互反射干扰得到了有效减轻。但需要注意的是,碗中心区域由于曝光过度而无法解码,而这个问题无法通过块投影来解决。

6、总结

在本研究中,利用了先前研究人员提出的块投影方法来解决相互反射问题。此外,提出了一种用于解码块的新颖合并方法。解码值的连续性是合并不同解码块的关键因素。实验结果验证了该方法有效地融合了分块投影的结果,改善了互反射问题。

相关推荐
XiaoLeisj16 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq35 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组