当前位置: 首页 > news >正文

运动估计算法的程序实现_光流法--Lucas Kanade算法

一 光流简介:

光流问题涉及尝试找出一幅图像中的许多点在第二幅图像中移动的位置--通常是以视频序列完成的,因此可以假定第一幅图像中的大部分点框架都可以在第二幅图像中找到。光流可以用于场景中物体的运动估计,设置用于相机相对于整个场景的自运动估计。光流算法的理想输出是两帧图像中每个像素的速度的估计关联,或者等效的,一幅图像中每个像素的位移矢量,指示该像素在另一幅图像中的相对位置,如果图像中的每个像素都采用这种方法通常称为“稠密光流”。还有一种算法称为“稀疏光流”,仅仅只跟踪图像中某些点的子集,该算法通常是快速且可靠的,因为其将注意力只放在容易跟踪的特定点上,稀疏跟踪的计算成本远远低于稠密跟踪,这也导致了后者的研究基本被限制在了学术圈。

二 Lucas Kanade稀疏光流算法:

2.1 简要介绍

Bruce D. Lucas 和 Takeo Kanade在1981年提出了Lucas Kanade(LK)算法试图计算稠密光流。然而该方法容易应用到输入图像中的点的子集,所以反而成为了稀疏光流算法的重要技术,该算法可以应用到稀疏场景中,因为它仅依赖于围绕某个兴趣点的一些小窗口导出的局部信息,但该算法的缺点在于,如果像素点的运动幅度过大,运动到了局部窗口之外,那么算法将无法找到。这个问题就导致了“金字塔-LK算法的发展”,该算法从图像金字塔的最低细节开始跟踪,并逐渐跟踪至更精细的细节。跟踪图像金字塔允许大幅度的运动被局部窗口捕捉。

2.2 工作原理

LK算法是一种两帧差分的光流估计算法,其基本思想基于以下三个假设。

  • 亮度恒定:场景中目标图像的像素看起来在帧到帧移动是不发生改变。对于灰度图像(对于彩色图像同适用)这意味着像素的灰度值不会随着帧的跟踪改变。
  • 时间持续性(微小移动):图像上相机的移动随时间变化缓慢。实际上,这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求对应的偏导数。
  • 空间一致性:场景中相同表面的相邻点具有相似的运动,并且其投影到图像平面上的距离也比较近。

三个基本假设中前两个是光流法的基本假设,第三个是LK算法特有的。

基于前两个假设,我们得到图像的约束方程:

其中

时刻图像在
位置的亮度。

利用泰勒公式对函数

处展开可得:

其中

为泰勒公式的高阶余项近似为0。

联立公式(1)和(2)可以得到

等价为

其中

分别为像素点沿着x和y方向的导数,沿x和y方向的速度分量分别记为
,可以将以上式子简写为:

进一步简化为矩阵形式:

由于以上的方程有

两个未知数,所以无法求解,那们我们就要基于第三条假设得到一些其他的方程进行联立求解。

回到第三条假设,我和可以假设在一个大小为

的窗口内,图像的光流是一个恒定值。那么就可以得到以下方程组:

为了求解以上过度约束的系统可以采用最小二乘法对以上的方程还是进行最小化,将以上方程采用矩阵形式进行表示:

3d12761c6d433607b95afdd95b20d28a.png

记做

,采用最小二乘法得到

则最终所有求解的光流(速度矢量)为:

矩阵形式表示如下:

60a733ae5821fb0efa77cf6d86b606f4.png

最终求得

便是LK算法所对应的光流。

2.3 代码实现

以下为python-opencv的官方实现

import 

实验效果:

cf0eca1318fb577818677305727acf83.gif

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网吧系统母盘制作(系统分区整体考虑优化配置篇)
  • 点在多边形内_空间分析:2-4.Python生成泰森多边形
  • struts2的s:param标签使用
  • leetcode 打印_剑指 Offer 32 - I. 从上到下打印二叉树
  • 使用spring的MBeanExporter暴露hibernate的StatisticsService对象方法
  • springboot分页插件_Spring boot整合Mybatis Generator以及PageHelper源码分析
  • ext2.0不能与prototype1.6一起使用
  • c语言scanf一次不定_初学C语言编程时最容易犯的错误,你踩坑了吗?
  • 知识可以触类旁通。。。
  • cmd bat删除文件命令_ftp下载文件命令地址,用cmd命令访问ftp下载文件地址
  • 洪昭光:21世纪的健康新标准
  • python做图片美化_Python实现简单的照片磨皮(照片智能磨皮) 最新免费版
  • excel公式大全详解_财务常用的Excel函数公式大全(共484个),帮你整理好了!...
  • 2007 - 2008
  • python读二进制文件遍历_读取二进制文件并遍历每个字节
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • extract-text-webpack-plugin用法
  • HTTP--网络协议分层,http历史(二)
  • in typeof instanceof ===这些运算符有什么作用
  • js如何打印object对象
  • leetcode讲解--894. All Possible Full Binary Trees
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue.js 移动端适配之 vw 解决方案
  • 从重复到重用
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 欢迎参加第二届中国游戏开发者大会
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何学习JavaEE,项目又该如何做?
  • 深入浏览器事件循环的本质
  • 实现简单的正则表达式引擎
  • 使用agvtool更改app version/build
  • 微信支付JSAPI,实测!终极方案
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • "无招胜有招"nbsp;史上最全的互…
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define用法
  • #git 撤消对文件的更改
  • #Java第九次作业--输入输出流和文件操作
  • (09)Hive——CTE 公共表达式
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (新)网络工程师考点串讲与真题详解
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)jQuery 基础
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)