用光流场方法,标出前景(运动)和背景(静止)。

环境:VS2017 + OpenCV3.4.1

光流场介绍可以参见英文版学习OpenCV3的第17章Tracking

英文原版学习OpenCV3下载链接

https://download.csdn.net/download/iefenghao/11194776

视频测试

步骤

(1)打开视频

(2)转为灰度图

(3)光流检测,标出前景

  1. #include <iostream>
  2. #include "opencv2/opencv.hpp"
  3.  
  4. using namespace cv;
  5. using namespace std;
  6.  
  7. #define UNKNOWN_FLOW_THRESH 1e9
  8. void makecolorwheel(vector<Scalar> &colorwheel)
  9. {
  10. int RY = 15;
  11. int YG = 6;
  12. int GC = 4;
  13. int CB = 11;
  14. int BM = 13;
  15. int MR = 6;
  16.  
  17. int i;
  18.  
  19. for (i = 0; i < RY; i++) colorwheel.push_back(Scalar(255, 255 * i / RY, 0));
  20. for (i = 0; i < YG; i++) colorwheel.push_back(Scalar(255 - 255 * i / YG, 255, 0));
  21. for (i = 0; i < GC; i++) colorwheel.push_back(Scalar(0, 255, 255 * i / GC));
  22. for (i = 0; i < CB; i++) colorwheel.push_back(Scalar(0, 255 - 255 * i / CB, 255));
  23. for (i = 0; i < BM; i++) colorwheel.push_back(Scalar(255 * i / BM, 0, 255));
  24. for (i = 0; i < MR; i++) colorwheel.push_back(Scalar(255, 0, 255 - 255 * i / MR));
  25. }
  26.  
  27. void motionToColor(Mat flow, Mat &color)
  28. {
  29. if (color.empty())
  30. color.create(flow.rows, flow.cols, CV_8UC3);
  31.  
  32. static vector<Scalar> colorwheel; //Scalar r,g,b
  33. if (colorwheel.empty())
  34. makecolorwheel(colorwheel);
  35.  
  36. // determine motion range:
  37. float maxrad = -1;
  38.  
  39. // Find max flow to normalize fx and fy
  40. for (int i = 0; i < flow.rows; ++i)
  41. {
  42. for (int j = 0; j < flow.cols; ++j)
  43. {
  44. Vec2f flow_at_point = flow.at<Vec2f>(i, j);
  45. float fx = flow_at_point[0];
  46. float fy = flow_at_point[1];
  47. if ((fabs(fx) > UNKNOWN_FLOW_THRESH) || (fabs(fy) > UNKNOWN_FLOW_THRESH))
  48. continue;
  49. float rad = sqrt(fx * fx + fy * fy);
  50. maxrad = maxrad > rad ? maxrad : rad;
  51. }
  52. }
  53.  
  54. for (int i = 0; i < flow.rows; ++i)
  55. {
  56. for (int j = 0; j < flow.cols; ++j)
  57. {
  58. uchar *data = color.data + color.step[0] * i + color.step[1] * j;
  59. Vec2f flow_at_point = flow.at<Vec2f>(i, j);
  60.  
  61. float fx = flow_at_point[0] / maxrad;
  62. float fy = flow_at_point[1] / maxrad;
  63. if ((fabs(fx) > UNKNOWN_FLOW_THRESH) || (fabs(fy) > UNKNOWN_FLOW_THRESH))
  64. {
  65. data[0] = data[1] = data[2] = 0;
  66. continue;
  67. }
  68. float rad = sqrt(fx * fx + fy * fy);
  69.  
  70. float angle = atan2(-fy, -fx) / CV_PI;
  71. float fk = (angle + 1.0) / 2.0 * (colorwheel.size() - 1);
  72. int k0 = (int)fk;
  73. int k1 = (k0 + 1) % colorwheel.size();
  74. float f = fk - k0;
  75. //f = 0; // uncomment to see original color wheel
  76.  
  77. for (int b = 0; b < 3; b++)
  78. {
  79. float col0 = colorwheel[k0][b] / 255.0;
  80. float col1 = colorwheel[k1][b] / 255.0;
  81. float col = (1 - f) * col0 + f * col1;
  82. if (rad <= 1)
  83. col = 1 - rad * (1 - col); // increase saturation with radius
  84. else
  85. col *= .75; // out of range
  86. data[2 - b] = (int)(255.0 * col);
  87. }
  88. }
  89. }
  90. }
  91.  
  92. int main(int, char**)
  93. {
  94. VideoCapture cap;
  95. //cap.open(0);
  96. cap.open("srcVideo.mp4");
  97.  
  98. if (!cap.isOpened())
  99. return -1;
  100.  
  101. Mat prevgray, gray, flow, cflow, frame;
  102.  
  103. Mat motion2color;
  104.  
  105. for (;;)
  106. {
  107. double t = (double)cvGetTickCount();
  108.  
  109. cap >> frame;
  110. cvtColor(frame, gray, CV_BGR2GRAY);
  111. imshow("src 1210", frame);
  112.  
  113. if (prevgray.data)
  114. {
  115. calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
  116. motionToColor(flow, motion2color);
  117. imshow("dst 1210", motion2color);
  118. }
  119. if (waitKey(10) >= 0)
  120. break;
  121. std::swap(prevgray, gray);
  122.  
  123. t = (double)cvGetTickCount() - t;
  124. cout << "cost time: " << t / ((double)cvGetTickFrequency()*1000.) << endl;
  125. }
  126. return 0;
  127. }

  

OpenCV 学习笔记(11)【OpenCV】光流场方法标出前景(运动)和背景(静止)的更多相关文章

  1. OpenCV学习笔记(11)——Canny边缘检测

    了解Canny边缘检测的概念 1.原理 Canny边缘检测是一种非常流行的边缘检测算法,是 John F.Canny在1986年提出的.它是一个有很多步构成的算法 1)噪声去除 使用5*5的高斯滤波器 ...

  2. [OpenCV学习笔记1][OpenCV基本数据类型]

    CvPoint基于二维整形坐标轴的点typedef struct CvPoint{int x; /* X 坐标, 通常以 0 为基点 */int y; /* y 坐标,通常以 0 为基点 */}CvP ...

  3. 第十七周 - OpenCV 学习笔记 S1 - OpenCV 基本函数

    Imread()函数: 基本功能:读取图像到OpenCv中. 1.函数原型: Mat imwrite(const strings& filename, int flag = 1); 第一个参数 ...

  4. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  5. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  6. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  7. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  8. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  9. opencv 学习笔记集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

随机推荐

  1. 开源分布式数据库中间件 DBLE

    DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”:以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持: DBLE官方网站:https://openso ...

  2. Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考

    Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之 ...

  3. PHP 将字符串中的数字转化为数组

    $str ='现在是2019年11月18日下午17点25分';$result='';$arr=[];for($i=0;$i<strlen($str);$i++){ if(is_numeric($ ...

  4. Linux学习笔记之LVM基本应用,扩展及缩减实现

    0x00 LVM概述 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘 ...

  5. map集合转set集合

    import java.util.*; //Map集合的迭代器输出,先将Map集合变为Set集合,再使用Iterator迭代器 public class Java_collection { publi ...

  6. [转]Python实现字符串反转的几种方法

    #第一种:使用字符串切片 result = s[::-1] #第二种:使用列表的reverse方法 l = list(s) l.reverse() result = "".join ...

  7. 【Mysql技术内幕InnoDB存储引擎】读书笔记

    一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...

  8. JavaWeb第三天--JavaScript

    JavaScript 1. JavaScript概述 1.1 JavaScript是什么?有什么作用? HTML:就是用来写网页的.(人的身体) CSS:就是用来美化页面的.(人的衣服) JavaSc ...

  9. 输入url之后经历什么?

    一.浏览器查找输入域名的IP地址(拿到 IP) 1.查找浏览器缓存(浏览器一般会缓存DNS记录一段时间,一般为2-30分钟). 2.查找系统缓存(即hosts文件,有没有对应的IP) 3.以上都没有的 ...

  10. Java集合学习(8):LinkedList

    一.概述 LinkedList和ArrayList一样,都实现了List接口,但其内部的数据结构有本质的不同.LinkedList是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比Ar ...