LK光流法和LK金字塔光流法(含python和c++代码示例)
0 引言
本文主要记录LK光流算法及LK金字塔光流算法的详细原理,最后还调用OpenCV中的cv2.calcOpticalFlowPyrLK()函数实现LK金字塔光流算法,其中第3部分是python语言实现版本,第4部分是c++语言实现版本。
1 LK光流算法
1.1 简述
LK光流法是一种计算图像序列中物体运动的光流(optical flow)的经典算法。它是由Bruce D. Lucas和Takeo Kanade在1981年提出的,被广泛应用于计算机视觉和图像处理领域。
光流是指图像中物体在时间上的运动造成的像素强度变化。光流法的目标是通过分析图像序列中相邻帧之间的像素强度变化来估计物体的运动状况。LK光流法基于以下三个基本假设:
- 亮度恒定假设:假设相邻帧中的像素在时间上的变化主要由物体的运动引起,而不是由光照变化或物体的颜色变化引起。这意味着在物体的运动下,相邻帧中对应的像素强度值应该保持不变;
- 小运动假设:假设物体在相邻帧之间的运动是较小的,即相邻帧之间的像素位移较小。这个假设使得可以使用局部近似的方法来估计光流;
- 空间一致性:场景中相同表面的相邻点具有相似的运动,并且其投影到图像平面上的距离也比较近。(
LK算法特有)
1.2 原理推导
首先基于亮度恒定假设和小运动假设,设 t t t时刻,位于 ( x , y ) (x,y) (x,y)像素位置的物体,且在 t + Δ t t+\Delta _t t+Δt时刻位于 ( x + u , y + v ) (x+u,y+v) (x+u,y+v)位置,则有:
I ( x , y , t ) = I ( x + u , y + v , t + Δ t ) (1) I(x,y,t)=I(x+u,y+v,t+\Delta _t) \tag{1} I(x,y,t)=I(x+u,y+v,t+Δt)(1)
将等式右边进行一阶泰勒展开得:
I ( x + u , y + v , t + Δ t ) = I ( x , y , t ) + I x ′ u + I y ′ v + I t ′ Δ t (2) I(x+u,y+v,t+\Delta _t)=I(x,y,t)+I{}'_xu+I{}'_yv+I{}'_t\Delta _t \tag{2} I(x+u,y+v,t+Δt)=I(x,y,t)+Ix′u+Iy′v+It′Δt(2)
结合公式1和公式2,得出:
I ( x , y , t ) = I ( x , y , t ) + I x ′ u + I y ′ v + I t ′ Δ t (3) I(x,y,t)=I(x,y,t)+I{}'_xu+I{}'_yv+I{}'_t\Delta _t \tag{3} I(x,y,t)=I(x,y,t)+Ix′u+Iy′v+It′Δt(3)
即:
I x ′ u + I y ′ v + I t ′ Δ t = 0 (4) I{}'_xu+I{}'_yv+I{}'_t\Delta _t=0 \tag{4} Ix′u+Iy′v+It′Δt=0(4)
公式4写成矩阵形式:
[ I x ′ + I y ′ ] [ u v ] = − I t ′ Δ t = − Δ I t (5) \begin{bmatrix}I{}'_x+I{}'_y\end{bmatrix}\begin{bmatrix}u \\ v\end{bmatrix}=-I{}'_t\Delta _t=-\Delta I_t \tag{5} [Ix′+Iy′][uv]=−It′Δt=−ΔIt(5)
其中, I x ′ , I y ′ I{}'_x,I{}'_y Ix′,Iy′分别为 ( x , y ) (x,y) (x,y)像素点处图像亮度在 x x x方向和 y y y方向的偏导数;
I t ′ I{}'_t It′为 t t t时刻, ( x , y ) (x,y) (x,y)处像素亮度对时间的导数;
I t ′ Δ t I{}'_t\Delta _t It′Δt为两图之间的 ( x , y ) (x,y) (x,y)坐标位置的亮度差,表示为 Δ I t = I t ′ Δ t \Delta I_t=I{}'_t\Delta _t ΔIt=It′Δt
给定两张图片, I x ′ , I y ′ , Δ I t I{}'_x,I{}'_y,\Delta I_t Ix′,Iy′,ΔIt是已知量, u , v u,v u,v即是待求的光流,但仅凭公式5一个等式求解两个未知数 u , v u,v u,v,暂时无法得到唯一解。
所以还需借助第三个假设-空间一致性,假设在一个大小为 m × m ( n = m 2 ) m\times m(n=m^2) m×m(n=m2)的窗口内,图像的光流是一个恒定值,可得:
I x 1 u + I y 1 v = − I t 1 I x 2 u + I y 2 v = − I t 2 ⋯ I x n u + I y n v = − I t n (6) \begin{gather} I_{x1}u+I_{y1}v=-I_{t1} \\ I_{x2}u+I_{y2}v=-I_{t2} \\ \cdots \\ I_{xn}u+I_{yn}v=-I_{tn} \\ \end{gather} \tag{6} Ix1u+Iy1v=−It1Ix2u+Iy2v=−It2⋯Ixnu+Iynv=−Itn(6)
用矩阵形式表示为:
[ I x 1 + I y 1 I x 2 + I y 2 ⋮ I x n + I y n ] [ u v ] = [
相关文章:
LK光流法和LK金字塔光流法(含python和c++代码示例)
0 引言 本文主要记录LK光流算法及LK金字塔光流算法的详细原理,最后还调用OpenCV中的cv2.calcOpticalFlowPyrLK()函数实现LK金字塔光流算法,其中第3部分是python语言实现版本,第4部分是c++语言实现版本。 1 LK光流算法 1.1 简述 LK光流法是一种计算图像序列中物体运动的光…...
数据库索引是什么?创建索引的注意事项
数据库索引: 索引(index)是帮助MySQL高效获取数据的数据结构(有效),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向&#x…...
java中的异常,以及出现异常后的处理【try,catch,finally】
一、异常概念 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的…...
前端构建但没有更新
使用jenkins构建vue前端代码时,构建完成后,jenkins提示构建成功, 但前端刷新提示还是原来的效果,此时需要查看下jenkins构建日志,如果出现下面的文字,说明缺少依赖,最新的代码并没有构建到项目中…...
【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决
编译时出现的错误: mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 Makefile:161: recipe for target ‘all’ failed mingw32-make: *** [all] Error 2解决方法: 根据贴吧老哥的解答,发现是mingw版本有问题导…...
#Day Day Plan# 《NCB_PCI_Express_Base 5.0.1.0》pdf 译文笔记 模版
目录 一 本章节主讲知识点 1.1 xxx 1.2 sss 1.3 ddd 二 本章节原文翻译 2.1 ddd 三 本章节关联知识点 2.1 ddd 四 本章节存疑问题 2.1 222 五 总结 一 本章节主讲知识点 1.1 xxx 1.2 sss 1.3 ddd 二 本章节原文翻译 2.1 ddd 三 本章节关联知识点 2.1 ddd 四…...
分代ZGC详解
ZGC(Z Garbage Collector)是Java平台上的一种垃圾收集器,它是由Oracle开发的,旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器,它主要针对具有大内存需求和低停顿时间要求的应用程序 分代ZGC收集器…...
vue图片懒加载
Vue图片懒加载是一种优化页面性能的技术,它可以延迟加载页面上的图片,直到它们进入可见区域。这可以减少页面的加载时间,提高用户体验。 在Vue中实现图片懒加载可以使用第三方库vue-lazyload。首先需要安装该库: npm install vu…...
【c++】运算符重载实例
重载自增自减运算符 Intger num(2); num; num;对自增运算符的重载要区分前置和后置。在重载之前需要思考一个问题,num是返回一个临时变量还是num对象的本体。 为了解决这个问题可以考虑实现一个Inc_()函数和_Inc()函数分别模仿后置和前置的行为 Integer Inc_(){i…...
用*画田字形状,numpy和字符串格式化都可以胜任
numpy的字符型元素矩阵,可以方便画;直接python字符串手撕,也可以轻巧完成。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《…...
搭建一个windows的DevOps环境记录
边搭建边记录,整个DevOps环境的搭建可能会很久。。。 一、安装Jenkins: 参考:Jenkins基础篇--windows安装Jenkins-CSDN博客 注意上面选择JDK的路径,选择到安装目录,该目录并不一定要在path中配置了(就是…...
漏洞扫描系统的主要功能有哪些
漏洞扫描系统是一种自动化的工具,用于发现和报告计算机网络系统中的安全漏洞。这些漏洞可能包括软件漏洞、配置错误、不安全的网络设备等。漏洞扫描系统的主要功能包括以下几个方面: 目标识别:漏洞扫描系统首先需要识别目标系统的基本信息&am…...
Spring Boot配置多个Kafka数据源
一、配置文件 application.properties配置文件如下 #kafka多数据源配置 #kafka数据源一,日志审计推送 spring.kafka.one.bootstrap-servers172.19.12.109:32182 spring.kafka.one.producer.retries0 spring.kafka.one.producer.properties.max.block.ms5000 #kafk…...
Learning Open-World Object Proposals without Learning to Classify(论文解析)
Learning Open-World Object Proposals without Learning to Classify 摘要1 介绍2 相关工作3 方法3.1 基线3.2 基于纯定位的对象性3.3. 对象定位网络 (OLN)4 实验4.1跨类泛化4.2.开放世界类不可知检测4.3更多的跨数据集泛化4.3.1 Objects365 泛化4.3.2 EpicKitchens 的泛化4.4…...
前端在项目中添加自己的功能页面
1.src—>mock–>sideMenue:边表(sidemenue)的子功能的添加:左边功能框中的显示 在相应的父功能添加子功能 id号不能和他人的一样,casecode:就是路由名字 title:中文名称 2.前后端接口(后端程序员给),定义好接口名称 src—>moudles—…...
数据库MySQL(二):DDL数据定义语言
数据定义语言(Data Definition Language,DDL) 该语言主要用于定义数据库对象,操作对象为数据库、表或字段。 数据库操作 # 查询所有数据库 SHOW DATABASES;# 查询当前数据库 SELECT DATABASE(); # 创建数据库 CREATE DATABASE […...
Spring FactoryBean 源码讲解
Spring FactoryBean 源码讲解 什么是Spring FactoryBean Spring FactoryBean是一个特殊的Bean,它实现了FactoryBean接口并重写了其getObject()方法,用于生产其他Bean的实例。在Spring容器启动时,会自动调用FactoryBean的getObject()方法来获…...
【C语言】零碎知识点|细节
除法运算符(/)的使用规则 在C语言中,除法运算符(/)的使用规则如下: 当两个整数相除时,结果也是一个整数。例如,如果A和B都是整数,那么A / B的结果也是一个整数。这意味着,除法运算的结果会忽略小数部分。例如,10 / 3 的结果是3,而不是3.3333。 当一个整数和一个浮点…...
电影评分数据分析案例-Spark SQL
# cording:utf8from pyspark.sql import SparkSession from pyspark.sql.types import IntegerType, StringType, StructType import pyspark.sql.functions as Fif __name__ __main__:# 0.构建执行环境入口对象SparkSessionspark SparkSession.builder.\appName(movie_demo)…...
vue如何使用冻结对象提升代码效率及其原理解析
先给大家伙整个实际工作中一定会碰到的问题 如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据 来看看源码, html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度 <template><div id&quo…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
