OpenCV 学习笔记(11)【OpenCV】光流场方法标出前景(运动)和背景(静止)
用光流场方法,标出前景(运动)和背景(静止)。
环境:VS2017 + OpenCV3.4.1
光流场介绍可以参见英文版学习OpenCV3的第17章Tracking
英文原版学习OpenCV3下载链接
https://download.csdn.net/download/iefenghao/11194776
视频测试
步骤
(1)打开视频
(2)转为灰度图
(3)光流检测,标出前景
- #include <iostream>
- #include "opencv2/opencv.hpp"
- using namespace cv;
- using namespace std;
- #define UNKNOWN_FLOW_THRESH 1e9
- void makecolorwheel(vector<Scalar> &colorwheel)
- {
- int RY = 15;
- int YG = 6;
- int GC = 4;
- int CB = 11;
- int BM = 13;
- int MR = 6;
- int i;
- for (i = 0; i < RY; i++) colorwheel.push_back(Scalar(255, 255 * i / RY, 0));
- for (i = 0; i < YG; i++) colorwheel.push_back(Scalar(255 - 255 * i / YG, 255, 0));
- for (i = 0; i < GC; i++) colorwheel.push_back(Scalar(0, 255, 255 * i / GC));
- for (i = 0; i < CB; i++) colorwheel.push_back(Scalar(0, 255 - 255 * i / CB, 255));
- for (i = 0; i < BM; i++) colorwheel.push_back(Scalar(255 * i / BM, 0, 255));
- for (i = 0; i < MR; i++) colorwheel.push_back(Scalar(255, 0, 255 - 255 * i / MR));
- }
- void motionToColor(Mat flow, Mat &color)
- {
- if (color.empty())
- color.create(flow.rows, flow.cols, CV_8UC3);
- static vector<Scalar> colorwheel; //Scalar r,g,b
- if (colorwheel.empty())
- makecolorwheel(colorwheel);
- // determine motion range:
- float maxrad = -1;
- // Find max flow to normalize fx and fy
- for (int i = 0; i < flow.rows; ++i)
- {
- for (int j = 0; j < flow.cols; ++j)
- {
- Vec2f flow_at_point = flow.at<Vec2f>(i, j);
- float fx = flow_at_point[0];
- float fy = flow_at_point[1];
- if ((fabs(fx) > UNKNOWN_FLOW_THRESH) || (fabs(fy) > UNKNOWN_FLOW_THRESH))
- continue;
- float rad = sqrt(fx * fx + fy * fy);
- maxrad = maxrad > rad ? maxrad : rad;
- }
- }
- for (int i = 0; i < flow.rows; ++i)
- {
- for (int j = 0; j < flow.cols; ++j)
- {
- uchar *data = color.data + color.step[0] * i + color.step[1] * j;
- Vec2f flow_at_point = flow.at<Vec2f>(i, j);
- float fx = flow_at_point[0] / maxrad;
- float fy = flow_at_point[1] / maxrad;
- if ((fabs(fx) > UNKNOWN_FLOW_THRESH) || (fabs(fy) > UNKNOWN_FLOW_THRESH))
- {
- data[0] = data[1] = data[2] = 0;
- continue;
- }
- float rad = sqrt(fx * fx + fy * fy);
- float angle = atan2(-fy, -fx) / CV_PI;
- float fk = (angle + 1.0) / 2.0 * (colorwheel.size() - 1);
- int k0 = (int)fk;
- int k1 = (k0 + 1) % colorwheel.size();
- float f = fk - k0;
- //f = 0; // uncomment to see original color wheel
- for (int b = 0; b < 3; b++)
- {
- float col0 = colorwheel[k0][b] / 255.0;
- float col1 = colorwheel[k1][b] / 255.0;
- float col = (1 - f) * col0 + f * col1;
- if (rad <= 1)
- col = 1 - rad * (1 - col); // increase saturation with radius
- else
- col *= .75; // out of range
- data[2 - b] = (int)(255.0 * col);
- }
- }
- }
- }
- int main(int, char**)
- {
- VideoCapture cap;
- //cap.open(0);
- cap.open("srcVideo.mp4");
- if (!cap.isOpened())
- return -1;
- Mat prevgray, gray, flow, cflow, frame;
- Mat motion2color;
- for (;;)
- {
- double t = (double)cvGetTickCount();
- cap >> frame;
- cvtColor(frame, gray, CV_BGR2GRAY);
- imshow("src 1210", frame);
- if (prevgray.data)
- {
- calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
- motionToColor(flow, motion2color);
- imshow("dst 1210", motion2color);
- }
- if (waitKey(10) >= 0)
- break;
- std::swap(prevgray, gray);
- t = (double)cvGetTickCount() - t;
- cout << "cost time: " << t / ((double)cvGetTickFrequency()*1000.) << endl;
- }
- return 0;
- }
OpenCV 学习笔记(11)【OpenCV】光流场方法标出前景(运动)和背景(静止)的更多相关文章
- OpenCV学习笔记(11)——Canny边缘检测
了解Canny边缘检测的概念 1.原理 Canny边缘检测是一种非常流行的边缘检测算法,是 John F.Canny在1986年提出的.它是一个有很多步构成的算法 1)噪声去除 使用5*5的高斯滤波器 ...
- [OpenCV学习笔记1][OpenCV基本数据类型]
CvPoint基于二维整形坐标轴的点typedef struct CvPoint{int x; /* X 坐标, 通常以 0 为基点 */int y; /* y 坐标,通常以 0 为基点 */}CvP ...
- 第十七周 - OpenCV 学习笔记 S1 - OpenCV 基本函数
Imread()函数: 基本功能:读取图像到OpenCv中. 1.函数原型: Mat imwrite(const strings& filename, int flag = 1); 第一个参数 ...
- OpenCV学习笔记(12)——OpenCV中的轮廓
什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- OpenCV 学习笔记 02 使用opencv处理图像
1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...
- opencv 学习笔记集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
随机推荐
- 开源分布式数据库中间件 DBLE
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”:以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持: DBLE官方网站:https://openso ...
- Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考
Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之 ...
- PHP 将字符串中的数字转化为数组
$str ='现在是2019年11月18日下午17点25分';$result='';$arr=[];for($i=0;$i<strlen($str);$i++){ if(is_numeric($ ...
- Linux学习笔记之LVM基本应用,扩展及缩减实现
0x00 LVM概述 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘 ...
- map集合转set集合
import java.util.*; //Map集合的迭代器输出,先将Map集合变为Set集合,再使用Iterator迭代器 public class Java_collection { publi ...
- [转]Python实现字符串反转的几种方法
#第一种:使用字符串切片 result = s[::-1] #第二种:使用列表的reverse方法 l = list(s) l.reverse() result = "".join ...
- 【Mysql技术内幕InnoDB存储引擎】读书笔记
一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...
- JavaWeb第三天--JavaScript
JavaScript 1. JavaScript概述 1.1 JavaScript是什么?有什么作用? HTML:就是用来写网页的.(人的身体) CSS:就是用来美化页面的.(人的衣服) JavaSc ...
- 输入url之后经历什么?
一.浏览器查找输入域名的IP地址(拿到 IP) 1.查找浏览器缓存(浏览器一般会缓存DNS记录一段时间,一般为2-30分钟). 2.查找系统缓存(即hosts文件,有没有对应的IP) 3.以上都没有的 ...
- Java集合学习(8):LinkedList
一.概述 LinkedList和ArrayList一样,都实现了List接口,但其内部的数据结构有本质的不同.LinkedList是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比Ar ...