Opencv光流运动物体追踪详解
作者:-牧野- 发布时间:2023-06-21 11:55:31
标签:Opencv,物体追踪
光流的概念是由一个叫Gibson的哥们在1950年提出来的。它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。那么所说的光流到底是什么?
简单来说,上图表现的就是光流,光流描述的是图像上每个像素点的灰度的位置(速度)变化情况,光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。
光流法的前提假设:
(1)相邻帧之间的亮度恒定;
(2)相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”;
(3)保持空间一致性;即,同一子图像的像素点具有相同的运动;
Opencv中金字塔LK光流实现:
#include "highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/video/tracking.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat image1,image2;
vector<Point2f> point1,point2,pointCopy;
vector<uchar> status;
vector<float> err;
int main(int argc,char *argv[])
{
VideoCapture video(argv[1]);
double fps=video.get(CV_CAP_PROP_FPS); //获取视频帧率
double pauseTime=1000/fps; //两幅画面中间间隔
video>>image1;
Mat image1Gray,image2Gray;
cvtColor(image1,image1Gray,CV_RGB2GRAY);
goodFeaturesToTrack(image1Gray,point1,100,0.01,10,Mat());
pointCopy=point1;
for(int i=0;i<point1.size();i++) //绘制特征点位
{
circle(image1,point1[i],1,Scalar(0,0,255),2);
}
namedWindow("角点特征光流",0);
imshow("角点特征光流",image1);
while(true)
{
video>>image2;
if(!image2.data||waitKey(pauseTime)==27) //图像为空或Esc键按下退出播放
{
break;
}
cvtColor(image2,image2Gray,CV_RGB2GRAY);
calcOpticalFlowPyrLK(image1Gray,image2Gray,point1,point2,status,err,Size(20,20),3); //LK金字塔
for(int i=0;i<point2.size();i++)
{
circle(image2,point2[i],1,Scalar(0,0,255),2);
line(image2,pointCopy[i],point2[i],Scalar(255,0,0),2);
}
imshow("角点特征光流",image2);
swap(point1,point2);
image1Gray=image2Gray.clone();
}
return 0;
}
图像跟踪结果1:
图像跟踪结果2:
视频流跟踪:
来源:http://blog.csdn.net/dcrmg/article/details/52684477


猜你喜欢
- FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayo
- 在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结
- Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Andro
- 目录登陆界面的实现登陆界面代码Login类login的监听类 LoginListener聊天界面运行图Client类代码Server代码登陆
- 文章目录 简介增量构建自定义inputs和outputs运行时API隐式依赖输入校验自定义缓存方法输入归一化其他使用技巧简介在我们使用的各种
- C#中Description特性主要用于枚举和属性,方法比较简单,记录一下以便后期使用。扩展类DescriptionExtension代码如
- 一.mybatis的配置1.1 添加相应的jar包在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在lib文件夹下面加
- Android-Room数据库(介绍)前言在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对
- 一、Android Studio 主题的设置1.1 设置Android Studio 自带的主题及包名字体大小1.2 导入第三方主题:下载了
- 1.二叉树的概念及结构 ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二
- 最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快排查步骤1.
- Spring Boot CLI是Spring Boot项目提供的一个用于快速运行Spring Boot应用的命令行工具,通过结合Groovy
- LinkedList与ArrayList都是List接口的具体实现类。LinkedList与ArrayList在功能上也是大体一致,但是因为
- GlobalLock的作用对于某条数据进行更新操作,如果全局事务正在进行,当某个本地事务需要更新该数据时,需要使用@GlobalLock确保
- Hook是一种思想,也就是将原来的事件,替换到我们自己的事件,方便我们做一些切入处理。目的是不修改原来的代码,同时也避免遗漏的N多类里面处理
- 一、需求:标题可能写的不够全部,下面来看下图片,大家就明白是什么意思了。视频与票的图标跟在标题后面显示,当标题过长时icon显示到省略号…后
- 1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面:方法的多态性:重载与覆写1 重载:同一个方法名称,根据参数类型以及个数完成
- 说明:基于atguigu学习笔记。在了解spring boot自动配置原理前,再来了解下两个注解@Import注解和@Conditional
- Android SDK已经提供有进度条组件ProgressDialog组件,但用的时候我们会发现可能风格与我们应用的整体风格不太搭配,而且P
- 一、AXIS调用远程WebService,以国内手机号归属地查询为例 1、wsdl地址:http://ws.webxml.com.