kienct 散斑测量原理

本文深入探讨了Kinect捕捉深度图像的原理,特别是LightCoding技术,通过红外投影和接收机制生成实时3D环境再现。重点介绍了基于飞行时间(ToF)原理和结构光测量的深度感知方法,以及Kinect采用的独特LightCoding技术,包括激光散斑原理和标定方法。同时,文章解释了为何避免阳光直射和热源对Kinect的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.4 深度图像成像原理
 

Kinect有发射、捕捉、计算视觉重现的类似过程。严格说来,Kinect的“深度眼睛”是由一个红外投影机和红外摄像头组合而成的,投影和接收互为重叠,如图3-27所示。


 

可以说,Kinect的成功也在于其能廉价而有效地捕捉到深度图像。它能收集视野范围内的每一点,并形成一幅代表周围环境的景深图像。传感器以每秒30帧的速度生成景深图像流,实时3D地再现周围环境。

 
 
3.4.1 ToF光学测距与结构光测量
 

红外摄像头大体可以划分为两类(见图3-28):

 基于飞行时间(Time of Flight,ToF)原理的摄像头,它通过测量光脉冲之间的传输延迟时间来计算深度信息。例如Mesa Imaging SwissRanger 4000和PMD Technologies CamCube 2.0,它们都价格不菲。

 结构光测量,基于光编码,投射已知的红外模式到场景中,通过另外一个红外CMOS成像器所捕获到的该模式的变形,从而最终来确定深度信息的摄像头,如PrimeSensor和Microsoft Kinect。事实上,图3-28c和图3-28d使用的是同一红外摄像头。Kinect属于图3-28d所示情况。

2009年微软收购了以色列公司3DV Systems,它拥有ToF摄像头的专利。ToF是“Time of Flight”的缩写,从字面上也可大致猜出其含义:计算光线飞行的时间。首先让装置发出脉冲光,并且在发射处接收目标物的反射光,即由测量时间差算出目标物的距离。3DV的ZCam就是采用ToF技术,使用红外线以及Accelerometers加速度计感应器,感测立体空间的相对位置变化,建构灰阶距离影像的深度感应器。感光芯片需要飞秒级的快门来测量光飞行时间,据说芯片中用到砷化镓,使其时钟频率提高到上百GHz。于此同时也提高了工艺成本。


 

光学测距方法是ToF目前较为精确可行的技术,也有诸如LDM激光测距、IDM红外测距等具体产品,但都价格不菲。因此,该项技术对于Kinect这种消费电子产品来说不适用:一方面是测量环境的限制,更主要的是成本因素。这样看来,微软收购3DV Systems,只是为了动作感测的专利权、并取得领先地位。

“结构光”指一些具有特定模式的光,其模式图案可以是点、线、面等。结构光扫描法的原理是首先将结构光投射至物体表面,再使用摄像机接收该物体表面反射的结构光图案,由于接收图案必会因物体的立体型状而发生变形,故可以试图通过该图案在摄像机上的位置和形变程度来计算物体表面的空间信息。普通的结构光方法仍然是部分采用了三角测距原理的深度计算。

结构光测量技术作为一种快速、便携、高精度的三维测量技术,在汽车、航空、模具、医疗等领域均得到了广泛的应用。相位计算是基于相位测量的结构光三维测量中的关键技术之一,最终输出是三维点云,进行相关的三维建模和测量。

 
 
 
 
 
3.4.2 Light Coding技术
 

PrimeSense将其深度测量技术命名为Light Coding,顾名思义,就是用光源照明给需要测量的空间编上码,属于结构光技术的一种,只是深度计算方式不一样,微软Kinect深度图像就是采用了这种技术。

与结构光法不同的是,Light Coding的光源称为“激光散斑”,是激光照射到粗糙物体或穿透毛玻璃后随机形成的衍射斑点。这些散斑具有高度的随机性,而且会随着距离的不同而变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源标定,如图3-29所示。


 

概括一下,Light Coding与传统的ToF、结构光技术的不同之处在于:

1)和传统的ToF、结构光的光源不同,使用“Light Coding”技术的PrimeSense的PS1080系统级芯片负责对红外光源进行控制,投射出具有三维纵深的“立体编码”。这种光源称为激光散斑,是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。

2)不需要特制的感光芯片,只需要普通的CMOS感光芯片,这让方案的成本大大降低,对Kinect消费及电子产品的市场化至关重要。

3)Light Coding技术不是通过空间几何关系求解的,它的测量精度只和标定时取的参考面的密度有关,参考面越密测量越精确。传统结构光方法采用三角视差测距,基线长度(光源与镜头光心的距离)越长越好。换句话说,不用为了提高精度而将基线拉宽。这其中的奥秘就是“激光散斑原理”。

 
 
 
 
3.4.3 激光散斑原理

 

激光在散射体表面的漫反射或通过一个透明散射体(如毛玻璃)时,在散射表面或附近的光场中可以观察到一种无规分布的亮暗斑点,这种斑点称为激光散斑(Laser Speckles)。

如果散射体足够粗糙,这种分布所形成的图样是非常特殊和美丽的,如图3-30所示。


 

散斑现象普遍存在于光学成像的过程中,很早以前牛顿就此解释过恒星闪烁而行星不闪烁的现象。由于激光的高度相干性,激光散斑的现象就更加明显。最初人们主要研究如何减弱散斑的影响。在研究的过程中发现散斑携带了光束和光束所通过的物体的许多信息,于是激光散斑产生了许多的应用,例如用散斑的对比度测量反射表面的粗糙度,利用散斑的动态情况测量物体运动的速度,利用散斑进行光学信息处理,甚至利用散斑验光等。

激光散斑是由无规散射体被相干光照射产生的,因此是一种随机过程。要研究它必须使用概率统计的方法。通过统计方法的研究,可以认识到散斑的强度分布、对比度和散斑运动规律等特点。最重要的特点就是,这种散斑具有高度的随机性,而且随着距离的不同会出现不同的图案,也就是说,在同一空间中任何两个地方的散斑图案都不相同。只要在空间中打上这样的结构光然后加以记忆就让整个空间都像是被做了标记,然后把一个物体放入这个空间后只需要从物体的散斑图案变化就可以知道这个物体的具体位置。

 

 

 

3.4.4 标定原理

 

PrimeSense的专利中是这样解释“标定方法”的:每隔一段距离,取一个参考平面,把参考平面上的散斑图案记录下来。

假设Kinect规定的用户空间是距离摄像头1~4m的范围,每隔1cm取一个参考平面,那么标定下来我们就保存了300幅散斑图像。标定的间距越小,精度越高,如图3-31所示。需要进行测量的时候,拍摄一幅待测量的散斑图像,将这幅图像和我们保存下来的300幅参考图依次做互相关运算,进而得到300幅相关度图像。而空间中的物体存在的位置,会在相关图像上会显示出峰值,把这些峰值叠加在一起,再经过插值运算后就会得到整个场景的三维形状了。


 

注 “插值运算”是一种增加图像尺寸的方法。很多数码相机通过此技术实现数字变焦(DigitalZoom)。插值算法有许多种,目的都是有效地平滑扩大图像而不导致锯齿产生。

如果你有一台夜视摄像机(比如Sony HDR-CX700E,启用NIGHTSHOT模式),晚上在房间关掉灯,你可以观察到Kinect红外散斑投影在房间里,星星点点。画面因为红外拍摄的原因都显示为绿色,如图3-32所示。


 

为什么Kinect注意事项中警告:不要让阳光直射传感器,不要让传感器接近任何热源?
这个问题现在很好理解了,Kinect投射出近红外光源,通过目标物体产生的“散斑”进行“深度计算”。太阳光谱和热源会干扰Kinect投射出的近红外光源,正如微波炉对手机信号或者FM广播的干扰一样。

关于Light Coding的其他相关内容可以到Micosoft Academy或者Google Patents上查询两篇文档:

 Range mapping using speckle decorrelation(No. US7433024B2)

 DEPTH MAPPING USING PROJECTED PATTERNS(No. 0118123 A1)

 

http://book.2cto.com/201211/9227.html

 

要配置Kinect环境并与Visual Studio和OpenCV集成,需要按照以下步骤进行操作: 1. 首先,确保已安装好Kinect for Windows SDK。该SDK可从微软官方网站下载并安装。 2. 接下来,下载并安装Visual Studio。建议使用最新版本的Visual Studio,例如Visual Studio 2019。 3. 在Visual Studio中创建一个新的项目。选择适当的项目类型,例如Windows桌面应用程序。 4. 在项目中打开属性管理器。可以通过右键单击项目,然后选择“属性”来访问属性管理器。 5. 在属性管理器中,选择所有配置和所有平台。然后,打开“VC++目录”选项卡,添加包含和库目录。添加的目录应包含OpenCV库的位置。 6. 接下来,打开“链接器”选项卡,选择“输入”选项。将相关的OpenCV库添加到附加依赖项列表中。 7. 下载并安装OpenCV库。可以从OpenCV官方网站下载OpenCV库。 8. 在代码中,包含必要的OpenCV头文件。这些头文件通常是在<opencv2>目录中。 9. 在代码中,初始化Kinect连接。可以使用Kinect for Windows SDK提供的函数和类来实现。 10. 将Kinect数据与OpenCV集成。使用Kinect提供的函数和类来获取Kinect传感器的数据,并使用OpenCV函数对数据进行处理和显示。 11. 最后,在Visual Studio中构建和运行项目。如果所有步骤都按照正确的顺序完成,你应该能够成功配置Kinect环境并与Visual Studio和OpenCV集成。 希望这些步骤对你有帮助!如果需要更详细的说明,请参考相关文档和教程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值