0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

稀疏光流跟踪(KLT)算法详解

OpenCV学堂 来源:OpenCV学堂 作者:gloomyfish 2022-09-02 10:07 次阅读

稀疏光流跟踪(KLT)详解

视频移动对象跟踪中,稀疏光流跟踪是一种经典的对象跟踪算法,可以绘制运动对象的跟踪轨迹与运行方向,是一种简单、实时高效的跟踪算法,这个算法最早是有Bruce D. Lucas and Takeo Kanade两位作者提出来的,所以又被称为KLT。KLT算法工作有三个假设前提条件:

亮度恒定

短距离移动

空间一致性

亮度恒定

对象中任意像素点p(x,y)亮度值,在t-1时候的值,在t时刻移动(u, v)之后亮度值保持不变

2aa9dd0a-2a03-11ed-ba43-dac502259ad0.jpg


空间一致性

假设对像素点p(x, y)来说,周围的像素点都保持相同的移动距离(u, v) 假设窗口大小为5x5,则对于25个窗口内的像素点来说,就会如下等式成立:

2ac6159c-2a03-11ed-ba43-dac502259ad0.jpg


得到下面的过约束等式,根据最小二乘可以求解(u, v):

2b0ca192-2a03-11ed-ba43-dac502259ad0.jpg


这样我们就得到了KLT光流等式与该窗口的的Hessian矩阵

2b21ef5c-2a03-11ed-ba43-dac502259ad0.png

2b38436a-2a03-11ed-ba43-dac502259ad0.jpg

空间尺度不变性

通过建立每一帧的图像金字塔,实现尺度空间窗口目标对象搜索

2b5a444c-2a03-11ed-ba43-dac502259ad0.jpg


OpenCV中KLT演示代码实现

OpenCV中KLT算法API及其参数解释如下:

voidcv::calcOpticalFlowPyrLK(
InputArrayprevImg,//前一帧图像
InputArraynextImg,//后一帧图像
InputArrayprevPts,//前一帧的稀疏光流点
InputOutputArraynextPts,//后一帧光流点
OutputArraystatus,//输出状态,1表示正常该点保留,否则丢弃
OutputArrayerr,//表示错误
SizewinSize=Size(21,21),//光流法对象窗口大小
intmaxLevel=3,//金字塔层数,0表示只检测当前图像,不构建金字塔图像
TermCriteriacriteria=TermCriteria(TermCriteria::EPS,30,0.01),//窗口搜索时候停止条件
intflags=0,//操作标志
doubleminEigThreshold=1e-4//最小特征值响应,低于最小值不做处理
)

特征点检测与绘制的代码实现如下:

//detectfirstframeandfindcornersinit
Matold_frame,old_gray;
capture.read(old_frame);
cvtColor(old_frame,old_gray,COLOR_BGR2GRAY);
goodFeaturesToTrack(old_gray,featurePoints,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);

特征点绘制

voiddraw_goodFeatures(Mat&image,vectorgoodFeatures){
for(size_tt=0;t< goodFeatures.size(); t++) {
        circle(image, goodFeatures[t], 2, Scalar(0, 255, 0), 2, 8, 0);
    }
}

KLT跟踪代码如下

TermCriteriacriteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,30,0.01);
doublederivlambda=0.5;
intflags=0;

boolret=capture.read(frame);
if(!ret)break;
imshow("frame",frame);
roi.x=0;
frame.copyTo(result(roi));
cvtColor(frame,gray,COLOR_BGR2GRAY);

//calculateopticalflow
calcOpticalFlowPyrLK(old_gray,gray,pts[0],pts[1],status,err,Size(31,31),3,criteria,derivlambda,flags);

特征点状态检查与匹配的代码如下

size_ti,k;
for(i=k=0;i< pts[1].size(); i++)
{
    // 距离与状态测量
    double dist = abs(pts[0][i].x - pts[1][i].x) + abs(pts[0][i].y - pts[1][i].y);
    if (status[i] && dist >2){
pts[0][k]=pts[0][i];
initPoints[k]=initPoints[i];
pts[1][k++]=pts[1][i];
circle(frame,pts[1][i],3,Scalar(0,255,0),-1,8);
}
}
//resize有用特征点
pts[1].resize(k);
pts[0].resize(k);
initPoints.resize(k);

绘制跟踪轨迹的代码如下

//绘制跟踪轨迹
draw_lines(frame,initPoints,pts[1]);

该方法实现如下:

voiddraw_lines(Mat&image,vectorpt1,vectorpt2){
if(color_lut.size()< pt1.size()) {
        for (size_t t = 0; t < pt1.size(); t++) {
            color_lut.push_back(Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
        }
    }
    for (size_t t = 0; t < pt1.size(); t++) {
        line(image, pt1[t], pt2[t], color_lut[t], 2, 8, 0);
    }
}

运行效果:

左侧是视频的原始每一帧、右侧视频是每一帧中KLT算法实时轨迹绘制

车辆运行轨迹跟踪

2b7754b0-2a03-11ed-ba43-dac502259ad0.jpg



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 跟踪算法
    +关注

    关注

    0

    文章

    40

    浏览量

    12984
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40795
  • KLT
    KLT
    +关注

    关注

    0

    文章

    5

    浏览量

    7442

原文标题:干货 | OpenCV中KLT光流跟踪原理详解与代码演示

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    多目标跟踪算法总结归纳

    多目标跟踪是计算机视觉领域中的一个重要任务,它旨在从视频或图像序列中准确地检测和跟踪多个移动目标。不过在落地部署时,有一些关键点需要解决。
    的头像 发表于 04-28 09:42 86次阅读
    多目标<b class='flag-5'>跟踪</b><b class='flag-5'>算法</b>总结归纳

    详解从均值滤波到非局部均值滤波算法的原理及实现方式

    将再啰嗦一次,详解从均值滤波到非局部均值滤波算法的原理及实现方式。 细数主要的2D降噪算法,如下图所示,从最基本的均值滤波到相对最好的BM3D降噪,本文将尽量用最同属的语言,详解这些
    的头像 发表于 12-19 16:30 367次阅读

    基于自行车模型的路径跟踪控制算法

    2.1 基于自行车模型的路径跟踪控制算法 2.1.1 纯跟踪控制(Pure Pursuit)算法 纯追踪控制是最早提出的路径跟踪策略之一。由
    的头像 发表于 11-10 17:36 302次阅读
    基于自行车模型的路径<b class='flag-5'>跟踪</b>控制<b class='flag-5'>算法</b>

    PID算法详解及实例分析

    PID算法详解及实例分析#include using namespace std;struct _pid{   float SetSpeed; //定义设定值   float ActualSpeed
    发表于 11-09 16:33 0次下载

    CCV 2023 | SparseBEV:高性能、全稀疏的纯视觉3D目标检测器

    本文介绍在3D 目标检测领域的新工作:SparseBEV。我们所处的 3D 世界是稀疏的,因此稀疏 3D 目标检测是一个重要的发展方向。然而,现有的稀疏 3D 目标检测模型(如 DETR3D
    的头像 发表于 09-19 10:00 459次阅读
    CCV 2023 | SparseBEV:高性能、全<b class='flag-5'>稀疏</b>的纯视觉3D目标检测器

    Arm嵌入式跟踪宏单元体系结构规范ETMv4.0至ETMv4.6

    ETMv4跟踪单元通过生成跟踪元素来跟踪处理元素或PE的执行。 ETMv4体系结构定义了从PE的执行生成这些跟踪元素。 ETMv4跟踪单元可
    发表于 08-11 07:59

    目标跟踪初探(DeepSORT)

    目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,上面的视频是DeepSORT对人群进行跟踪
    的头像 发表于 08-07 15:37 419次阅读
    目标<b class='flag-5'>跟踪</b>初探(DeepSORT)

    3D点云目标跟踪中常见的评价指标和代码详解

    3D点云目标跟踪的评价指标,可以根据跟踪的目标是单个还是多个,分为单目标跟踪(SOT)和多目标跟踪(MOT)两种。一般来说,SOT的评价指标主要关注
    发表于 08-02 12:38 761次阅读

    Armv7和Armv8系统中跟踪的高级视图详解

    本指南主要介绍Armv7系统和Armv8系统中跟踪的高级视图,最高可达Armv8.4版本。 该指南涵盖: •跟踪是什么以及如何使用 •跟踪体系结构是如何定义的,以及它如何映射到不同的跟踪
    发表于 08-02 06:11

    什么是稀疏阵列天线 稀疏相控阵天线优点

    稀疏阵列天线(Sparse Array Antenna)是一种天线系统,其中天线元件按照非均匀、稀疏的方式进行排列。相比于传统的密集阵列天线,稀疏阵列天线可以在保持较高性能的同时减少天线的数量。
    的头像 发表于 07-11 15:06 2493次阅读

    [源代码]Python算法详解

    [源代码]Python算法详解[源代码]Python算法详解
    发表于 06-06 17:50 0次下载

    自动驾驶4WS车辆路径跟踪最优控制算法仿真

    针对自动驾驶车辆高速主动转向工况下传统的控制算法的控制效果容易出现较多的超调量和较长调节时间的问题,提出了基于 车辆动力学模型的轨迹预测跟踪主动转向控制算法,并基于轮胎侧偏刚度非线性的特性
    发表于 06-02 11:51 0次下载
    自动驾驶4WS车辆路径<b class='flag-5'>跟踪</b>最优控制<b class='flag-5'>算法</b>仿真

    如何对spmv算法进行优化

    主要是介绍 如何对spmv算法进行优化 。Spmv,即稀疏化的矩阵向量乘操作,关于稠密的矩阵向量乘操作,已经在上一篇文章中介绍过了。关于稀疏kernel的优化,是CUDA优化中最难的一部分,其难度
    的头像 发表于 05-25 09:05 792次阅读
    如何对spmv<b class='flag-5'>算法</b>进行优化

    SDMNet:大规模激光雷达点云配准的稀疏到稠密匹配网络

    为了处理上述的问题,我们提出了SDMNet,一种新的由稀疏到密集的针对大规模室外点云的配准方法。稀疏到稠密匹配方案如图1(c)所示。具体而言,我们将配准问题分为两个阶段,即稀疏匹配阶段和局部稠密匹配阶段。在
    的头像 发表于 05-24 15:53 657次阅读
    SDMNet:大规模激光雷达点云配准的<b class='flag-5'>稀疏</b>到稠密匹配网络

    LED虚拟拍摄中的跟踪系统详解

    跟踪设备与其他三维渲染系统集成方面,根据跟踪数据使用的场景或阶段不同,可以将系统管线分为实时和后期两个阶段。在实时阶段,跟踪设备软件端可以通过插件与第三方DCC(Digital Content
    的头像 发表于 05-10 17:09 277次阅读