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

    文章

    41

    浏览量

    13215
  • OpenCV
    +关注

    关注

    33

    文章

    651

    浏览量

    44398
  • KLT
    KLT
    +关注

    关注

    0

    文章

    5

    浏览量

    7573

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    天合跟踪携手Elmya打造西班牙Mirabal伏电站项目

    )的Mirabal一期和二期伏电站项目提供开拓者1P智能跟踪解决方案。此次合作始于天合跟踪和Elmya既往项目建立的信任,并进一步巩固了天合跟踪作为其长期技术合作伙伴的地位,充分印证
    的头像 发表于 10-29 09:24 487次阅读

    自动驾驶中如何将稀疏地图与视觉SLAM相结合?

    [首发于智驾最前沿微信公众号]在自动驾驶场景中,稀疏地图通常是由一系列关键帧和若干三维稀疏特征点构成的地图,每个特征点包含三维坐标和描述外观的描述子;而视觉SLAM是运行在车辆上的实时算法,它一边
    的头像 发表于 10-28 09:07 455次阅读
    自动驾驶中如何将<b class='flag-5'>稀疏</b>地图与视觉SLAM相结合?

    天合跟踪再获乌兹别克斯坦纳沃伊363MW伏支架订单

    近日,天合跟踪宣布与中能建海外投资有限公司正式签署乌兹别克斯坦纳沃伊363.48MW伏电站跟踪支架供应协议。这标志着天合跟踪在乌兹别克斯坦市场累计订单规模突破千兆瓦大关,以丰富的项目
    的头像 发表于 10-22 11:32 866次阅读

    【开发实例】基于GM-3568JHF开发板安装OpenCV并使用视频目标跟踪 ( CamShift)

    在计算机视觉领域,视频目标跟踪是一个非常重要的任务。视频目标跟踪广泛应用于监控、自动驾驶、人机交互等多个领域。OpenCV提供了多种目标跟踪算法,其中MeanShift和CamShif
    的头像 发表于 09-02 08:04 457次阅读
    【开发实例】基于GM-3568JHF开发板安装OpenCV并使用视频目标<b class='flag-5'>跟踪</b> ( CamShift)

    【GM-3568JHF开发板免费体验】OpenCV 视频目标跟踪 ( CamShift)

    一、基本理论 在计算机视觉领域,视频目标跟踪是一个非常重要的任务。视频目标跟踪广泛应用于监控、自动驾驶、人机交互等多个领域。OpenCV 提供了多种目标跟踪算法,其中 MeanShif
    发表于 08-09 13:19

    同步电机在位置随动系统中跟踪误差的分析与研究

    跟踪最终位置过程的不确定性和传统PID控制器超调量大,调节时间长的缺点,设计了Fuzzy-LQR-PD控制算法来提高位置跟踪精度,通过Matlab软件对该算法进行仿真,并由STEP7编
    发表于 06-23 07:07

    SVPWM的原理及法则推导和控制算法详解

    ,而且使直流母线电压的利用率有了很大提高,且更易于实现数字化。下面将对该算法进行详细分析阐述。 文章过长,请点击下方可查阅*附件:SVPWM的原理及法则推导和控制算法详解.pdf
    发表于 03-14 14:51

    OpenVINO™ Toolkit中如何保持模型稀疏性?

    OpenVINO™ Toolkit 中支持的优化方法,保持模型稀疏性。
    发表于 03-06 06:47

    字节豆包大模型团队提出稀疏模型架构

    字节跳动豆包大模型Foundation团队近期研发出UltraMem,一种创新的稀疏模型架构,旨在解决推理过程中的访存问题,同时确保模型效果不受影响。
    的头像 发表于 02-13 15:25 1009次阅读

    字节豆包大模型团队推出UltraMem稀疏架构

    字节跳动豆包大模型Foundation团队近期在稀疏模型架构领域取得了新突破,提出了一种名为UltraMem的新型架构。这一架构通过将计算和参数解耦,成功解决了模型推理过程中的访存问题,为大规模模型
    的头像 发表于 02-13 11:17 1057次阅读

    SM73201 DC-ARC-EVAL伏电弧检测的具体算法是什么?

    SM73201 DC-ARC-EVAL伏电弧检测的具体算法是什么?求大神指教!
    发表于 02-08 06:14

    伏无人机巡检系统功能详解

    伏无人机巡检系统功能详解 随着伏能源在全球范围内的广泛应用,确保伏电站的高效运行和长期稳定输出变得至关重要。传统的人工巡检方式不仅效率低下、成本高昂,而且难以覆盖大面积的
    的头像 发表于 01-16 17:10 714次阅读
    <b class='flag-5'>光</b>伏无人机巡检系统功能<b class='flag-5'>详解</b>

    王欣然教授团队提出基于二维材料的高效稀疏神经网络硬件方案

    two-dimensional semiconductor ferroelectric field-effect transistors”为题发表最新研究进展,报道了基于二维材料的高效稀疏神经网络硬件解决方案
    的头像 发表于 01-13 10:41 877次阅读
    王欣然教授团队提出基于二维材料的高效<b class='flag-5'>稀疏</b>神经网络硬件方案

    DAC1280 TDATA引脚输入的比特,怎么产生这个比特算法是什么?

    我想请问下关于DAC1280的TDATA引脚输入的比特的问题: 1,怎么产生这个比特算法是什么? 2,怎么控制输出信号的频率? 对您的回答感激不尽,谢谢。
    发表于 01-06 06:21

    天合跟踪受邀参加2024伏行业年度大会

    近日,由中国光伏行业协会举办的 2024伏行业年度大会在四川宜宾盛大开幕。会议邀请行业主管部门,行业组织、专家、伏企业领袖等一同就行业发展热点问题进行深度探讨解析,天合跟踪智能控制系统研发负责人孙凯博士应邀出席
    的头像 发表于 12-12 11:04 790次阅读