多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

视觉SLAM第8讲|视觉里程计(下):光流法与直接法深度解析

视觉SLAM第8讲|视觉里程计(下):光流法与直接法深度解析 视觉SLAM第8讲视觉里程计(下)光流法与直接法深度解析上一讲我们聊透了特征点法视觉里程计——先提特征、再做匹配、最后解位姿走的是“以点带面”的经典路线。但这条路线有个天生的短板一旦遇到弱纹理场景比如白墙、天空、光滑工业表面特征点提不出来整个系统直接停摆。这一讲我们就来聊另一条完全不同的技术路线不提取特征、不计算描述子直接靠像素灰度的变化算相机运动——也就是光流法与直接法。一、2D光流像素的运动轨迹先从更基础的2D光流说起。光流要回答的问题很简单相邻两帧图像里同一个像素点到底往哪个方向移动了多少1.1 核心假设灰度不变性光流的整个理论都建立在一个非常朴素的假设上同一个空间点在很短的时间间隔内成像的灰度值保持不变。写成公式就是I(x,y,t)I(xdx, ydy, tdt) I(x,y,t) I(xdx,\ ydy,\ tdt)I(x,y,t)I(xdx,ydy,tdt)通俗解释就好比你盯着一个黑点看下一个瞬间它还是黑的不会突然变成白的。这个假设在帧率足够高、光照没突变的情况下基本成立。把右边做一阶泰勒展开整理之后就能得到经典的光流约束方程IxuIyvIt0 I_x u I_y v I_t 0Ix​uIy​vIt​0其中IxI_xIx​、IyI_yIy​是图像在x、y方向的灰度梯度ItI_tIt​是时间维度的灰度变化uuu、vvv就是像素在x、y方向的运动速度。1.2 一个方程解不开两个未知数LK光流来帮忙问题来了一个方程两个未知数u和v没法解啊经典的解决方案就是Lucas-KanadeLK稀疏光流它假设一个小窗口内的所有像素都做相同的运动。这样一个窗口里有几十个像素就有几十个方程解两个未知数就绰绰有余了。通俗解释单个点信息不够就拉上邻居凑数。假定一个小窗口里大家都往同一个方向跑凑够方程就能解出运动速度。图1LK光流法示意图1.3 金字塔光流解决大位移问题LK光流有个硬伤只能处理很小的运动。如果两帧之间像素位移太大直接跑出了小窗口假设就不成立了。工程上的标准解法是图像金字塔光流先把图像一层层下采样做成金字塔结构从最顶层的低分辨率图开始计算光流把上层算出来的运动作为初始值放到下一层高分辨率图里修正逐层到底得到最终的光流结果。通俗解释先在小地图上找大概方向再放大地图精调位置。从粗到细一步步逼近大位移也能稳稳跟住。图2图像金字塔和光流由粗至精的过程1.4 实践环节本讲的代码实践分为两部分调用OpenCV内置的calcOpticalFlowPyrLK快速实现金字塔LK光流手写高斯牛顿法实现LK光流从底层理解光流的求解过程从结果图上看多层光流与OpenCV的效果相当单层光流要明显弱于多层光流。图3各种光流的结果对比二、直接法VO从像素灰度直接解位姿2D光流只能算出像素在图像上的2D运动而直接法要更进一步直接优化相机的6自由度位姿让3D点投影后的灰度和真实图像灰度的误差最小。2.1 核心光度误差直接法的目标函数叫做光度误差Photometric Error。逻辑是这样的我们有上一帧的3D点和对应的灰度猜一个当前相机的位姿把3D点投影到当前帧上拿投影位置的灰度和当前帧真实的灰度做差不断调整相机位姿让这个灰度差的总和最小。通俗解释特征点法是“比位置”看两个特征点对不对得上直接法是“比灰度”看投影过去的像素灰度和原图像不像。本质都是最小化误差只是误差的衡量标准不一样。图4直接法示意图### 2.2 直接法的三类分支 按照用到的像素数量直接法可以分成三类类型使用像素范围核心特点经典代表稀疏直接法少量关键点速度最快和特征点法接近省去描述子计算SVO半稠密直接法所有有明显梯度的像素平衡速度与精度工程落地最常用LSD-SLAM稠密直接法全图所有像素信息最完整可直接出稠密地图计算量大需GPUDTAM2.3 直接法的优缺点盘点✅优势不需要提取特征和描述子弱纹理场景也能正常工作直接利用像素灰度信息天然适合做稠密重建省去了特征匹配的步骤在特征丰富场景也有自己的优势❌短板严重依赖灰度不变假设光照变化、自动曝光调整很容易让算法失效目标函数是非凸的对初始位姿要求高容易陷入局部极小值稠密直接法计算量很大通常需要GPU加速才能实时运行三、特征点法 vs 直接法怎么选一张表搞懂两大路线的适用场景对比维度特征点法直接法核心误差重投影误差几何位置光度误差灰度差异纹理要求高需要足够特征点低弱纹理也能工作光照鲁棒性较好描述子对光照不敏感差灰度一变就容易崩计算量较小稀疏点运算较大稠密版本尤甚建图能力稀疏点云半稠密/稠密重建初始位姿要求较低较高容易局部最优工程经验没有绝对的谁优谁劣。纹理丰富、光照多变的室外场景特征点法更稳室内弱纹理、光照稳定的场景直接法更有优势。实际系统里也经常是两者融合的方案。3.1 实践环节本讲的代码实现了单层和多层直接法单层直接法在单层图像上优化光度误差求解相机位姿多层直接法利用图像金字塔从粗到精逐层优化提升收敛性和精度。四、知识体系全景视觉里程计 直接法2D光流灰度不变假设光流约束方程Lucas-Kanade光流小窗口运动一致假设求解像素运动速度金字塔光流从粗到精分层求解解决大位移问题实践OpenCV LK光流调用手写高斯牛顿实现直接法VO核心 光度误差优化目标 最小化灰度差分类稀疏直接法 SVO半稠密直接法 LSD-SLAM稠密直接法 DTAM优缺点弱纹理可用灰度假设敏感适合稠密建图实践单层直接法多层金字塔直接法对比总结特征点法 vs 直接法适用场景选择小结第7讲和第8讲合起来就讲完了视觉里程计的两大主流路线特征点法和直接法。特征点法稳定、对光照不敏感是工程落地的首选直接法在弱纹理场景下不可替代也是稠密重建的基础。学到这里你就已经掌握了视觉SLAM前端的核心技术路线。下一讲我们就进入后端优化部分看看怎么把前端算出来的位姿整合成全局一致的轨迹和地图。
返回列表