LK光流和特征点的关系
uv方程
光流有两个假设:
1.亮度恒定,即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同
2.时间持续性(微小移动),这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求对应的偏导数。
将图像I看作是有三个自变量(坐标和时间)的函数:,那么对它泰勒展开:
舍去constant,认为(x,y)位置的点在t经过偏移后和初始值相同(对应假设1,偏移之后灰度值不变):
,
这样得到
左右同除以,得到
,
当逼近0,由极限定理可以得:
这样方程就可以使用梯度和速度u,v来表示:
其中也是梯度,只不过是时间坐标方向上的。因为假设2的存在可以使用两帧的差分来表示。xy方向的梯度是同一帧中x和y方向相邻像素的差值表示,那么t方向的梯度就是两帧图对应像素的差值:
Lucas-Kanade 法
第三个假设
从这个方程中可以看到,每个像素位置有u,v两个变量要求,但是只有一个方程怎么能有两个未知数呢?LK又增加了第三个假设:空间一致性:场景中相同表面的相邻点具有相似的运动,这样就可以联立多个方程去求解u,v。
所以两个假设都是有用的:第一个亮度不变的假设让可以可以得到泰勒展开中的偏导和为0,进一步得到了光流方程;第二个假设让我们可以联立方程组,进而求解出当前邻域的光流值。
Lucas-Kanade法就是利用一个3x3的领域中的9个像素点具有相同的运动,就可以得到9个点的光流方程(即上述公式),用这些方程来求得(u, v)这两个未知数。相当于多个uv方程共有同一个u,v:
显然这是个约束条件过多的方程组(超正定方程),不能解得精确解,一个好的解决方法就是使用最小二乘来拟合。
矩阵形式
上面方程组的矩阵形式为:
这就是光流约束方程,类型是Ax=b。x的解通过广义逆矩阵来表示:
和角点的关系
可以看到G是一个hessian矩阵,和harris角点的检测如出一辙。为了解得光流中的uv,就要求G首先是可逆的,而可逆就要求G的两个特征值都非零,即最小特征值尽可能大。这就表明了只有在角点的位置才可以求得uv。或者反证一下,如果M描述的是平坦区域或者边缘,那么总会有一个方向的差分是0,就无法满足可逆的条件:
这限制了LK光流法的使用范围,这也是被称为稀疏光流法的主要原因。
和特征点匹配的关系
LK光流不需要描述子,也不需要匹配。
LK光流只计算前一帧的特征点,再结合两帧的差分就可以计算光流,所以可以看作是特征点追踪。
特征点的选择,opencv的cv::goodFeaturesToTrack函数中,默认shi-tomasi角点,可选Harris角点检测。shi-tomasi是在论文《Good_Features_to_Track》中提出的,相比于Harris修改了R的计算,只关注较小的特征值,这样就可以省去超参数k的设定:
Harris | shi-tomasi |
![]() | ![]() |
金字塔
因为假设2的存在,进一步限制了光流的使用,因为输入帧之间的运动往往是很大的。所以一个思路就是把图像下采样,下采样2倍,那么运动也会缩小为原来的2倍,这样就又可以满足假设2.
具体使用的金字塔是高斯金字塔。所以在下采样前要先进行高斯模糊:
下采样是真正的采样,而不是resize,个人猜测这样一方面是简单,因为2倍的下采样就只需要对行列进行奇数或者偶数抽样就可以了。另外一方面是避免了resize带来的中心偏移。
因为金字塔的使用,上一层的光流*2被传递到下一层,所以就使得光流可以处理更大的运动。
代码
import numpy as np
import cv2
"""
LK for image
"""
img_old = cv2.imread('../asset/image/1.bmp')
img_new = cv2.imread('../asset/image/2.bmp')old_frame = cv2.cvtColor(img_old, cv2.COLOR_BGR2GRAY)
new_frame = cv2.cvtColor(img_new, cv2.COLOR_BGR2GRAY)feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7)
lk_params = dict(winSize=(30, 30), maxLevel=6)p0 = cv2.goodFeaturesToTrack(old_frame, mask=None, **feature_params)
p1, st, err = cv2.calcOpticalFlowPyrLK(old_frame, new_frame, p0, None, ) #p1表示当前帧对应的特征点,st标志是否是运动的角点,err表示错误率p11 = p1[st == 1]
p00 = p0[st == 1]for i, (new, old) in enumerate(zip(p11, p00)):image_old = cv2.circle(img_old, (old[0], old[1]), 5, (0, 0, 255), -1)image_new = cv2.circle(img_new, (new[0], new[1]), 5, (0, 0, 255), -1)
cv2.imshow('new', image_new)
cv2.imshow('old', image_old)
reference:
总结:光流--LK光流--基于金字塔分层的LK光流--中值流_mini猿要成长QAQ的博客-CSDN博客
Fast Optical Flow using Dense Inverse Search - 知乎
OpenCV: Optical Flow
光流(Optical flow)-视频分析基础概念-CSDN博客
光流法(optical flow)_推导光流方程-CSDN博客
https://zhuanlan.zhihu.com/p/384651830
【SLAM】光流 - LK光流 - 金字塔分层LK光流_tlk光流-CSDN博客
LK光流法---金字塔改进_lk金字塔光流法-CSDN博客
http://robots.stanford.edu/cs223b04/algo_tracking.pdf
相关文章:
LK光流和特征点的关系
uv方程 光流有两个假设: 1.亮度恒定,即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同 2.时间持续性(微小移动),这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求…...
Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11
首先Rocky Linux 9.5中,默认官方建议使用的是mysql8.0,项目要兼容以往数据,经过测试跟mysql5.7.11能做兼容。 一:工具准备以及安装步骤 1、官网下载地址:https://downloads.mysql.com/archives/community/ 下载版本…...
练习题:113
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 定义列表: for 循环遍历列表: 输出元素: 运行思路 结束语 Python题目 题目 使用for循环遍历一个列表并输出每个元素。 题目分析 需求理…...
文件上传存储安全OSS 对象分站解析安全解码还原目录执行
# 文件 - 解析方案 - 执行权限 & 解码还原 1 、执行权限 文件上传后存储目录不给执行权限 2 、解码还原 数据做存储,解析固定(固定协议)(文件后缀名无关) 文件上传后利用编码传输解码还原 # 文件 - 存储方案 - 分站存储…...
NUUO摄像头debugging_center_utils命令执行漏洞
免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 NUUO NVR是中国台湾省NUUO公司旗…...
华为OD机试2025A卷 - 正则表达式替换(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 为了便于业务互交,约定一个对输入的字符串中的下划线做统一替换。 具体要求如下: 输入字符串,将其中包含的每一个下划线“_”,使用特殊字符串(^|$|[,+])替换,并输出替换后的结果…...
2025-3-30算法打卡
一,小明的彩灯 1.题目描述: 题目描述 小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 aiai。 小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 xx(xx 可能为负数)。 求…...
【今日半导体行业分析】2025年3月30日
今日探针卡行业分析:把握机遇,应对挑战 一、引言 在半导体产业的精密制造流程中,探针卡作为晶圆测试环节的核心设备,犹如一颗精密的 “心脏”,承担着芯片封装前电学性能测试与筛选的重任。其性能的优劣直接关系到芯片…...
深度学习Note.5(机器学习2)
多项式回归 1.与线性回归联系: 与线性回归大体相似,代码部分复用性高,不同点:公式中为x的次方,可能要规范化处理。 2.paddle的API paddle.sin(x, nameNone) 功能:计算输入的正弦值。 输入:输入…...
三、分类模块,通用组件顶部导航栏Navbar
1.封装通用组件顶部导航栏Navbar 不同效果 Component export struct MkNavbar {Prop title: string Prop leftIcon: ResourceStr $r("app.media.ic_public_left")ProprightIcon: ResourceStr $r("app.media.ic_public_more")PropshowLeftIcon: boolean…...
PipeWire 音频设计与实现分析三——日志子系统
日志子系统 PipeWire 的日志子系统的设计分为多个层次。PipeWire 用 struct spa_log 对象描述日志组件,用 struct spa_log_methods 对象描述日志组件打印各层级日志的多个方法。PipeWire 为日志子系统添加了 topic 机制,不同文件中的日志按功能以不同的…...
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息 conftest.py文件下封装两个夹具夹具一:将storage_state登录状态导出为json文件夹具二:重写夹具browser_context_args,添加storage_state登录状态登录…...
Codeforces Round 1014 (Div. 2)(A-D)
题目链接:Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代码 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…...
vulhub靶场—— Tomcat8
目录 一、漏洞描述 二、靶场搭建 三、漏洞复现 1、弱密码 2、文件上传 一、漏洞描述 环境描述: Tomcat 支持后台部署 war 文件,可以直接将 webshell 部署到 web 目录下。tomcat 默认的管理页面 manager 使用 basic 认证用户名和密码登录࿰…...
c# ftp上传下载 帮助类
工作中FTP的上传和下载还是很常用的。如下载打标数据,上传打标结果等。 这个类常用方法都有了:上传,下载,判断文件夹是否存在,创建文件夹,获取当前目录下文件列表(不包括文件夹) ,获取当前目录下文件列表(不包括文件夹) ,获取FTP文件列表(包括文件夹), 获取当前目…...
Redis 哈希表结构详解
Redis 哈希表结构详解 相关链接 redis中 hashtable的 sizemask理解 一、核心结构体定义与作用 Redis 的哈希表实现基于 链表法解决冲突,并采用 渐进式 rehash 策略。其核心结构体包括 dictEntry、dictht 和 dict,三者协作实现高效的键值对存储。 二、结…...
接口等幂处理
介绍 ✅ 什么是等幂(Idempotency)? 等幂 无论这个操作被执行多少次,结果都是一样的,不会因为多次执行而产生副作用。 通俗一点说:“点一次和点一百次,效果是一样的。” ✅ 在接口中࿰…...
华为配置篇-BGP实验
BGP 一、简述二、常用命令总结三、实验 一、简述 二、常用命令总结 display bgp peer #查看 BGP 对等体 display bgp routing-table #查看 BGP 路由表#在R1上通过 network 命令发布路由 [R1]bgp 64513 [R1-bgp] network 10.1.1.1 24#在R2上将路由的下一跳地址修改为自身 [R2]…...
【Tauri2】008——简单说说配置文件
前言 配置文件,即tauri.conf.json Configuration Files | Taurihttps://tauri.app/zh-cn/develop/configuration-files/这个文件的作用 该文件由 Tauri 运行时和 Tauri CLI 使用。你可以定义构建设置(例如在 tauri build 或 tauri dev 启动前运行的命令…...
Java学习笔记1——编程基础
一、整数类型变量 注意:每个字符型常量占两个字节 二、自动类型转换和强制类型转换 三、算术运算符 四、赋值运算符 五、比较运算符 六、逻辑运算符 七、运算符的优先级 运算符的优先级可以通过以下口诀来记忆: 括号优先,单目次之&am…...
CMD/DOS和批处理入门知识汇总
0、前言: 在工作中,有时候需要涉及到window系统更底层的一些东西,所以需要学习一些cmd指令和dos命令,来完成高效批处理任务,或者自动化办公。还有想要对系统中文件管理有更细致的认识,便于请理磁盘文件。后…...
Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法
在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦,主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法,供参考: 搭建VS Qt 环境,在Visual Studios 2019下面安装 Qt Vis…...
Python-Django入手
18.1 建立项目 18.1.1 制定规范 - 定义项目目标:明确应用的核心功能 - 创建项目文档:用README.md记录技术栈和开发流程 - 规划目录结构:建议遵循Django官方推荐的项目布局 18.1.2 建立虚拟环境 在命令行执行: python -m ven…...
SakuraCat(2)Endpoint
Endpoint 功能概述 监听指定端口(默认是 8080)的客户端连接。接受客户端连接后,为每个连接创建一个新的线程进行处理。使用 Processor 类来处理客户端的请求和响应。 package com.SakuraCat.connector.protocolHandler;import com.SakuraC…...
19914 最小生成树2
19914 最小生成树2 ⭐️难度:中等 🌟考点:最小生成树 📖 📚 import java.util.*;public class Main {static class Edge{int u,v,w;Edge(int u,int v,int w){this.u u;this.v v;this.w w;}}static ArrayList<…...
SSE服务器主动推送至浏览器客户端,让你不再需要websocket
Server-Sent Events(SSE)是一种服务器向客户端推送实时更新的技术,基于HTTP协议。客户端通过EventSource API来接收事件流,而服务器则保持一个长连接,持续发送数据。这与传统的请求-响应模式不同,允许服务器…...
C++中的搜索算法实现
C中的搜索算法实现 在编程中,搜索算法是解决各种问题的基础工具之一。C作为一种功能强大的编程语言,提供了多种实现搜索算法的方式。本文将详细介绍两种常见的搜索算法:线性搜索和二分搜索,并通过代码示例展示它们的实现。 一、…...
OSI 七层模型和四层模型(TCP/IP 模型)
文章目录 前言一、OSI 七层模型二、TCP/IP 四层模型三、运行协议及设备1. OSI 七层模型2. TCP/IP 四层模型3. 运行协议4. 各类设备的作用 总结 前言 OSI 七层模型和四层模型(TCP/IP 模型)是两种常见的网络协议分层架构,它们的主要区别如下&a…...
将代理连接到 Elasticsearch 使用模型上下文协议
作者:来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松,会怎样?想象一下,你只需简单地问:“显…...
前端调试实践与案例场景
前端调试实践与案例场景 前端开发中,调试是一项必不可少的技能。以下是一些常见的前端调试实践和相应的案例场景: 1. 浏览器开发者工具 案例场景:布局问题 用户报告在移动设备上页面布局错乱。使用 Chrome DevTools 的设备模拟功能和 Ele…...
安卓的布局方式
一、RelativeLayout 相对布局 特点:每个组件相对其他的某一个组件进行定位。 (一)主要属性 1、设置和父组件的对齐: alignParentTop : 设置为true,代表和父布局顶部对齐。 其他对齐只需要改变后面的Top为 Left、Right 或者Bottom&…...
计算机网络面经(一)
以下为个人总结,图源大部分会来自网络和JavaGuide 网络分层模型 OSI七层模型 各层的常见协议 应用层 用户接口 HTTP, FTP, SMTP, DNS表示层 数据格式转换 SSL/TLS, JSON, JPEG会话层 会话管理 NetBIOS, RPC, SSH传输层 端到端通信 TCP, UDP, QUIC网络层 路由寻址…...
k8s日志管理
k8s日志管理 k8s查看日志查看集群中不是完全运行状态的pod查看deployment日志查看service日志进入pod的容器内查看日志 管理k8s组件日志kubectl logs查看日志原理 管理k8s应用日志收集k8s日志思路收集标准输出收集容器中日志文件 k8s查看节点状态失败k8s部署prometheus监控 k8s…...
Netty源码—10.Netty工具之时间轮二
大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核心字段 6.HashedWheelTimer的构造方法 7.HashedWheelTimer添加任务和执行任务 8.HashedWheelTimer的完整源码 9.HashedWheelTimer的总结…...
Baklib激活企业知识管理新动能
Baklib核心技术架构解析 Baklib的底层架构以模块化设计为核心,融合知识中台的核心理念,通过分布式存储引擎与智能语义分析系统构建三层技术体系。数据层采用多源异构数据接入协议,支持文档、音视频、代码片段等非结构化数据的实时解析与分类…...
CSP-J/S冲奖第21天:插入排序
一、插入排序概念 1.1 生活中的类比 • 扑克牌排序:就像整理手中的扑克牌,每次将一张牌插入到已排好序的牌中合适位置 • 动态演示: 初始序列:[5, 2, 4, 6, 1, 3] 排序过程: → [2, 5, 4, 6, 1, 3] → [2, 4, 5, 6, …...
Jest系列二之基础实践
Jest基础实践 官方文档地址:https://jest.nodejs.cn/docs 生命周期 在 Jest 中,生命周期方法大致分为两类:下面所罗列的生命周期方法,也是全局方法,不需要引入,直接就可以使用。 重复性的生命周期方法&…...
Scikit-learn全攻略:从入门到工业级应用
Scikit-learn全攻略:从入门到工业级应用 引言:Scikit-learn在机器学习生态系统中的核心地位 Scikit-learn作为Python最受欢迎的机器学习库,已成为数据科学家的标准工具集。根据2023年Kaggle调查报告,超过83%的数据专业人士在日常工作中使用Scikit-learn。本文将系统性地介…...
基于Python的图书馆信息管理系统研发
标题:基于Python的图书馆信息管理系统研发 内容:1.摘要 在数字化信息快速发展的背景下,传统图书馆管理方式效率低下,难以满足日益增长的信息管理需求。本研究旨在研发一款基于Python的图书馆信息管理系统,以提高图书馆信息管理的效率和准确性…...
Pytorch学习笔记(十七)Image and Video - Adversarial Example Generation
这篇博客瞄准的是 pytorch 官方教程中 Image and Video 章节的 Adversarial Example Generation 部分。 官网链接:https://pytorch.org/tutorials/beginner/fgsm_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...
基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法
基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本:https://developer.a…...
Ubuntu系统Docker安装失败
问题: 1. 删除错误的 Docker 源 sudo rm -rf /etc/apt/sources.list.d/docker.list sudo rm -rf /etc/apt/keyrings/docker.gpg 2. 重新添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | …...
鸿蒙学习手册(HarmonyOSNext_API16)_数据持久化②:键值型数据库
概述 键值型数据库就像一个大抽屉柜,每个抽屉都有一个唯一的标签(键),里面可以放任何东西(值)。当你需要存或取东西时,直接看标签拿对应的抽屉就行,不用管其他抽屉里有什么。这种简…...
多线程 - 线程安全 2 -- > 死锁问题
目录 小结复习: 线程安全: 如何解决线程安全问题? synchronized “死锁” 死锁的三种经典场景: 1. 一个线程,一把锁。 2.两个线程,两把锁。 3. N 个线程 M 把锁 完! 小结复习:…...
JavaScript函数详解
目录 一、函数的基础概念 1. 函数的定义方式 2. 函数的参数处理 3.匿名函数与立即执行函数 4.同名函数与函数提升 二、函数的作用域与闭包 1. 作用域(Scope) 2. 闭包(Closure) 三、高阶函数与函数式编程 1. 高阶函数 2…...
Python-八股总结
目录 1 python 垃圾处理机制2 yield3 python 多继承,两个父类有同名方法怎么办?4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表(List)****2. 元组࿰…...
整合分块请求大模型返回的测试用例及小工具显示bug修复
在之前的分块发送需求数据给大模型进行测试用例生成时,由于数据结构的改变,需要对分块的回复进行整合,正确的整合是保障系统稳定性和功能正确性的核心。随着测试需求的复杂化,这对测试工程师提出了更高的整合和管理要求。本文将为…...
记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过
通过分析源代码并找到绕过限制的方法,从而获取到flag! 部分源码: <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…...
stm32F103RCT6 FLASH模拟EEPROM 读写32位数据
#include “stm32flash.h” #ifndef __STMFLASH_H__ #define __STMFLASH_H__ #include "main.h" #define</...
Spring Data审计利器:@LastModifiedDate详解!!!
🕒 Spring Data审计利器:LastModifiedDate详解🔥 🌟 简介 在数据驱动的应用中,记录数据的最后修改时间是常见需求。Spring Data的LastModifiedDate注解让这一过程自动化成为可能!本篇带你掌握它的核心用法…...