50、立体视觉技术全解析:从视差优化到三维点匹配

立体视觉技术全解析:从视差优化到三维点匹配

在计算机视觉和机器人领域,立体视觉技术是获取场景深度信息和三维结构的重要手段。本文将深入探讨立体视觉中的多个关键技术,包括视差峰值细化、图像清理与重建、三维纹理映射显示、立体图像显示方法、图像校正、平面拟合以及三维点匹配等内容。

1. 视差峰值细化

在立体匹配中,每个像素的视差是一个整数值 (d \in [d_{min}, d_{max}]),在这个值处可以找到最优的相似度。为了更精确地估计峰值位置,我们可以使用视差峰值细化技术。具体步骤如下:
- 抛物线拟合 :将抛物线 (y = A(x - x_0)^2 + B(x - x_0) + C) 拟合到最优视差及其相邻的视差值上。由于最优 ZNCC 相似度是一个最大值,所以抛物线是倒置的,即 (A < 0)。
- 计算插值最大值 :当抛物线的导数等于零时,可得到插值最大值,从而估计出拟合抛物线峰值的水平位置。
- 拒绝宽峰 :对于尖锐的峰值,系数 (A) 会较大,我们可以使用一个简单的阈值来拒绝宽峰。

在 MATLAB 中,可以使用 'interp' 选项来启用视差峰值细化:

[di,sim,peak] = istereo(L, R, [40 90], 3, 'interp');
idisp(di)

得到的视差图像比之前的图像更加平滑。额外的可选输出参数 peak 是一个结构体,包含每个像素的抛物线系数 (A) 和 (B)。

2. 图像清理与重建

立体匹配的结果通常存在一些缺陷,为了得到可靠的深度信息,我们需要对视差图像进行清理和重建。具体步骤如下:
- 创建状态矩阵 :创建一个与视差矩阵 d 大小相同的状态矩阵 status ,并初始化为零。

status = zeros(size(d));
  • 标记无效或不可靠元素 :根据特定的失败条件,将状态矩阵中的元素设置为非零值。
[U,V] = imeshgrid(L);
status(isnan(d)) = 4;
status(U<=90) = 1;
status(sim<0.8) = 2;
status(peak.A>=-0.1) = 3;
  • 显示状态矩阵 :使用 idisp 函数显示状态矩阵,并设置颜色映射。
idisp(status)
colormap( colorname({'lightgreen', 'cyan', 'blue', 'orange', 'red'}) )

颜色映射的含义如下:
| 颜色 | 含义 |
| ---- | ---- |
| 浅绿色 | 良好的立体匹配 |
| 青色 | 视差搜索范围超出右图像的左边缘 |
| 蓝色 | 峰值相似度太小 |
| 橙色 | 峰值太宽 |
| 红色 | 搜索模板超出图像边缘 |

  • 使不可靠的视差值无效 :将不可靠的视差值设置为 NaN
di(status>0) = NaN;
  • 显示标记后的视差图像 :使用 ipixswitch 函数显示标记后的视差图像,不可靠像素标记为红色。
ipixswitch(isnan(di), 'red', di/90);
  • 三维重建 :将像素视差值转换为世界坐标(米),这一过程称为三维重建。对于平行轴立体相机,深度与视差成反比。
[U,V] = imeshgrid(L);
u0 = size(L,2)/2; v0 = size(L,1)/2;
b = 0.160;
X = b*(U-u0) ./ di; Y = b*(V-v0) ./ di; Z = 3740 * b ./ di;
surf(Z)
shading interp; view(-150, 75)
set(gca,'ZDir', 'reverse'); set(gca,'XDir', 'reverse')
colormap(flipud(hot))
3. 三维纹理映射显示

为了使三维表面表示看起来不那么粗糙,我们可以使用三维纹理映射显示技术。具体步骤如下:
- 创建中值滤波图像 :对插值后的视差图像进行中值滤波,以填补一些小孔洞。

dimf = irank(di, 41, ones(9,9));
  • 插入中值滤波值 :只在存在 NaN 的地方插入中值滤波值。
di = ipixswitch(isnan(di), dimf, di);
  • 再次进行重建 :根据更新后的视差图像计算三维坐标。
X = b*(U-u0) ./ di;  Y = b*(V-v0) ./ di; Z = 3740 * b ./ di;
  • 纹理映射 :将左图像覆盖在三维表面上,使用 surface 函数进行纹理映射。
Lcolor = iread('rocks2-l.png');
surface(X, Y, Z, Lcolor, 'FaceColor', 'texturemap', ...
   'EdgeColor', 'none', 'CDataMapping', 'direct')
xyzlabel
set(gca,'ZDir', 'reverse'); set(gca,'XDir', 'reverse')
view(-160, 75)
4. 立体图像显示方法

人类对深度的立体感知是因为每只眼睛从不同的视角观察场景。为了实现立体图像的显示,有多种方法可供选择。

4.1 立体图像的历史与现代技术

自 19 世纪摄影术发明以来,人们就对 3D 照片和电影着迷。早期的立体图像需要使用双目观察设备或通过斜视和交叉眼睛来观看,而现代则有 LCD 快门眼镜或偏振眼镜等更方便的方法。

4.2 立体图像显示方法
  • 立体图 :传统的立体图需要使用双目观察设备,或者通过斜视和交叉眼睛来观看。
  • LCD 快门眼镜和偏振眼镜 :这些现代方法允许全彩色立体电影观看。
  • 立体图像 :一种古老但廉价的方法是通过立体图像,将左右图像以不同颜色叠加。通常左图像用红色,右图像用青色(蓝绿色),但也有其他颜色组合。

在 MATLAB 中,可以使用 anaglyph 函数将岩石堆立体对显示为立体图像:

anaglyph(L, R, 'rc')
5. 图像校正

立体相机的光学轴和传感器芯片的轴需要精确对齐,但机械对齐的精度有限,镜头畸变也会引入误差。因此,通常需要对一个或两个图像进行变形,以校正这些误差,这一过程称为图像校正。具体步骤如下:
- 找到特征点 :使用 isurf 函数找到左右图像的 SURF 特征点。

sL = isurf(L);
sR = isurf(R);
  • 确定候选匹配 :使用 match 方法确定候选匹配点。
m = sL.match(sR);
  • 确定极线关系 :使用 ransac 方法确定极线关系,得到基本矩阵 F
F = m.ransac(@fmatrix,1e-4, 'verbose');
  • 图像校正 :使用 irectify 函数对左右图像进行校正,得到校正后的图像 Lr Rr
[Lr,Rr] = irectify(F, m, L, R);
  • 显示校正后的图像 :使用 stdisp 函数显示校正后的图像。
stdisp(Lr, Rr)

校正后的图像可以用于密集立体匹配:

d = istereo(Lr, Rr, [5 120], 4);
6. 平面拟合

立体视觉会得到一组三维世界点 (P_i),称为点云。一个常见的问题是将一个平面拟合到这样一组点上。一种简单有效的方法是将一个椭球拟合到数据上,椭球在垂直于平面的方向上有一个非常小的半径,即它是一个椭圆板。具体步骤如下:
- 计算惯性矩阵 :计算点云的惯性矩阵 (J)。

T = transl(1,2,3) * rpy2tr(0.3, 0.4, 0.5);
P = mkgrid(10, 1, T);
P = P + 0.02*randn(size(P));
x0 = mean(P');
P = bsxfun(@minus, P, x0');
J = 0;
for x = P,  J = J + x*x';  end
  • 计算特征值和特征向量 :计算惯性矩阵的特征值和特征向量,最小特征值对应的特征向量就是平面的法线方向。
[x,lambda] = eig(J);
diag(lambda)'
n = x(:,1)'
  • 计算平面方程 :平面方程为 (n \cdot (x - x_0) = 0),其中 (n) 是法线,(x_0) 是质心。

由于异常数据点会显著影响估计结果,我们可以使用加权的方法或 RANSAC 算法来解决这个问题。

7. 三维点匹配

考虑一个物体的模型由一组二维或三维点表示,现在观察到该物体在世界中的一组点,任务是通过匹配这两组点来确定相对姿态 (\xi),将模型点转换为观察到的数据点。具体步骤如下:
- 创建模型和数据点 :创建一个包含 100 个随机点的模型,以及一个经过旋转和平移的数据点集。

M = rand(3,100) - 0.5;
T_unknown = transl(1, 2, 3) * rpy2tr(0.2, 0.3, 0.4);
D = homtrans(T_unknown, M);
  • 使用迭代最近点(ICP)算法 :对于每个数据点 (D_i),假设对应的模型点 (M_j) 是最近的点,即最小化 (|D_i - M_j|)。通过迭代的方式,不断更新相对姿态,直到收敛。

在 MATLAB 中,可以使用 icp 函数实现 ICP 算法:

[T,d] = icp(M, D, 'plot');

综上所述,立体视觉技术在计算机视觉和机器人领域具有重要的应用价值。通过视差峰值细化、图像清理与重建、三维纹理映射显示、立体图像显示方法、图像校正、平面拟合以及三维点匹配等技术,可以得到准确的深度信息和三维结构,为机器人的路径规划和障碍物避障等任务提供支持。

立体视觉技术全解析:从视差优化到三维点匹配(下半部分)

8. 技术对比与总结

为了更清晰地了解上述立体视觉各关键技术的特点和应用场景,我们将它们进行对比总结,如下表所示:
| 技术名称 | 主要作用 | 应用场景 | 关键步骤 | 优点 | 缺点 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 视差峰值细化 | 更精确地估计视差峰值位置 | 提高立体匹配精度 | 抛物线拟合、计算插值最大值、拒绝宽峰 | 提高视差估计精度,使视差图像更平滑 | 计算量相对较大 |
| 图像清理与重建 | 去除不可靠视差信息,将像素视差转换为世界坐标 | 为机器人提供可靠深度信息 | 创建状态矩阵、标记无效元素、使不可靠值无效、三维重建 | 能有效去除噪声和不可靠信息,得到三维结构 | 处理过程较复杂 |
| 三维纹理映射显示 | 使三维表面表示更平滑 | 人类直观观察三维场景 | 创建中值滤波图像、插入滤波值、再次重建、纹理映射 | 增强三维场景的可视化效果 | 可能会引入一定的模糊 |
| 立体图像显示方法 | 实现立体图像显示 | 立体视觉展示 | 选择合适的显示方式(如立体图像) | 多种显示方式可选,成本低 | 部分方式(如立体图像)颜色信息有损失 |
| 图像校正 | 校正立体相机图像的对齐误差 | 提高立体匹配的准确性 | 找到特征点、确定候选匹配、确定极线关系、图像校正 | 使对应点具有相同垂直坐标,便于后续匹配 | 可能会产生未定义像素 |
| 平面拟合 | 将平面拟合到三维点云上 | 分析场景的平面结构 | 计算惯性矩阵、特征值和特征向量、计算平面方程 | 简单有效,可估计平面法线 | 受异常点影响较大 |
| 三维点匹配 | 确定两组三维点的相对姿态 | 物体定位和识别 | 创建模型和数据点、使用 ICP 算法 | 可处理复杂的点云匹配问题 | 收敛速度可能较慢 |

9. 立体视觉技术流程图

下面是一个 mermaid 格式的流程图,展示了立体视觉技术从图像输入到最终三维点匹配的整体流程:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([输入左右图像]):::startend --> B(视差峰值细化):::process
    B --> C(图像清理与重建):::process
    C --> D(三维纹理映射显示):::process
    C --> E(立体图像显示方法):::process
    C --> F(图像校正):::process
    F --> G(平面拟合):::process
    F --> H(三维点匹配):::process
    D --> I(可视化结果):::process
    E --> I
    G --> I
    H --> I
    I --> J([输出三维场景信息]):::startend
10. 实际应用案例分析

以机器人导航为例,立体视觉技术在其中发挥着至关重要的作用。在一个室内环境中,机器人需要通过立体相机获取周围环境的深度信息,以实现路径规划和障碍物避障。

  • 视差峰值细化 :通过对立体匹配得到的视差图进行峰值细化,提高了深度信息的精度。例如,在识别靠近墙壁的物体时,更精确的视差估计可以避免机器人误判距离,从而更安全地绕过障碍物。
  • 图像清理与重建 :清理不可靠的视差信息后,机器人可以准确地知道哪些区域是障碍物,哪些区域是可通行的。三维重建将像素视差转换为世界坐标,为机器人的路径规划提供了准确的三维环境模型。
  • 图像校正 :校正后的图像使得立体匹配更加准确,减少了因相机对齐误差和镜头畸变带来的影响。这有助于机器人更清晰地识别物体的边界和位置,提高导航的准确性。
  • 平面拟合 :在室内环境中,地面和墙壁通常是平面结构。通过平面拟合技术,机器人可以快速识别出这些平面,从而更好地规划行走路径,例如沿着墙壁行走或在平坦的地面上移动。
  • 三维点匹配 :当机器人需要识别特定的物体时,三维点匹配技术可以将物体的模型与实际观察到的点云进行匹配,确定物体的位置和姿态。这对于机器人执行抓取、搬运等任务非常重要。
11. 未来发展趋势

随着计算机硬件性能的不断提升和算法的不断优化,立体视觉技术在未来将有更广阔的发展前景。
- 更高的精度和速度 :未来的视差估计和三维重建算法将更加精确和高效,能够在更短的时间内处理大量的图像数据,满足实时性要求较高的应用场景,如自动驾驶汽车的环境感知。
- 多传感器融合 :立体视觉技术将与其他传感器(如激光雷达、毫米波雷达等)进行更深度的融合,充分发挥各传感器的优势,提高环境感知的准确性和可靠性。
- 深度学习的应用 :深度学习在图像识别和处理领域已经取得了显著的成果。未来,深度学习算法将被更多地应用于立体视觉中,如通过深度神经网络自动学习视差估计和三维重建的模型,提高算法的泛化能力和适应性。
- 更广泛的应用领域 :除了机器人和自动驾驶领域,立体视觉技术还将在虚拟现实、增强现实、医疗成像等领域得到更广泛的应用,为这些领域带来更真实、更准确的三维视觉体验。

12. 总结与展望

立体视觉技术作为计算机视觉和机器人领域的核心技术之一,通过视差峰值细化、图像清理与重建、三维纹理映射显示、立体图像显示方法、图像校正、平面拟合以及三维点匹配等一系列关键技术,为我们提供了获取场景深度信息和三维结构的有效手段。

在实际应用中,这些技术相互配合,能够为机器人的导航、物体识别等任务提供有力支持,同时也为人类带来了更加直观的三维视觉体验。未来,随着技术的不断发展和创新,立体视觉技术将在更多领域发挥重要作用,推动相关行业的快速发展。我们期待着立体视觉技术在未来能够取得更大的突破,为我们的生活和工作带来更多的便利和惊喜。

希望本文能够帮助读者深入了解立体视觉技术的原理和应用,为相关领域的研究和实践提供有益的参考。如果你对立体视觉技术有任何疑问或想法,欢迎在评论区留言交流。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值