金字塔Lucas-Kanade稀疏光流

LK光流金字塔算法原理及C++实现 光流跟踪算法,通常应用于连续时间序列图像的点追踪。当图像序列之间存在运动时,相同部位的点在不同图像上将处于不同的坐标位置,使用光流跟踪算法可以追踪相同部位的点在不同图像上分别运动到什么位... 阅读详情
光流分为稀疏光流和稠密光流,稠密光流的每个像素与速度或者可以说是与位移相关,使用稠密光流得以跟踪运动的方法有Horn-Shrunk方法,还有块匹配方法,但是现在已经很少使用到了,这里不做介绍,稠密光流需要使用某种插值方法在比较容易跟踪的像素之间进行插值以解决那些运动不明确的像素,因此可想而知,计算量是相当大的。

而对于稀疏光流来说,在他计算时需要在被跟踪之前指定一组点(角点),因此在使用LK方法之前我们需要配合使用cvGoodFeatureToTrack()来寻找角点,继而使用cvFindCornerSubPix()在之前基础之上精确角点的位置,即寻找亚像素角点。然后利用金字塔LK光流算法,对运动进行跟踪。

LK方法的数学解析部分比较难,所以我们跳过数学原理,直接谈论其算法原理,首先我们需要明白LK算法的三个假设:

1、亮度恒定,图像场景中的目标的像素在帧间运动时外观上保持不变。

2、时间连续或者运动是小运动,图像随时间的运动比较缓慢,实际中指的是时间变化相对图像中的运动的比例要足够小。

3、空间一致。一个场景中的同一表面上的邻近点具有相似的运动,在图像平面上的投影也在邻近区域。

下面给出使用金字塔LK光流算法的代码,笔者在算法相应处给出了一定的注释:

// TestLucasKanade.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
const int MAX_CORNERS=500;
int main(int argc,char** argv)
{
 IplImage* imgA=cvLoadImage(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
 IplImage* imgB=cvLoadImage(argv[2],CV_LOAD_IMAGE_GRAYSCALE);
 CvSize img_sz=cvGetSize(imgA);
 int win_size=10;

 IplImage* imgC=cvLoadImage(argv[3],CV_LOAD_IMAGE_UNCHANGED);

 IplImage* eig_image=cvCreateImage(img_sz,IPL_DEPTH_32F,1);
 IplImage* tmp_image=cvCreateImage(img_sz,IPL_DEPTH_32F,1);

 int corner_count=MAX_CORNERS;
 CvPoint2D32f* cornersA=new CvPoint2D32f[MAX_CORNERS];
 cvGoodFeaturesToTrack(//检测角点
  imgA,
  eig_image,//两个临时图像
  tmp_image,
  cornersA,//函数的输出,即检测到的角点数组
  &corner_count,//最大角点数,调用函数后返回的角点的数目
  0.01,
  5.0,//返回角点之间的最短距离不应小于min_distance
  0,
  3,
  0,
  0.04
  );
 cvFindCornerSubPix(//根据上一步精确角点位置,确定亚像素角点
  imgA,
  cornersA,//整数值的像素位置
  corner_count,//角点数目
  cvSize(win_size,win_size),//等式产生窗口的尺寸
  cvSize(-1,-1),//禁区,不需要时设置cvSize(-1,-1)
  cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)
  );

 char features_found[MAX_CORNERS];
 float feature_errors[MAX_CORNERS];
 CvSize pyr_sz=cvSize(imgA->width+8,imgB->height/3);
 IplImage* pyrA=cvCreateImage(pyr_sz,IPL_DEPTH_32F,1);
 IplImage* pyrB=cvCreateImage(pyr_sz,IPL_DEPTH_32F,1);
 CvPoint2D32f* cornersB=new CvPoint2D32f[MAX_CORNERS];
 cvCalcOpticalFlowPyrLK(
  imgA,//初始图像
  imgB,//最终图像
  pyrA,//申请存放两幅输入图像金字塔的缓存,大小至少为(img.width-8)*img.height/3字节
  pyrB,
  cornersA,//用于寻找运动的点
  cornersB,//存放featureA中点的新的位置
  corner_count,//featureA中点的数目
  cvSize(win_size,win_size),
  5,//金字塔层数
  features_found,//对应点是否在第二副图像中发现
  feature_errors,
  cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.3),
  0
  );

 for(int i=0;i<corner_count;i++)
 {
  if(features_found[i]==0||feature_errors[i]<550)
  {
   printf("error is %f/n",feature_errors[i]);
   continue;
  }
  printf("got it/n");
  CvPoint p0=cvPoint(cvRound(cornersA[i].x),cvRound(cornersA[i].y));
  CvPoint p1=cvPoint(cvRound(cornersB[i].x),cvRound(cornersB[i].y));
  cvLine(imgC,p0,p1,CV_RGB(255,0,0),2);
 }
 cvNamedWindow("ImageA",0);
 cvNamedWindow("ImageB",0);
 cvNamedWindow("LKpyr_opticalFlow",0);
 cvShowImage("ImageA",imgA);
 cvShowImage("ImageB",imgB);
 cvShowImage("LKpyr_opticalFlow",imgC);

 cvWaitKey(0);
 return 0;

}

 

根据上述代码,可以总结出金字塔LK光流应用的基本过程:首先输入图像,在featureA中列出需要跟踪的点,然后调用函数,函数返回后,检查status数组以确定哪些点被成功跟踪,再检查featureB得到这些点的新位置。

以下是程序的运行结果:

金字塔Lucas-Kanade稀疏光流 - 后青春期 - 后青春期 的博客
通过红线的运动方向可以明显的看出手的运动趋势。


转载自 http://zhuyuge0.blog.163.com/blog/static/13230361420117102449387/
OpenCV金字塔光流算法解析笔记 阅读详情

相关推荐

光流估计(二) 从稀疏到稠密:光流场的构建与实战

本文深入探讨了光流估计技术,从稀疏光流到稠密光流的构建与实战应用。通过对比Lucas-Kanade和Farneback等经典算法,详细解析了参数调优、性能优化及工程实践中的关键技巧,帮助读者掌握光流场的可视化与多尺度融合策略,提升计算机视觉项目的实施效率。

diaogan4202的博客 415

Lucas–Kanade光流算法

1. 光流法光流是一种运动模式,这种运动模式指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。 二维图像的移动相对于观察者而言是三维物体移动的在图像平面的投影。有序的图像可以估计出二维图像的瞬时图像速率或离散图像转移。 光流算法评估了两幅图像的

Kuekua的专栏 2万+

十五.光流估计

光流估计 光流,顾名思义,光的流动。比如人眼感受到的夜空中划过的流星。在计算机视觉中,定义图像中对象的移动,这个移动可以是相机移动或者物体移动引起的。具体是指,视频图像的一帧中的代表同一对象(物体)像素点移动到下一帧的移动量,使用二维向量表示. 根据是否选取图像稀疏点进行光流估计,可以将光流估计分为稀疏光流和稠密光流 OpenCV中提供了光流估计的接口,包括稀疏光流估计算法cv2.calcOpticalFlowPyrLK(),和稠密光流估计cv2.calcOpticalFlowFarneback()。其中

small-guo 4989

图像处理【1】空间金字塔Lucas Kanade光流法

论文 Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm的阅读笔记。 光流法用途比较多,比如跟踪,图像配准,以及在三维人脸重建中的稠密对应。问题描述假设II,JJ是两张2D灰度图片,I(x)=I(x,y)I(\mathrm{x})=I(x,y),J(x)=J(x,y)J(

DCD_LIN的博客 8313

python实现opencv中的几个光流函数

python实现opencv中的几个光流函数 1)calcOpticalFlowPyrLK 通过金字塔Lucas-Kanade 光流方法计算某些点集的光流(稀疏光流)。 相关论文:”Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm” 环境:python3+opencv3 ...

LKY111的专栏 4319

46、计算机视觉中的角点检测与光流跟踪技术

本文深入探讨了计算机视觉中的角点检测与光流跟踪技术,重点介绍了亚像素角点位置的计算原理、光流的基本概念及其在运动估计中的应用。详细解析了Lucas-Kanade稀疏光流算法的核心思想、数学推导及其实现方式,并结合OpenCV中的`cv::goodFeaturesToTrack`和`cv::calcOpticalFlowPyrLK`函数展示了完整的点跟踪流程。通过代码示例与参数说明,帮助读者理解如何在实际项目中应用这些技术,同时指出了关键注意事项,如参数选择、图像质量与运动范围限制,适用于视频分析、运动检测等

qsc9012345的博客 68

光流(一)--综述概览

http://www.rosoo.net/a/201403/16937.html

工作笔记 1万+

Matlab版Lucas-Kanade稀疏光流追踪实现,含猫图像序列与实测数据

一套开箱即用的Matlab光流追踪代码,基于Lucas-Kanade算法实现像素级运动估计,专用于图像序列中运动目标的稀疏点跟踪。包含核心脚本optical_flow.m、两帧猫图像(5.png和6.png)、预计算验证数据cat_data.mat,以及运行结果示意图optical_flow_.png。代码适配Matlab 2019a,不依赖任何额外工具箱,所有关键步骤配有中文注释。自动检测图像角点作为特征点,通过迭代最小二乘法求解每帧间的速度向量,输出位移场并绘制跟踪轨迹。支持直接运行查看效果,也允许替换

p4q5r6s7t的博客 186

OpenCV Python 金字塔 Lucas-Kanade 稀疏光流跟踪(逐行超详细解析)

光流是视频中相邻两帧像素的瞬时运动矢量稠密光流:计算图像每一个像素的运动矢量,计算量大;稀疏光流:只跟踪少量高质量特征角点,速度快、工业场景常用,本文采用该方案。前提:(1)亮度恒定:同一点随着时间的变化,其亮度不会发生改变。(2)小运动:随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。(3)空间一致:一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。

wjx810901的博客 610

Cursor Agent模式下如何优雅切换conda环境运行Python脚本?3种实用方法实测

本文针对Cursor Agent模式下运行Python脚本时环境错配的痛点,实测了三种优雅切换conda环境的实用方法。通过Shell全局配置、项目级.cursorrc文件定制以及对话中直接指令,开发者可以确保AI助手在正确的虚拟环境中执行代码,从而提升开发效率和协作流畅度。

redis7keeper的博客 597

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

OpenCV视觉分析之目标跟踪(3)实现基于金字塔的 Lucas-Kanade 算法来进行稀疏光流计算的类SparsePyrLKOpticalFlow的使用

cv::SparsePyrLKOpticalFlow 类是 OpenCV 库中的一个类,用于实现基于金字塔的 Lucas-Kanade 算法来进行稀疏光流计算。这个类特别适合用来跟踪图像序列中的特征点,比如在视频中跟踪物体的关键点。

jndingxin的专栏 726

麒麟操作系统Kylin如何从 2203 升级到 2403

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;开始升级流程第一步:升级前准备1. 确认版本为 V10 SP1 22032. 备份全部重要数据3. 确保网络稳定4. 关闭应用第二步:选择升级方式方法一:图形界面升级方法二:命令行升级1. 更新现有系统至最新2. 启动“系统升级”工具3. 检测并开始下载2403。

让编程变的很简单!! 2657

opencv 稀疏光流 稠密光流

opencv 稀疏光流 稠密光流 demo: http://download.youkuaiyun.com/detail/keen_zuxwang/9860696 参看、学习文档: OpenCV学习笔记(七)Lucas-Kanade光流跟踪点的选择 http://blog.sina.com.cn/s/blog_674f0d390100i7bx.html

keen_zuxwang的博客 1万+

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2473

背靠背VSC直流母线电压控制与同步发电机并网发散问题:原理、分析与解决方案

背靠背VSC直流母线电压控制与同步发电机并网发散问题分析 摘要: 本文研究了背靠背VSC系统在整流侧由理想三相电源切换为同步发电机时出现的直流母线电压振荡和发散问题。通过理论分析发现,锁相环同步失稳、等效阻抗失配和直流母线电容参数失配是导致系统失稳的关键因素。当整流侧接入同步发电机后,系统形成正反馈振荡回路,同时等效电感增大导致电流环响应速度降低,直流侧电容容量不足无法吸收发电机功率波动。文章提出了从跟网型控制到构网型VSG控制的完整升级方案,包含详细的MATLAB/Simulink建模和控制算法实现,并通

huanghm88的专栏 121

OpenCV 光流估计实战:Lucas-Kanade 算法实现运动目标跟踪

光流是,它描述了图像序列中像素点随时间的运动变化。通过分析这些速度矢量,我们可以实现动态场景分析,比如等。

qq_74437448的博客 358

自然语言处理之话题建模:BERTopic模型详解

BERTopic是一种基于BERT的先进话题建模技术,它结合了BERT的语义理解能力和非参数聚类算法HDBSCAN的灵活性,能够生成高质量、语义丰富的话题。与传统的LDA(Latent Dirichlet Allocation)话题模型相比,BERTopic能够更好地捕捉文本的复杂语义结构,因为它利用了预训练的BERT模型来嵌入文本,从而在话题建模中引入了深度学习的力量。聚类是无监督学习的一种,其目标是将数据集中的样本按照相似性进行分组,每个组称为一个“簇”。

zhubeibei168的博客 4537

金字塔 Lucas-Kanade 光流法算法原理和C++代码实现

图像在很短时间内灰度保持不变(亮度恒常);相邻帧之间点的运动较小;某个像素邻域内的运动是一致的(即:局部一致性)。亮度一致性假设公式IxytIxuyvt1IxytIxuyvt1对该式在xyt(x, y, t)xytIxuIyvIt0Ix​uIy​vIt​0IxIyI_x, I_yIx​Iy​:图像的一阶空间梯度;ItI_tIt​:时间梯度;uvu, vuv。

qq_36812406的博客 1593

【华为OD机试真题E卷】474、推荐多样性 | 机试真题+思路参考+代码解析(E卷复用)(C++、Java、Py)

题目描述 >推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略:   各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推   每个列表的元素尽量均分为 N 份,如果不够 N 个,也要全部分配完,参考样例图:

KJ.JK 4434

Linux内核编程(十三)Input输入子系统

Input 子系统是 Linux 内核中专门为输入设备设计的一个子系统,它提供了一个通用的框架来管理各种输入设备,如键盘、鼠标、触摸屏、游戏手柄等。这个子系统的主要目的是简化和规范化输入设备驱动的开发,同时提高驱动的通用性和兼容性。(1)输入设备:如键盘、鼠标、触摸屏、游戏手柄等,它们是用户与计算机进行交互的主要方式。(2)输入设备驱动的复杂性:传统上,为每种输入设备编写驱动都需要创建文件、进行硬件初始化、实现文件操作函数集和处理中断等。每种设备的驱动可能都有许多重复性的工作。

qq_1033275663的博客 2865

OpenCV 光流

一、概述        稠密光流:将图像中的每个像素都与速度关联。该光流可以用Horm-Schunck方法计算。实际上计算稠密光流并不容易。稠密光流的方法需要使用某种插值方法在比较容易跟踪的像素之间进行插值以解决那些运动不明确的像素,从中可以清楚地看到稠密光流相当大的计算量。

965

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Lucas-Kanade光流算法:从原理到工程实践

光流是计算机视觉中描述像素运动的核心概念,它通过分析连续帧间的亮度变化来估计物体的运动矢量。其基本原理基于亮度恒定假设,即同一物体点在短时间内灰度值不变,通过求解光流约束方程来获得运动场。这项技术在视频分析、机器人导航和增强现实中具有重要价值,能够实现高效的运动估计和目标跟踪。Lucas-Kanade算法作为经典的稀疏光流方法,通过局部运动一致性假设和最小二乘优化,在纹理丰富区域实现了高效稳定的特征点跟踪。本文结合工程实践,深入解析了该算法的数学模型、金字塔优化策略及参数调优技巧,并探讨了其在实时视觉系统中

weixin_29912207的博客 309

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

光流法

光流场 所谓光流场就是很多光流的集合。 当计算出一幅图片中每个像素的光流,就能形成光流场。 构建光流场就是试图重现现实世界中的运动场,用以运动分析。 光流法基本原理 1.基本假设条件 (1)亮度恒定不变,同一目标在不同帧间运动时,其亮度不会发生改变。 (2)时间连续或运动是"小运动",时间的变化不会引起目标位置的距离变化,相邻帧之间对象的位移是很小的 2.基本约束方程 考虑一...

ii偏闹i的博客 2824
上一篇: 傅里叶变换与数字图像处理
下一篇: cvCalcOpticalFlowPyrLK的使用
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值