前置事项: 特征点耗时,丢弃有用信息,特征缺失(长直走廊)失效
对此,有直接法。
该项目用的是fr1_desk数据集,RGBD的,下载后的全称是rgbd_dataset_freiburg1_desk.tgz
。TUM官网数据集下载.
下载后,将rgb,depth
文件夹和rgb.txt,depth.txt,groudtruth.txt
拷贝到ch8的data/下(覆盖),然后执行脚本
python associate.py rgb.txt depth.txt > associate.txt
直接法前身:光流。上图中 I I I 表示灰度, t t t 表示时间
在该假设下,某像素运动到t时刻时灰度不变,则:
I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) ⇓ 泰勒展开,保留一阶 I ( x + d x , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t ⇓ 由于灰度不变 ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 ⇓ 两边除以 d t ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t I(x+dx, y+dy, t+dt) = I(x, y,t) \\\;\\\Downarrow 泰勒展开,保留一阶\\\;\\ I(x+dx, y+dy, t+dt) \approx I(x,y,t)+\frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt \\\;\\\Downarrow 由于灰度不变\\\;\\ \frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt=0 \\\;\\\Downarrow 两边除以dt\\\;\\ \frac{\partial I}{\partial x} \frac{dx}{dt} + \frac{\partial I}{\partial y}\frac{dy}{dt} = - \frac{\partial I}{\partial t} I(x+dx,y+dy,t+dt)=I(x,y,t)⇓泰勒展开,保留一阶I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂Idx+∂y∂Idy+∂t∂Idt⇓由于灰度不变∂x∂Idx+∂y∂Idy+∂t∂Idt=0⇓两边除以dt∂x∂Idtdx+∂y∂Idtdy=−∂t∂I
为了简化,做一些记法:
求解如下矩阵:
[ I x I y ] [ u v ] = − I t \begin{bmatrix} I_x&I_y \end{bmatrix}\begin{bmatrix} u\\v \end{bmatrix} = -I_t [IxIy][uv]=−It
在LK光流中,为了求解u,v,需要引入更多约束,假设一个窗口内的像素具有相同运动,即多个点的 u , v u,v u,v 相同,则对于一个 w ⋅ w w\cdot w w⋅w的窗口,有 w 2 w^2 w2个 { I x , I y , I t } \{I_x,I_y,I_t\} {Ix,Iy,It}点对,则$有 w 2 w^2 w2 个方程可以用来求解 u , v u,v u,v。超定方程,求最小二乘解,即可得到 u , v u,v u,v。
得到了 u , v u,v u,v即图像运动速度后,当给定 t t t 时,就可以计算(估计)某块像素在若干个图像中出现的位置。
在SLAM中,LK光流常常被用来跟踪角点的运动。
cv::calcOpticalFlowPyrLK( last_color, color, prev_keypoints, next_keypoints, status, error );
OpenCV 库中的一个函数,用于计算光流(optical flow)。
函数的参数解释如下:
该函数使用 Lucas-Kanade (LK) 方法计算光流。在给定上一帧的关键点位置和当前帧的图像,函数尝试在当前帧中估计新的关键点位置。函数返回每个关键点的跟踪状态和估计误差。如果跟踪成功,则 next_keypoints 中包含新的关键点位置;否则,这些位置是未定义的。
总的来说效果如下,抽取两张:
\;\;\;\;\;\;\;\;\;\;
\qquad\qquad\qquad\qquad\quad t0时刻提取的关键点 \qquad\qquad\qquad\qquad\quad\qquad\qquad\qquad\qquad t0+t时刻提取的关键点
和光流有一定相似性,是基于优化的方法。
仍然基于灰度不变假设: 假设一个空间点在各个视角下,成像的灰度是不变的。
有一个初始位姿(必定不够好),和上一讲一样,但此时最小化的不是重投影误差,而是光度误差 (Photometric Error),也就是P的两个像的亮度误差:
e = I 1 ( p 1 ) − I 2 ( p 2 ) e = I_1(p_1)-I_2(p_2) e=I1(p1)−I2(p2)
其余的推导,李群李代数泰勒展开等同优化最小化重投影误差求解相机位姿那一节,最终仍使用G2O求解。
上述只分析了单个像素的差异,周围可能有很多像素和它的亮度差不多,所以我们有时候又使用小的图像块(patch),并且使用更复杂的度量方式,比如归一化相关性。(NCC)
缺点:
4. 非凸性----完全依靠梯度搜索;
5. 单个像素没有区分度;
6. 灰度不变性假设一般不成立:相机曝光等。