帧差法侦测运动目标

  1 #include<iostream>
  2 #include<opencv2\core\core.hpp>
  3 #include<opencv2\highgui\highgui.hpp>
  4 #include<opencv2\imgproc\imgproc.hpp>
  5 using namespace std;
  6 using namespace cv;
  7
  8 const unsigned char FORE_GROUD = 255;
  9 int thresh = 30;
 10 int maxArea = 100;
 11 int times = 100;
 12
 13 Point getCenterPoint(Rect rect)
 14 {
 15     Point cpt;
 16     cpt.x = rect.x + cvRound(rect.width/2.0);
 17     cpt.y = rect.y + cvRound(rect.height/2.0);
 18     return cpt;
 19 }
 20
 21 int main(int argc,char*argv[])
 22 {
 23
 24     VideoCapture video(0);
 25
 26     //判断如果video是否可以打开
 27     if(!video.isOpened())
 28         return -1;
 29     cout<<"Opened"<<endl;
 30
 31     //用于保存当前帧的图片
 32     Mat currentBGRFrame;
 33
 34     //用来保存上一帧和当前帧的灰度图片
 35     Mat previousSecondGrayFrame;
 36     Mat previousFirstGrayFrame;
 37     Mat currentGaryFrame;
 38
 39     //保存两次的帧差
 40     Mat previousFrameDifference;//previousFrameFirst - previousFrameSecond的差分
 41     Mat currentFrameDifference;//currentFrame - previousFrameFirst;
 42
 43     //用来保存帧差的绝对值
 44     Mat absFrameDifferece;
 45
 46     //用来显示前景
 47     Mat previousSegmentation;
 48     Mat currentSegmentation;
 49     Mat segmentation;
 50
 51
 52     //显示前景
 53     namedWindow("segmentation",1);
 54     createTrackbar("阈值:","segmentation",&thresh,FORE_GROUD,NULL);
 55     createTrackbar("面积:","segmentation",&maxArea,FORE_GROUD,NULL);
 56
 57     //帧数
 58     int numberFrame = 0;
 59
 60     //形态学处理用到的算子
 61     Mat morphologyKernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
 62
 63     for(;;)
 64     {
 65         //读取当前帧
 66         video >> currentBGRFrame;
 67
 68         //判断当前帧是否存在
 69         if(!currentBGRFrame.data)
 70             continue;
 71
 72         numberFrame++;
 73         //颜色空间的转换
 74         cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);
 75
 76         if( numberFrame == 1)
 77         {
 78             //保存当前帧的灰度图
 79             previousSecondGrayFrame = currentGaryFrame.clone();
 80
 81             //显示视频
 82            imshow("video",currentBGRFrame);
 83             continue;
 84         }
 85         else if( numberFrame == 2)
 86         {
 87             //保存当前帧的灰度图
 88             previousFirstGrayFrame = currentGaryFrame.clone();
 89
 90             //previousFirst - previousSecond
 91             subtract(previousFirstGrayFrame,previousSecondGrayFrame,previousFrameDifference,Mat(),CV_16SC1);
 92
 93             //取绝对值
 94             absFrameDifferece = abs(previousFrameDifference);
 95
 96             //位深的改变
 97             absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);
 98
 99             //阈值处理
100             threshold(absFrameDifferece,previousSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);
101
102             //显示视频
103            imshow("video",currentBGRFrame);
104             continue;
105         }
106
107         else
108         {
109             //src1-src2
110             //subtract(currentGaryFrame,previousFirstGrayFrame,currentFrameDifference,Mat(),CV_16SC1);
111
112             //取绝对值
113             //absFrameDifferece = abs(currentFrameDifference);
114             absdiff(currentGaryFrame,previousFirstGrayFrame,absFrameDifferece);
115
116             //位深的改变
117             absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);
118
119             //阈值处理
120             threshold(absFrameDifferece,currentSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);
121
122             //与运算
123             bitwise_and(previousSegmentation,currentSegmentation,segmentation);
124
125             //中值滤波
126             medianBlur(segmentation,segmentation,3);
127
128             //形态学处理(开闭运算)
129             //morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);
130             morphologyEx(segmentation,segmentation,MORPH_CLOSE,morphologyKernel,Point(-1,-1),2,BORDER_REPLICATE);
131
132
133             //找边界
134             vector< vector<Point> > contours;
135             vector<Vec4i> hierarchy;
136             //复制segmentation
137             Mat tempSegmentation = segmentation.clone();
138             findContours( segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//CV_RETR_TREE
139             vector< vector<Point> > contours_poly( contours.size() );
140
141             /*存储运动物体*/
142             Rect rect = Rect(0,0,0,0);
143             vector<Rect> boundRect;
144             boundRect.clear();
145
146             //画出运动物体
147             for(unsigned int index = 0;index < contours.size() ;index++)
148             {
149                 approxPolyDP( Mat(contours[index]), contours_poly[index], 3, true );
150                 Rect tmprect =  boundingRect( Mat(contours_poly[index]) );
151                 //cout<<getCenterPoint(rect)<<endl;
152                 int currentArea = tmprect.area();
153                 if( currentArea >= rect.area() && currentArea >= maxArea*times )
154                     rect = tmprect;
155             }
156             rectangle(currentBGRFrame,rect,Scalar(0,255,255),2);
157
158             //显示视频
159             imshow("video",currentBGRFrame);
160
161            //前景检测
162             imshow("segmentation",segmentation);
163
164             //保存当前帧的灰度图
165             previousFirstGrayFrame = currentGaryFrame.clone();
166
167             //保存当前的前景检测
168             previousSegmentation = currentSegmentation.clone();
169         }
170
171         if(waitKey(33) == ‘q‘)
172             break;
173
174     }
175     return 0;
176 }
时间: 2024-10-10 09:11:06

帧差法侦测运动目标的相关文章

【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割

本文链接:https://blog.csdn.net/qq_18234121/article/details/82763385 作者:冻人的蓝鲸梁思成 视频分割算法可以从时域和空域两个角度考虑.时域分割算法利用视频流时域连续性,通过 相邻帧的时域变化来检测运动目标.在摄像头静止的情况下,常用的方法有帧差法和减背景法. 帧差法比较直观实用,对光照的变化干扰不敏感,但是 对目标的检测不准确,对于缓慢运动的目标甚至可 能无法提取出目标边界,对于快速运动的目标提取 出的目标区域又过大.减背景法容易得到目

三帧帧差法改进——使用循环队列减少深拷贝

使用循环队列的三帧帧差法 帧差法是背景减图法中的一种,只不过是帧差法不需要建模,因为它的背景模型就是上一帧的图,所以速度非常快.对于帧差法的"双影"现象,有人提出来了三帧差法.其原理如下所示: 1. 由I(t) - I(t-1)得到前景图   F1 2. 由I(t+1) - I(t)得到前景图  F2 3.  F1 ∩ F2得到前景图        F3 为了减少图像深拷贝带来的时间开销,我使用了一个储存三帧图像的循环队列,只需调整队首.队尾指针,就可以定位相对的前.中.后三帧,避免直

11 帧差法获取运动

帧差法 三帧差法 录频工具转gif #include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/imgproc.hpp" using namespace cv; int main(int argc, char *argv[]) { VideoCapture videoCap(0); if (!videoCap.isOpened()) { return -1;

OpenCV运动目标检测——帧间差,混合高斯模型方法

一.简单的帧间差方法 帧差法是在连续的图像序列中两个或三个相邻帧间采用基于像素的时间差分并且闽值化来提取图像中的运动区域. 代码: int _tmain(int argc, _TCHAR* argv[]) { VideoCapture capture("bike.avi"); if(!capture.isOpened()) return -1; double rate = capture.get(CV_CAP_PROP_FPS); int delay = 1000/rate; Mat

对这个运动目标检测方法实现的结果A Hybrid Algorithm for Moving Object Detection

最近在做烟火检测,需要用到运动检测,看到论文A System for Video Surveillance and Monitoring中的A Hybrid Algorithm for Moving Object Detection这个方法,我用opencv将其实现,代码下面会贴出,但是其的到的结果很差,不知道代码哪里出了问题,请高手给予指点,谢谢! 左图为原图,有图为用上面论文中的方法得到前景图像,[自己的代码可能写错了,请大神们给予指点谢谢] 代码如下: #include <stdio.h>

运动目标检测跟踪各过程算法综述

运动目标检测跟踪各过程算法综述 图像预处理数字图像中的几种典型噪声有:高斯噪声来源于电子电路噪声和低照明度或高温带来的传感器噪声:椒盐噪声类似于随机分布在图像上的胡椒和盐粉微粒,主要由图像切割引起或变换域引起的误差:加性噪声是图像在传输中引进的信道噪声.一般来说,引入的都是加性随机噪声,可以采用均值滤波.中值滤波.高斯滤波等方法去除噪声,提高信噪比.均值滤波在噪声分布较平均,且峰值不是很高的情况下能够得到较好的应用:中值滤波对尖脉冲噪声的滤除有较好的效果,并且能突出图像的边缘和细节:高斯滤波对滤

opencv学习---运动目标(前景)检测

opencv学习---运动目标(前景)检测 1.帧差法 原理:视频序列相邻两帧或三帧间采用基于像素的时间差分,通过闭值化来提取出图像中的运动区域. 优点:算法简单.计算量小,无需训练背景,对缓慢变换的光照不是很敏感. 缺点:容易受天气.阴影及杂乱背景干扰,阈值T的选择相当关键,稳定性差. 2.背景差分法 原理:用背景的参数模型来近似背景图像,将当前帧与背景图像进行差分比较实现对运动区域的检测 优点:计算量小,较高的实时性,利用已有帧信息进行背景动态更新 缺点:如何建立对于不同场景的动态变化均具有

计算机视觉目标跟踪的算法分类

摘自百度百科............. (1)基于区域的跟踪算法 基于区域的跟踪算法基本思想是:将目标初始所在区域的图像块作为目标模板,将目标模板与候选图像中所有可能的位置进行相关匹配,匹配度最高的地方即为目标所在的位置.最常用的相关匹配准则是差的平方和准则,(Sum of Square Difference,SSD). 起初,基于区域的跟踪算法中所用到的目标模板是固定的,如 Lucas 等人提出 Lucas-Kanade 方法,该方法利用灰度图像的空间梯度信息寻找最佳匹配区域,确定目标位置.之

[综]前景检测GMM

tornadomeet 前景检测算法_4(opencv自带GMM) http://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531705.html 前面已经有3篇博文介绍了背景减图方面相关知识(见下面的链接),在第3篇博文中自己也实现了gmm简单算法,但效果不是很好,下面来体验下opencv自带2个gmm算法. opencv实现背景减图法1(codebook和平均背景法) http://www.cnblogs.com/tornadomeet/