/************************************************************************
* Copyright(c) 2011  Yang Xian
* All rights reserved.
*
* File: opticalFlow.cpp
* Brief: lk光流法做运动目标检测
* Version: 1.0
* Author: Yang Xian
* Email: xyang2011@sinano.ac.cn
* Date: 2011/11/18
* History:
************************************************************************///---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#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];    // point0为特征点的原来位置,point1为特征点的新位置
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("1.avi");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;}}}else{printf("there is no camera or video");system("pause");return false;}return 0;
}//-------------------------------------------------------------------------------------------------
// function: tracking
// brief: 跟踪
// parameter: frame 输入的视频帧
//            output 有跟踪结果的视频帧
// return: void
//-------------------------------------------------------------------------------------------------
void tracking(Mat &frame, Mat &output)
{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);
}

opencv 光流法相关推荐

  1. Opencv 光流法解析

    KLT 什么是光流以及如何求解光流(利用最小二乘法求解) locateROI adjustROI pyrUp pyrDown Opencv 光流法解析 ```cpp /** @brief Calcul ...

  2. 有关opencv光流法的解释

    1981年,Horn和Schunck创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.人们基于不同的理论基础提出各种光流计算方法,算法性能各有不同.Barron等人对多种光流 ...

  3. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  4. OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)...

    https://blog.csdn.net/shadow_guo/article/details/44312691 基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 1. 单目视觉三维重建问题 ...

  5. OpenCV3学习(11.2)LK光流法原理及opencv实现

    光流的概念:(Optical flow or optic flow) 它是一种运动模式,这种运动模式指的是一个物体.表面.边缘在一个视角下由一个观察者(比如眼睛.摄像头等)和背景之间形成的明显移动.光 ...

  6. OpenCV 使用光流法检测物体运动

    OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"// ...

  7. OpenCV之光流法运动目标跟踪

    [光流Optical Flow]的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一 ...

  8. python opencv入门 光流法(41)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 了解光流的概念,使用lucas-kanade估算方法 使用cv2.calcOpticalFlowPyrLK() 方法来追踪 ...

  9. python笛卡尔转换极坐标_[4] opencv: pythonDIS光流法与笛卡尔坐标转为极坐标

    [4] opencv: pythonDIS光流法与笛卡尔坐标转为极坐标 [4] opencv: pythonDIS光流法与笛卡尔坐标转为极坐标 目录1, 笛卡尔转为极坐标 2, DIS光流算法 1, ...

  10. Python与OpenCV(三)——基于光流法的运动目标检测程序分析

    光流的概念是指在连续的两帧图像当中,由于图像中的物体移动或者摄像头的移动而使得图像中的目标形成的矢量运动轨迹叫做光流.本质上光流是个向量场,表示了一个像素点从第一帧过渡到第二帧的运动过程,体现该像素点 ...

最新文章

  1. ftp无法显示服务器web文件夹,Web和Ftp服务器.ppt
  2. 【推荐软件】wingrep
  3. flink int序列化
  4. python编译环境 eclipse_eclipse搭建python编译环境
  5. Windows xp系统Hal.dll文件损坏的解决办法
  6. Atitit 代码要写的漂亮 老板要的是效率 冲怎么办突 目录 1. 代码要写高效,写漂亮,要考虑可扩展性和安全性,到了公司才发现老板要的是效率,不在乎你的代码写的是否高效,安全,是否具有可扩展性
  7. mysql负载均衡分区_利用分区和负载均衡获得更大更好的MySQL数据库[转载]
  8. 左程云代码java_《程序员代码面试指南》-左程云高清PDF+源代码
  9. Oracle12c CDB和PDB数据库的启动与关闭说明
  10. 单片机机器周期怎么计算公式_单片机机器周期的计算
  11. 计算机运行黑屏显示器正常,详细教您电脑主机运行正常显示器黑屏怎么办
  12. java怎么定位error_程序遇到错误定位一些小技巧
  13. 2066服务器芯片组,华硕发布三款LGA2066对应工作站主机板
  14. java生成和解析二维码实战——QRCode
  15. 罗永浩自曝下个创业项目是元宇宙
  16. 训练集、验证集、测试集划分
  17. 2022宁波市第五届网络安全大赛(初赛Misc部分)
  18. Python爬取门户论坛评论
  19. android 自定义 对号,Android 自定义View 对勾CheckBox
  20. IDEA中使用JUnit5(单元测试框架)

热门文章

  1. mysql dba环境验收_面对一个全新的环境,作为一个Mysql DBA,首先应该了解什么?
  2. 为什么家里pm25比外面高_夫妻感情很好,男人为什么还会找情人?这是我听过最好的答案...
  3. html设置隐藏窗口,html – 在窗口大小调整时逐个隐藏菜单项
  4. oracle集群启动状态,oracle 11g集群软件无法启动解决步骤
  5. linux 7启动xserver,linux7.x下配置nginx开机自启动
  6. eslint 保存自动修复_ESLint 自动修复问题之如何保留最后修改人信息
  7. EDMA - DMA QDMA
  8. gcc详解以及静态,动态库的生成 1
  9. 如何去除小程序button的边框
  10. 两部门:解除蒙古国部分地区口蹄疫疫情禁令