光流的概念是由一个叫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:

视频流跟踪:

Opencv光流运动物体追踪的更多相关文章

  1. 【转】opencv检测运动物体的基础_特征提取

    特征提取是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连 ...

  2. (转)python+opencv实现动态物体追踪

    原文链接:https://blog.csdn.net/cike14/article/details/50649811 import cv2 import numpy as np camera=cv2. ...

  3. 【图像处理】openCV光流法追踪运动物体

    openCV光流法追踪运动物体 email:chentravelling@163.com 一.光流简单介绍 摘自:zouxy09 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观 ...

  4. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

  5. 利用opencv进行移动物体检测

    进行运动物体检测就是将动态的前景从静态的背景中分离出来.将当前画面与假设是静态背景进行比较发现有明显的变化的区域,就可以认为该区域出现移动的物体.在实际情况中由于光照阴影等因素干扰比较大,通过像素直接 ...

  6. ROS-opencv-人脸识别-物体追踪-二维码识别

    前言:人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术.用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做 ...

  7. Opencv颜色识别与追踪

    这是基于颜色识别的物体追踪 不废话 直接看代码 这是Opencv3的代码 //---------------------------------[头文件.命名空间包含部分]-------------- ...

  8. 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

    前言 今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEW AI视觉工具包(非NI Vision)下载与安装教程中下载 一.物体识别 ...

  9. opencv学习之路(36)、运动物体检测(一)

    一.简介 二.背景减法 图片说明 #include "opencv2/opencv.hpp"using namespace cv; void main() { Mat img1 = ...

随机推荐

  1. pt支持的格式

  2. java 编程思想-java运算符--曾经不太明确的

    1.java 运算符 主要是逻辑运算符和按位运算符;移位运算符-name tecmint.txt 逻辑运算符:And(&&) ; OR(||);Not(!) 按位运算符:And(&am ...

  3. LaTeX indicator function(指示函数)(\mathbb {1} 不起作用)

    问题说明: \mathbb字符的空心化显示仅对字符有效,对数字无效. 解决方法: 使用 bbm 包 \documentclass{article} \usepackage{bbm} \begin{do ...

  4. 低成本开始互联网创业:探讨域名、服务器、CDN、邮箱等节流之道

    互联网创业一直是个热门话题,对这个问题我也有不断的思考. 今天,探讨下如何低成本开始互联网创业. 背景 愿意冒险去创业的同志,大多是"屌丝"而非"高富帅",大多 ...

  5. Java基础学习总结(28)——Java对各种排序算法的实现

    这里总结下各种排序算法的java实现 冒泡排序 public class BubbleSort { publicstaticint[] bubbleSort(int[] array) { if(arr ...

  6. 全面解析Activity的生命周期

    欢迎Follow我的GitHub, 关注我的CSDN. 在Android应用中, Activity是最重要的组件, 其生命周期(Lifecycle)被大家所熟知. 可是, 大家须要注意一些细节, 才干 ...

  7. C语言深度剖析-----函数与指针分析

    阅读代码的重要技巧 函数类型 函数指针 回调函数 使用示例 指针阅读技巧解析 例

  8. Launcher Activity在开机时重新启动两次解决的方法

    今天在看log的时候发现,Launcher activity会被onDestroy掉一次.然后再重新启动. 可能原因推測: 1.横竖屏切换 2.MCC MNC等Configuration改变引起的 M ...

  9. [React] Create an Auto Resizing Virtualized List with react-virtualized

    In this lesson we'll show how to use the AutoSizer component from react-virtualized to automatically ...

  10. [RxJS] Connection operator: multicast and connect

    We have seen how Subjects are useful for sharing an execution of an RxJS observable to multiple obse ...