介绍

参考链接

在OpenCV中,光流分为稀疏光流和稠密光流,关于稀疏光流可以参考之前的文章
OpenCV之光流

稠密光流的解释,可以参考OpenCV官方文档

OpenCV提供了另一种算法来寻找密集的光流。它计算帧中所有点的光流。它基于Gunner Farneback的算法,该算法在Gunner法尔内巴克2003年的“基于多项式展开的双帧运动估计”中进行了解释。

其实稀疏光流和稠密光流的区别,见名知义,稀疏光流是跟踪部分点,而稠密光流跟踪的是全部的点。

实现

OpenCV中的API如下:

void cv::calcOpticalFlowFarneback(InputArray     prev,InputArray     next,InputOutputArray   flow,double     pyr_scale,int   levels,int  winsize,int     iterations,int  poly_n,double   poly_sigma,int  flags
)

参数解释

  • prev,前一帧8位单通道输入图像
  • next,当前帧图像,大小和类型与prev相同
  • flow,输出流图像,其大prev相同,类型为CV_32FC2
  • pyr_scale,指定为每个图像构建金字塔的图像比例(</1),pyr_scale=0.5表示经典金字塔,其中每一个下一层都比上一层小两倍
  • levels,金字塔层数(包括初始图像); levels = 1意味着不会创建额外的图层,只会使用原始图像
  • winsize,平均窗口大小;较大的值提高了算法对图像的鲁棒性,并可以检测更快速的运动,但会产生更模糊的运动场
  • iterations,每个金字塔等级上执行迭代算法的迭代次数。用于在每个像素中查找多项式展开的像素邻域;
  • poly_n,用于在每个像素中找到多项式展开的像素邻域的大小;较大的值意味着图像将近似于更平滑的表面,从而产生更多鲁棒算法和更模糊的运动场,通常poly_n=5或7
  • poly_sigma,于平滑导数的高斯的标准偏差,用作多项式展开的基础;对于poly_n = 5,可以设置poly_sigma = 1.1,对于poly_n = 7,可以设置poly_sigma = 1.5;
  • flags,操作标志,可取计算方法有:
    OPTFLOW_USE_INITIAL_FLOW 使用输入流作为初始流近似。
    OPTFLOW_FARNEBACK_GAUSSIAN 使用Gaussian winsize×winsiz过滤器代替光流估计的相同大小的盒子过滤器;通常情况下,这个选项可以比使用箱式过滤器提供更精确的流量,代价是速度更低;通常,应将高斯窗口的胜利设置为更大的值以实现相同的稳健性水平。

代码例子

官方例子,计算得到一个具有光流矢量(u,v)的双通道阵列。我们找到了它们的大小和方向。我们对结果进行颜色编码,以便更好地可视化。方向对应于图像的色调值。幅值对应于“值”平面。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>using namespace cv;
using namespace std;int main()
{VideoCapture capture("../vtest.avi");if (!capture.isOpened()){//error in opening the video inputcerr << "Unable to open file!" << endl;return 0;}Mat frame1, prvs;capture >> frame1;cvtColor(frame1, prvs, COLOR_BGR2GRAY);while(true){Mat frame2, next;capture >> frame2;if (frame2.empty())break;cvtColor(frame2, next, COLOR_BGR2GRAY);Mat flow(prvs.size(), CV_32FC2);calcOpticalFlowFarneback(prvs, next, flow, 0.5, 3, 15, 3, 5, 1.2, 0);// visualizationMat flow_parts[2];split(flow, flow_parts);Mat magnitude, angle, magn_norm;cartToPolar(flow_parts[0], flow_parts[1], magnitude, angle, true);normalize(magnitude, magn_norm, 0.0f, 1.0f, NORM_MINMAX);angle *= ((1.f / 360.f) * (180.f / 255.f));//build hsv imageMat _hsv[3], hsv, hsv8, bgr;_hsv[0] = angle;_hsv[1] = Mat::ones(angle.size(), CV_32F);_hsv[2] = magn_norm;merge(_hsv, 3, hsv);hsv.convertTo(hsv8, CV_8U, 255.0);cvtColor(hsv8, bgr, COLOR_HSV2BGR);imshow("frame2", bgr);imshow("img", prvs);int keyboard = waitKey(30);if (keyboard == 'q' || keyboard == 27)break;prvs = next;}
}

运行截图

OpenCV之稠密光流相关推荐

  1. OpenCV中稠密光流算法总结

    一.什么是光流 之前有一篇博客对光流做出了概念性的说明,可以参考:光流法-光流场估计概念 二.光流的基本算法 之前写了一篇博客介绍几个入门级的光流算法原理和推导,可以参考:经典光流计算方法(HS光流法 ...

  2. opencv 稀疏光流 稠密光流

    opencv 稀疏光流 稠密光流 demo: http://download.csdn.net/detail/keen_zuxwang/9860696 参看.学习文档: OpenCV学习笔记(七)Lu ...

  3. 稀疏光流和稠密光流,OpenCV实现

    # 参考:光流Optical Flow介绍与OpenCV实现_zouxy09的专栏-CSDN博客_opencv 光流 # 参考:光流(Optical Flow)算法原理及示例 # 参考:机器学习进阶- ...

  4. OpenCV视频分析与对象跟踪C++(二)光流对象跟踪-稀疏光流、稠密光流

    移动对象跟踪三要素:图像表示(跟踪的对象要在图像中出现)外光模型,移动模型. 稀疏光流跟踪,KTL void calcOpticalFlowPyrLK( // 稀疏光流跟踪,KLTInputArray ...

  5. opencv c++ 光流法、稀疏光流法、稠密光流法、均值迁移追踪(meanshift、camshift)

    1.概念 参考: (70条消息) 什么是光流法_张年糕慢慢走的博客-CSDN博客_光流法 (70条消息) 计算机视觉--光流法(optical flow)简介_T-Jhon的博客-CSDN博客_光流法 ...

  6. 3月18日 稠密光流FB,Deepflow,DIS,光流场的可视化

    文章目录 经典的光流 稠密光流----Farneback DeepMatching 稠密光流 DeepFlow 算法的具体步骤 DIS稠密逆搜索实现快速光流 CV Dis光流结果 备注 光流场的可视化 ...

  7. OpenCV中的光流及视频特征点追踪

    OpenCV中的光流及视频特征点追踪 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀 ...

  8. 干货 | OpenCV中KLT光流跟踪原理详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 稀疏光流跟踪(KLT)详解 在视频移动 ...

  9. 光流 | OpenCV中的光流有关函数

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 1. calcOpticalFlo ...

最新文章

  1. 3D-camera结构光原理
  2. dbcp2和dbcp 1.4在API层面的差异
  3. postgres创建用户,修改用户密码,创建数据库
  4. html vw自动跳到ie,CSS3动画/关键帧,在IE11问题中使用vw进行转换
  5. java platform_Java Platform Module系统中的可选依赖项
  6. UDP报文观测以及DNS的工作原理
  7. 大道至简java伪代码
  8. /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。
  9. java 与 php 区别或异同(整理、整合)
  10. tcpdump抓包分析
  11. 石灰窑计算机控制上料,石灰窑自动化控制系统
  12. OpenGL法线贴图
  13. WP Super Cache远程代码执行漏洞分析
  14. 【雕爷学编程】Arduino动手做(43)---单路继电器模块
  15. 二战企*查*查-企业-数-据爬虫
  16. 在ubuntu16.04中安装curl及遇到的问题
  17. java开发工具对比_Eclipse和STS哪个好_Java开发工具优缺点对比一览
  18. 意外被裁,逆境中意外面过阿里3+1,成功拿下阿里Java岗P6 offer
  19. Python3-Spyder-urllib.request抓取搜haohuo平台信息-保存到csv
  20. halcon垂足、轮廓平行线

热门文章

  1. sort排序中cmp()的用法
  2. 3DMM反射光线3D表达
  3. Windows自带宝藏便笺工具,很多人不知道,有效提高记忆力
  4. emlog pro去除未注册提示
  5. 针对LOGO的半透明图片的显示
  6. 资产管理软件使用方法
  7. (数据结构)C语言稀疏矩阵存储之三元组 —— 2022/3/25
  8. 数据格式_初识生信常见数据格式知多少?
  9. 想构建数字产品? 首先问自己这四个问题
  10. 浅谈 iOS Device ID 的修改