1. 双目视觉测距:像人眼一样感知深度
你有没有想过,为什么我们人类能轻松判断一个物体离自己有多远?秘密就藏在我们的两只眼睛里。当我们用左眼和右眼同时看一个物体时,大脑会处理两个略有差异的图像,通过这种差异——也就是“视差”——来计算出物体的距离。双目视觉测距技术,正是模仿了人眼的这种天然能力。
简单来说,这项技术就是利用两个并排的、像我们双眼一样摆放的摄像头,同时拍摄同一场景。因为两个摄像头的位置略有不同,它们拍到的画面也会有微小的位置偏移。通过计算同一个物体在两个画面中像素位置的差异,再结合一些已知的物理参数,比如两个摄像头之间的距离(我们称之为“基线”),就能像解一道几何题一样,算出这个物体离摄像头到底有多远。
这项技术听起来很酷,那它能做什么呢?它的应用场景非常广泛。比如,在机器人导航中,机器人需要知道前方障碍物的精确距离,才能规划安全的行走路线。在自动驾驶领域,车辆需要实时感知周围车辆、行人的距离,做出刹车或转向的决策。在三维重建中,我们可以用双目相机扫描一个物体或一个房间,生成它的三维点云模型,用于虚拟现实、文物保护或者工业检测。甚至,我们日常玩的体感游戏、手机上的人脸识别解锁,背后都可能用到双目视觉的原理。
所以,无论你是机器人爱好者、自动驾驶的开发者,还是对三维视觉感兴趣的学生,理解双目视觉测距都是一项非常实用且基础的核心技能。接下来,我们就从最根本的原理开始,一步步拆解这个“用两只眼睛看世界”的技术。
2. 从几何模型到视差计算:测距的核心公式推导
要理解双目测距,我们得先建立一个清晰的几何模型。想象一下,你面前放着一个苹果,你的左眼和右眼就是两个相机镜头。我们把这两个镜头的光心位置分别记为 O_L 和 O_R,它们之间的距离就是基线长度 b。苹果这个点,我们叫它 P,它在空间中的坐标是 (X, Y, Z),其中 Z 就是我们最想求的深度——苹果离我们有多远。
现在,这个苹果会在左相机和右相机的成像平面上留下投影,分别是点 P_L 和 P_R。这两个投影点在各自图像平面上的水平位置(物理距离)是不同的。这个水平位置的差值 (X_L - X_R),就是最关键的视差。
根据相似三角形的原理,我们可以构建一个关系式。大三角形 P O_L O_R 和小三角形 P P_L P_R 是相似的。这个相似关系直接引出了深度 Z 与视差、焦距 f、基线 b 之间的关系。经过一系列的推导(这里我们略去复杂的中间代数步骤),最终可以得到那个灵魂公式:
Z = (f * b) / d
这个公式简洁而强大。其中:
Z:目标点的深度(距离)。f:相机的焦距(物理长度)。b:两个相机光心之间的距离,即基线长度。d:视差,即同一个点在左右两个图像中水平像素坐标的差值(u_L - u_R)。
公式的直观理解:你可以把它想象成一个杠杆。基线 b 和焦距 f 是固定的“力臂”,它们共同作用。当物体离我们很近时(Z 小),它在左右眼中的位置差异很大(d 大),就像你用手指在眼前交替闭眼看,手指跳动很明显。当物体很远时(Z 大),这种跳动就微乎其微了(d 很小)。公式 Z = (f*b)/d 完美地量化了这种关系:视差 d 越大,分母越大,深度 Z 就越小,表示物体越近。
在实际的像素坐标系中,我们通常使用以像素为单位的焦距 f_x(f_x = f / dx,dx 是每个像素的物理尺寸),以及像素单位的视差 d_pixel。所以公式更常写为:
Z = (f_x * b) / d_pixel
得到了深度 Z,我们还可以反推物体在空间中的 X 和 Y 坐标。结合相机的小孔成像模型,有:
X = (b * (u - u_0)) / d_pixel
Y = (b * (v - v_0)) / d_pixel
这里 (u, v) 是点在一张图像(比如左图)中的像素坐标,(u_0, v_0) 是图像的主点坐标(通常接近图像中心)。这样,空间中的一个三维点 (X, Y, Z) 就被完整地重建出来了。
看到这里,你可能觉得万事俱备,只差写代码了。但别急,这里有一个巨大的前提:我们假设两个相机是完美的,它们的成像平面完全平行,并且处于理想的“共面行对准”状态。然而,现实中的相机镜头存在畸变,两个相机在安装时也几乎不可能做到绝对平行。直接使用未处理的图像计算视差,结果会惨不忍睹。这就引出了下一个至关重要的步骤——


419

被折叠的 条评论
为什么被折叠?



