光流法的三维运动表示

  • 1. 简介
    • Lucas-Kanade 光流
      • 单像素算法
      • 最小二乘获得运动轨迹
  • 2. 三维运动表示

Reference:

  1. 高翔,张涛 《视觉SLAM十四讲》
  2. GILAD ADIV Determining Three-Dimensional Motion and Structurefrom Optical Flow Generated by Several Moving Objects

1. 简介

光流是一种描述像素随时间在图像之间运动的方法。计算部分像素运动的方法称为稀疏光流;计算所有像素的称为稠密光流。稀疏光流以 Lucas-Kanade 光流为代表,稠密光流以 Horn-Schunck 光流为代表。本文中主要使用到了 LK 光流。

Lucas-Kanade 光流

单像素算法

在 LK 光流中,我们认为来自相机的图像是随时间变化的。图像可以看作时间的函数:I(t)I(t)I(t)。那么,一个在 ttt 时刻,位于 (x,y)(x,y)(x,y) 处的像素,它的灰度可以写成:
I(x,y,t)I(x,y,t)I(x,y,t)

光流法的基本假设:
灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。
对于 ttt 时刻位于 (x,y)(x,y)(x,y) 处的像素,我们设 t+dtt + dtt+dt 时刻,它运动到 (x+dx,y+dy)(x + dx, y + dy)(x+dx,y+dy) 处。由于灰度不变,有:
I(x+dx,y+dy,t+dt)=I(x,y,t)\boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t)=\boldsymbol{I}(x, y, t)I(x+dx,y+dy,t+dt)=I(x,y,t)
对左边进行泰勒展开,保留一阶项,得:
I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂I∂xdx+∂I∂ydy+∂I∂tdt\boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t) \approx \boldsymbol{I}(x, y, t)+\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} tI(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂I​dx+∂y∂I​dy+∂t∂I​dt

因为假设了灰度不变,于是下一个时刻的灰度等于之前的灰度,从而:
∂I∂xdx+∂I∂ydy+∂I∂tdt=0\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t = 0∂x∂I​dx+∂y∂I​dy+∂t∂I​dt=0

两边除以 dtdtdt,得:
∂I∂xdx+∂I∂ydy=−∂I∂tdt\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y= -\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t∂x∂I​dx+∂y∂I​dy=−∂t∂I​dt

其中 dx/dtdx/dtdx/dt 为像素在 xxx 轴上运动速度,而 dy/dtdy/dtdy/dt 为 yyy 轴速度,把它们记为 uuu,vvv。同
时 ∂I/∂x\partial I/\partial x∂I/∂x 为图像在该点处 xxx 方向的梯度,另一项则是在 yyy 方向的梯度,记为 Ix,IyI_x, I_yIx​,Iy​。把图像灰度对时间的变化量记为 ItI_tIt​,写成矩阵形式,有:
[IxIy][uv]=−It\left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{t}[Ix​​Iy​​][uv​]=−It​

最小二乘获得运动轨迹

我们想计算的是像素的运动 u; v,但是该式是带有两个变量的一次方程,仅凭它无法
计算出 u,vu,vu,v。因此,必须引入额外的约束来计算 u,vu, vu,v。在 LK 光流中,我们假设某一个窗口内的像素具有相同的运动(注意是窗口,并不是整张图)。

考虑一个大小为 w×ww × ww×w 大小的窗口,它含有 w2w^2w2 数量的像素。由于该窗口内像素具有
同样的运动,因此我们共有 w2w^2w2 个方程:
[IxIy]k[uv]=−Itk,k=1,…,w2\left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]_{k}\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{t k}, \quad k=1, \ldots, w^{2}[Ix​​Iy​​]k​[uv​]=−Itk​,k=1,…,w2

记:
A=[[Ix,Iy]1⋮[Ix,Iy]k],b=[It1⋮Itk]\boldsymbol{A}=\left[\begin{array}{c} {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{1}} \\ \vdots \\ {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{k}} \end{array}\right], \boldsymbol{b}=\left[\begin{array}{c} \boldsymbol{I}_{t 1} \\ \vdots \\ \boldsymbol{I}_{t k} \end{array}\right]A=⎣⎢⎡​[Ix​,Iy​]1​⋮[Ix​,Iy​]k​​⎦⎥⎤​,b=⎣⎢⎡​It1​⋮Itk​​⎦⎥⎤​
于是整个方程为:
A[uv]=−b\boldsymbol{A}\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{b}A[uv​]=−b

这是一个关于 u; v 的超定线性方程,传统解法是求最小二乘解。最小二乘在很多时候
都用到过:
[uv]∗=−(ATA)−1ATb\left[\begin{array}{l} u \\ v \end{array}\right]^{*}=-\left(\boldsymbol{A}^{T} \boldsymbol{A}\right)^{-1} \boldsymbol{A}^{T} \boldsymbol{b}[uv​]∗=−(ATA)−1ATb

2. 三维运动表示

假设图像特征点 ppp 的路标为 P(X,Y,Z)P(X,Y,Z)P(X,Y,Z),它的图像点坐标是 (x,y)(x,y)(x,y),它的光流向量是 (u,v)(u,v)(u,v)。相机有一个三维的移动,它的光心为 OOO,它的坐标轴为 Xc,Yc,ZcX_c,Y_c,Z_cXc​,Yc​,Zc​,它的图像平面为 xc,ycx_c,y_cxc​,yc​。路标 PPP 位于图像平面的前面,它相对于相机的移动可以被分解成旋转移动 ω⃗=(A,B,C)T\vec{\omega}=(A, B, C)^{\mathrm{T}}ω=(A,B,C)T 和位移移动 T⃗=(U,V,W)T\vec{T}=(U, V, W)^{\mathrm{T}}T=(U,V,W)T。

令 P′P'P′ 为在时间 t′t't′ 上所对应的坐标系,对应关系可得:
(X′Y′Z′)=R(XYZ)+T\left(\begin{array}{l} X^{\prime} \\ Y^{\prime} \\ Z^{\prime} \end{array}\right)=R\left(\begin{array}{l} X \\ Y \\ Z \end{array}\right)+T⎝⎛​X′Y′Z′​⎠⎞​=R⎝⎛​XYZ​⎠⎞​+T
此时的旋转矩阵可以被估计,假设旋转参数的值较小,
R=(1−CBC1−A−BA1)R=\left(\begin{array}{ccc} 1 & -C & B \\ C & 1 & -A \\ -B & A & 1 \end{array}\right)R=⎝⎛​1C−B​−C1A​B−A1​⎠⎞​

综合上式,可得 X′X'X′, Y′Y'Y′, 和 Z′Z'Z′(注意,此时的图像已经矫正过了)
x′=X′Z′=x−Cy+B+U/Z−Bx+Ay+1+W/Zx^{\prime}=\frac{X^{\prime}}{Z^{\prime}}=\frac{x-C y+B+U / Z}{-B x+A y+1+W / Z}x′=Z′X′​=−Bx+Ay+1+W/Zx−Cy+B+U/Z​

y′=Y′Z′=Cx+y−A+V/Z−Bx+Ay+1+W/Zy^{\prime}=\frac{Y^{\prime}}{Z^{\prime}}=\frac{C x+y-A+V / Z}{-B x+A y+1+W/ Z}y′=Z′Y′​=−Bx+Ay+1+W/ZCx+y−A+V/Z​

已知位移向量 (u=x′−x,v=y′−y)(u=x'-x,v=y'-y)(u=x′−x,v=y′−y),因此通过上面两式可以得到:
u=−Axy+B(1+x2)−Cy+(U−Wx)/Z1+Ay−Bx+W/Zu=\frac{-A x y+B\left(1+x^{2}\right)-C y+\left(U-W x\right) / Z}{1+A y-B x+W / Z}u=1+Ay−Bx+W/Z−Axy+B(1+x2)−Cy+(U−Wx)/Z​

v=−A(1+y2)+Bxy+Cx+(V−Wy)/Z1+Ay−Bx+W/Zv=\frac{-A\left(1+y^{2}\right)+B x y+C x+\left(V-Wy\right) / Z}{1+A y-B x+W/ Z}v=1+Ay−Bx+W/Z−A(1+y2)+Bxy+Cx+(V−Wy)/Z​

如果 ∣W/Z∣<<1|W/Z|<<1∣W/Z∣<<1 且相机的视场不是很大,且旋转参数小,我们可以将分母近似为1。

因此图像三维运动的参考光流向量可以表示为:
{u=X˙Z−XZ˙Z2=(UZ+B−Cy)−x(WZ+Ay−Bx)v=Y˙Z−YZ˙Z2=(VZ+Cx−A)−y(WZ+Ay−Bx)\left\{\begin{array}{l} u=\frac{\dot{X}}{Z}-\frac{X \dot{Z}}{Z^{2}}=\left(\frac{U}{Z}+B-C y\right)-x\left(\frac{W}{Z}+A y-B x\right) \\ v=\frac{\dot{Y}}{Z}-\frac{Y \dot{Z}}{Z^{2}}=\left(\frac{V}{Z}+C x-A\right)-y\left(\frac{W}{Z}+A y-B x\right) \end{array}\right.{u=ZX˙​−Z2XZ˙​=(ZU​+B−Cy)−x(ZW​+Ay−Bx)v=ZY˙​−Z2YZ˙​=(ZV​+Cx−A)−y(ZW​+Ay−Bx)​

其中,
X˙=U+BZ−CY,Y˙=V+CX−AZ,Z˙=W+AY−BX\quad \dot{X}=U+B Z-C Y, \quad \dot{Y}=V+C X-A Z, \quad \dot{Z}=W+A Y-B XX˙=U+BZ−CY,Y˙=V+CX−AZ,Z˙=W+AY−BX

光流法的三维运动表示相关推荐

  1. OpenCV 使用光流法检测物体运动

    OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"// ...

  2. HALCON:Optical Flow(光流法)

    HALCON:Optical Flow(光流法) 光流法基本原理 光流概念由Gibson在1950年首先提出来,它是一种简单实用的图像运动表达方式,通常定义为一个图像序列中图像亮度模式的表观运动,即空 ...

  3. 基于运动信息的物体检测(背景差分法、帧间差分法和光流法)。

    1.背景差分法: 它的基本思想是将输入图像与背景模型进行比较,通过判定灰度等特征的变化,或用直方图等统计信息的变化来分割运动目标. 首先建立好背景模型,存储背景图像.当当前帧与背景图像相减大于一定的阈 ...

  4. 运动目标检测__光流法

    以下内容摘自一篇硕士论文<视频序列中运动目标检测与跟踪算法的研究>: 1950年Gibson首先提出了光流的概念,光流(optical flow)法是空间运动物体在观测成像面上的像素运动的 ...

  5. 光流法 Optical Flow

    最近调研目标跟踪,看到一个光流法,测试了一下它的效果,挺好玩的,这里对找到的资料简单整理总结一下. 对于光流法的介绍,可以参看如下博客http://blog.csdn.net/zouxy09/arti ...

  6. 光流法目标跟踪原理(不带公式)

    光流的概念于1950年由Gibson首先提出,所谓光流就是指图像表现运动的速度.物体在运动的时候之所以能被人眼发现,就是因为当物体运动时,会在人的视网膜上形成一系列的连续变化的图像,这些变化信息在不同 ...

  7. OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)...

    https://blog.csdn.net/shadow_guo/article/details/44312691 基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 1. 单目视觉三维重建问题 ...

  8. OpenCV3学习(11.2)LK光流法原理及opencv实现

    光流的概念:(Optical flow or optic flow) 它是一种运动模式,这种运动模式指的是一个物体.表面.边缘在一个视角下由一个观察者(比如眼睛.摄像头等)和背景之间形成的明显移动.光 ...

  9. 目标跟踪之光流法---光流法简单介绍

    光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系 ...

最新文章

  1. Nginx reload的时候出现的问题/usr/local/nginx/logs/nginx.pid
  2. 怎样用matlab模型建立,怎样在matlab里建立一个BP神经网络模型?
  3. 什么叫n+1次select查询问题?
  4. srs10流程图_高效的SRS资源指示方法与流程
  5. Butterknife使用——转
  6. [html] 写出不定宽度的子级div,在相对于固定宽度的父级元素水平居中的布局
  7. 动态排名系统(整体二分)
  8. 评论中显示表情,苹果和安卓都一样
  9. C#基础-获得当前程序的 空间名.类名.方法名
  10. #《机器学习》_周志华(西瓜书)南瓜书_第4章 决策树
  11. 怎样用比较器实现信号的衰减和饱和_高频小信号LC谐振放大器的设计思路与具体电路实现...
  12. 基于stm32f103c8t6的Flash地址空间的数据读取
  13. 基于颜色的R2V软件快速矢量化
  14. 一、响应式编程基本介绍
  15. 随机邻域嵌入_诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用-阿里云开发者社区...
  16. css:css样式背景图片设置透明度,css如何设置背景图片的透明度
  17. 基于Springboot+Vue网上试衣镜服装穿搭网站设计
  18. html5免费文本教程,HTML5-文本元素
  19. Github 搜索语法大全
  20. codeigniter mysql -1_Codeigniter MySQL查询与变量

热门文章

  1. 金融类APP安全防护,做好风险检测是关键
  2. 【分享】Python逆函数计算——pynverse库
  3. C++ Builder调用辰昶仪器ChNetDriver库
  4. 视频中演员人脸进行识别及分类
  5. 【转】CefSharp语言(Locales)本地化问题
  6. js判断两字符串是否相等不区分大小写
  7. RenPy 对话框(跟随人物移动)
  8. RenpyViewer - Renpy游戏列表
  9. 【2019春招准备:10.数据库综合】
  10. (受益匪浅)-大四学长高项备考经验