github:https://github.com/MichaelBeechan

CSDN:https://blog.csdn.net/u011344545

===============================================================

* File: opticalFlow.cpp
* Brief: LK光流法做运动目标检测

#include "stdafx.h"
#include <opencv2/video/video.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <cstdio>using namespace std;
using namespace cv;void tracking(Mat &frame, Mat &output);
bool addNewPoints();
bool acceptTrackedPoint(int i);//-----------------------------------【全局变量声明】-----------------------------------------
// 描述:声明全局变量
//-------------------------------------------------------------------------------------------------
string window_name = "optical flow tracking";
Mat gray;
Mat gray_prev;
vector<Point2f> points[2];
vector<Point2f> initial;
vector<Point2f> features; // 检测的特征
int maxCount = 500; // 检测的最大特征数
double qLevel = 0.01; // 特征检测的等级
double minDist = 10.0; // 两特征点之间的最小距离
vector<uchar> status; // 跟踪特征的状态,特征的流发现为1,否则为0
vector<float> err;//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-------------------------------------------------------------------------------------------------
int main()
{Mat frame;
Mat result;VideoCapture capture("video1.avi");help();
if(capture.isOpened()) // 摄像头读取文件开关
{
while(true)
{
capture >> frame;if(!frame.empty())
{
tracking(frame, result);
}
else
{
printf(" --(!) No captured frame -- Break!");
break;
}int c = waitKey(50);
if( (char)c == 27 )
{
break;
}
}
}
return 0;
}//-------------------------------------------------------------------------------------------------
// function: tracking
// brief: 跟踪
// parameter: frame 输入的视频帧
//  output 有跟踪结果的视频帧
// return: void
//-------------------------------------------------------------------------------------------------
void tracking(Mat &frame, Mat &output)
{//此句代码的OpenCV3版为:
cvtColor(frame, gray, COLOR_BGR2GRAY);
//此句代码的OpenCV2版为:
//cvtColor(frame, gray, CV_BGR2GRAY);frame.copyTo(output);// 添加特征点
if (addNewPoints())
{
goodFeaturesToTrack(gray, features, maxCount, qLevel, minDist);
points[0].insert(points[0].end(), features.begin(), features.end());
initial.insert(initial.end(), features.begin(), features.end());
}if (gray_prev.empty())
{
gray.copyTo(gray_prev);
}
// l-k光流法运动估计
calcOpticalFlowPyrLK(gray_prev, gray, points[0], points[1], status, err);
// 去掉一些不好的特征点
int k = 0;
for (size_t i=0; i<points[1].size(); i++)
{
if (acceptTrackedPoint(i))
{
initial[k] = initial[i];
points[1][k++] = points[1][i];
}
}
points[1].resize(k);
initial.resize(k);
// 显示特征点和运动轨迹
for (size_t i=0; i<points[1].size(); i++)
{
line(output, initial[i], points[1][i], Scalar(0, 0, 255));
circle(output, points[1][i], 3, Scalar(0, 255, 0), -1);
}// 把当前跟踪结果作为下一此参考
swap(points[1], points[0]);
swap(gray_prev, gray);imshow(window_name, output);
}//-------------------------------------------------------------------------------------------------
// function: addNewPoints
// brief: 检测新点是否应该被添加
// parameter:
// return: 是否被添加标志
//-------------------------------------------------------------------------------------------------
bool addNewPoints()
{
return points[0].size() <= 10;
}//-------------------------------------------------------------------------------------------------
// function: acceptTrackedPoint
// brief: 决定哪些跟踪点被接受
// parameter:
// return:
//-------------------------------------------------------------------------------------------------
bool acceptTrackedPoint(int i)
{
return status[i] && ((abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y)) > 2);
}

光流 | OpenCV3实现LK Optical Flow(代码类)相关推荐

  1. CNN光流计算--FlowNet: Learning Optical Flow with Convolutional Networks

    FlowNet: Learning Optical Flow with Convolutional Networks ICCV2015 Code: https://lmb.informatik.uni ...

  2. 【光流评估】《Optical Flow Estimation using a Spatial Pyramid Network》2016 Tubingen, Germany

    摘要:我们通过结合深度学习和经典空间金字塔结构的方式来计算光流.通过使用每个金字塔级别的光流评估warp图像和更新光流,这种方法以一个粗到精的方式评估图像中的大运动.不同于在每个金字塔层级最小化对象函 ...

  3. 光流 | MATLAB实现HS Optical Flow(代码类)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================== ...

  4. 光流 | MATLAB实现 Brox Optical Flow(代码类)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 function [u, v] = ...

  5. 光流法 Optical Flow

    最近调研目标跟踪,看到一个光流法,测试了一下它的效果,挺好玩的,这里对找到的资料简单整理总结一下. 对于光流法的介绍,可以参看如下博客http://blog.csdn.net/zouxy09/arti ...

  6. matlab opticalflowlk,Optical Flow介绍与代码实现

    Optical Flow介绍与代码实现 介绍 首先我们先来介绍一下Optical Flow是个什么东西, 在浏览器的搜索框框里面我们输入"Optical flow"可以看到维基百科 ...

  7. HALCON:Optical Flow(光流法)

    HALCON:Optical Flow(光流法) 光流法基本原理 光流概念由Gibson在1950年首先提出来,它是一种简单实用的图像运动表达方式,通常定义为一个图像序列中图像亮度模式的表观运动,即空 ...

  8. H.266/VVC帧间预测技术学习:双向光流技术(Bi-directional optical flow, BDOF)

    双向光流技术(Bi-directional optical flow,BDOF ) VVC中采用了双向光流技术来修正双向预测的像素值.BDOF以前被称为BIO,包含在JEM参考软件中.与JEM中的版本 ...

  9. 计算机视觉--光流法(optical flow)简介

    光流法理论背景 1.什么是光流 光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度. 光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前 ...

最新文章

  1. linux awk命令
  2. c语言试题 改错题,精选二级C++试题 – 改错题
  3. java字符串的替换replace、replaceAll、replaceFirst的区别
  4. 华为软件编程规范和范例 可读性
  5. ipsec协议(转)
  6. No Team Selected:A team must be selected to run 'ProjectName' on iPhoneName
  7. C++基础知识学习笔记
  8. 二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法
  9. 计算机数据库原理试题,计算机科学与技术专业《数据库原理》模拟试题(B)
  10. 代码的简单就在于——直接能看懂
  11. 云原生数据库风起云涌,华为云GaussDB破浪前行
  12. 修改vCenter client无法连接
  13. 【Maven】Maven下载源码和Javadoc的方法
  14. python pygame鼠标点击_pygame系列_mouse鼠标事件
  15. (转载)《相信自己》
  16. 相似度计算方法(一) 皮尔森相关系数
  17. Excel自动获取单词音标词义
  18. 程序员心中的“女神”
  19. 计算机课对小学生的作用,小学信息技术课的最重要性
  20. 高薪程序员面试题精讲系列28之你熟悉哪些设计模式?

热门文章

  1. uvali5697(DP)
  2. 洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
  3. 电子老鼠闯迷宫pascal解题程序
  4. PKUWC2020游记与题面整理
  5. HDU 6155 Subsequence Count (DP、线性代数、线段树)
  6. 显示设备不属于微型计算机的外部设备,微型计算机常用外部设备试题解析
  7. 20220401 A满秩,B满秩,AB一定满秩
  8. post上传代码实现
  9. [批处理]自动设置本机系统代理服务器
  10. iOS开发 UIPanGestureRecognizer手势抽象类