深度相机的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究。 https://blog.csdn.net/lxy_2011/article/details/84390511?utm_source%20=%20uc_fansmsg

看起来深度相机貌似是一种完美产物。可是稍微有点哲学思维的读者都知道,世界上不存在绝对完美的物体,万物都有两面性,而这两个方面是既对立又统一的。

那么深度相机光辉的一面背后,是否也隐藏有一些不为人知的坑?

答案是肯定有,而且挺深。

下面我们来探讨一下:深度相机在应用开发上有哪些需要特别注意的坑。

《深度相机哪家强?附详细参数对比清单》里最后的参数对比清单中,我们发现在消费级深度相机产品中,结构光原理的深度相机具有绝对的数量优势,加上iPhone X的前置深度相机也采用了结构光,这无疑给移动端厂商释放了信号,预计2018年出货的带深度相机的手机也会大概率沿用结构光原理的深度相机解决方案。

因此,我们抓主要矛盾,主要探讨结构光深度相机到底埋了哪些坑。

黑色物体的影响

先给出结论:

基于红外的结构光深度相机对深色(尤其是黑色)物体的测量一般不准确,甚至测量失败(没有深度值)。

如果不关心原因,可以跳过这一节后续内容,直接进入下一节。

下面是具体解释:

我们首先从物体的颜色说起。我们看到的物体的颜色是由于物体对不同波长的光具有选择性吸收而产生的。这个原理可以通过化学实验直观的观察到:当一束白光照射某溶液时,若溶液不吸收可见光,则白光全部通过,溶液呈现无色透明;若溶液吸收了某种颜色的单色光,那它就呈现出被吸收光的互补光。而溶液颜色的深浅,取决于浅溶液中吸光物质的浓度。

那么什么是互补光呢?

可以简单理解如下:如果两种不同颜色的单色光按一定的强度比例混合可以得到白光,那么就称这两种单色光为互补色光,这种现象称为光的互补。下图右中连线的两端构成互补光。

互补光示意图

举个例子吧,更容易理解:

根据上图,我们知道黄光(波长580-610nm)的互补光是蓝光。因此,一束白光入射到某溶液,如果该溶液吸收了白光中的黄光,那么该溶液的表观颜色就是被吸收的黄光的互补光,也就是蓝色。如下图所示:


物体对光的选择性吸收决定了物体本身的颜色

因此,不难推断,如果溶液对可见光全部吸收,溶液就会呈现黑色。

而结构光一般采用的是人眼不可见的近红外光,它也是可以被物体吸收的。只不过因为其本身是不可见光,人眼无法直接观察到红外光被吸收的现象。

这里写图片描述
但是通过红外成像传感器我们很容易观察到红外光被吸收的现象。

如下图所示,被测物体表面不同颜色(现在我们知道是不同物质对不同光的吸收不同)对结构光深度相机成像的影响。从图中可以明显看出深色物体(尤其是黑色物体)对红外光的吸收能力非常强,这导致投射在黑色物体上的红外光无法返回,红外成像传感器因为无法接收到返回的红外光,因此也就无法测量物体的深度。


红外散斑图(左)及其彩色图(右)

但是,这里要补充一点,虽然黑色物体都能够吸收可见光,但并不是所有的黑色物体都能够吸收红外光(虽然接近可见光波长)。不过从概率上讲,黑色物体既然能够吸收大量的可见光,那它能够吸收红外光的概率还是很高的。

好吧,绕了这么大一圈。我们终于明白了为什么红外结构光对黑色物体的测量很多时候是无能为力的。下面给出一个实例,直观感受一下。下图右红框内黑色表示无深度值,可以看到黑色的椅子背靠和支撑腿都没有深度值。

这里写图片描述
彩色图(左)及对应深度图(右):黑色物体的影响

光滑物体表面反射的影响

老规矩,先给结论:

当物体表面超过一定的光滑程度时,深度相机测量精度会急剧下降,甚至测量失败(没有深度值)。

赶时间的可以跳过该小节后续内容,对原因感兴趣的可以继续往下看。

让我们的思绪飞回到初中物理课题上,物理老师正在讲解光线的镜面反射和漫反射原理。他在黑板上画出了如下两张图。

这里写图片描述
漫反射和镜面反射示意图

上图左是漫反射示意图,指的是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,但由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射。

自然界几乎所有的物体表面都符合漫反射条件,比如大气层、动植物、地面、墙壁、衣服等,有些物体表面粗看起来似乎很平滑,但用放大镜仔细观察,就会看到其表面其实是凹凸不平的。因此本来是平行的太阳光被这些表面反射后,弥漫且随机的地射向不同方向。

漫反射是物体可以清晰成像的基础,因此我们从不同角度看同一物体,都能看的比较清楚。因此,深度相机中的成像端能够接收到足够的光线,从而清晰的成像。

而相比之下,镜面反射发生在物体表面(接近)绝对光滑的情况下,比如水面、镜子、抛过光的金属表面等。当物体表面发生镜面反射时,只有当被测物体位于深度相机的发射端和接收端(成像端)的中垂线时,才能接收到反射光线,并且强度很集中,容易发生过度曝光;而其他情况下能够接收到的反射光线非常少,无法成像。

下面给出一个实例,直观感受一下。下图左中光滑的桌面在下图右红框中对应的深度值是无效的(右图中黑色表示没有深度值)。

这里写图片描述
彩色图(左)及对应深度图(右):光滑表面反射的影响

透明物体透射的影响

我们知道红外光是可以轻松穿透普通透明玻璃的。所以除了前面提到的反射的影响,红外光在一定条件下还可能产生透射现象,这会给红外结构光深度相机带来新的问题:我称之为深度值的歧义性。

我们想象深度相机投射出一束红外光到一块普通的玻璃上,这束红外光不会发生镜面反射,它会穿透玻璃继续前行,如果透过玻璃后能够在有效测量范围内遇到其他物体并反射回红外光,那么此时深度相机测量的深度值其实是玻璃后面物体距离相机的距离,并不是玻璃表面距离相机的距离。更悲剧的是,很多时候光线透过玻璃后是一个开阔空间,透射过玻璃的红外光线就变成了“肉包子打狗,有去无回”,因此没有对应的深度值。如下图所示。

这里写图片描述
彩色图(左)及对应深度图(右):玻璃透射的影响

视差的影响

结构光深度相机的发射端和接收端通常有一定的间距,因此在物体的边缘会存在一定的视觉盲区。这对于较远的物体边缘影响不大,但是对于近距离的物体边缘影响较大,会产生无效深度值的类似阴影的区域(如下图红框内所示)。

这里写图片描述
彩色图(左)及对应深度图(右):视差的影响

以上是几种比较常见的坑,此外还有很多小坑,比如红外光点恰好打在物体边缘造成的边缘深度不准确等。

好吧,关于深度相机的坑就说到这儿吧。

深度相机标定是指校准深度相机,以准确地获取场景中物体的距离信息。在Python中,我们可以使用OpenCV库来实现深度相机标定。 深度相机标定的过程包括收集一系列已知距离下的图像,使用这些图像计算相机的内部参数和畸变系数。下面是一个使用Python和OpenCV进行深度相机标定的大致步骤: 1. 收集标定图像:使用深度相机拍摄一组标定图像,要求图像中有已知距离的特征点。可以使用一个标定板,标定板上通常有一些等距标记,或者斑点等特征。 2. 检测角点:对于每张标定图像,使用OpenCV的cornerSubPix()函数检测标定板的角点坐标。这些角点将在后续计算中用来估算相机的内部参数和畸变系数。 3. 计算相机的内部参数和畸变系数:使用OpenCV的calibrateCamera()函数来计算相机的内部参数和畸变系数。这个函数会使用标定板的角点坐标和已知的标定板上的特征点距离,通过优化算法来估计相机的内部参数和畸变系数。 4. 验证标定结果:使用标定的相机参数和畸变系数来对其他图像进行畸变矫正和深度测量。可以通过测量标定板上特征点的距离与实际已知距离的差异来验证标定结果的准确性。 总结:深度相机标定是通过收集已知距离下的图像并计算相机内部参数和畸变系数,以准确测量场景中物体的距离。在Python中,可以使用OpenCV库提供的函数来实现深度相机的标定。以上是一个大致的标定流程,具体实现还需要根据实际情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PaQiuQiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值