opencv实现三帧差法解析

今天和大家谈谈三帧差法来实现运动目标检测吧,其中运动检测画框实现追踪方法多种多样,大家可以自行百度,后面我也会一一实现,今天我先给大家玩玩三帧差法吧;;;;(注释非常清楚哦,程序也极其简单的)

帧差法是最为常用的运动目标检测和分割方法之一,基本原理就是在图像序列相邻两帧或三帧间采用基于像素的时间差分通过闭值化来提取出图像中的运动区域。首先,将相邻帧图像对应像素值相减得到差分图像,然后对差分图像二值化,在环境亮度变化不大的情况下,如果对应像素值变化小于事先确定的阂值时,可以认为此处为背景像素:如果图像区域的像素值变化很大,可以认为这是由于图像中运动物体引起的,将这些区域标记为前景像素,利用标记的像素区域可以确定运动目标在图像中的位置。由于相邻两帧间的时间间隔非常短,用前一帧图像作为当前帧的背景模型具有较好的实时性,其背景不积累,且更新速度快、算法简单、计算量小。算法的不足在于对环境噪声较为敏感,闽值的选择相当关键,选择过低不足以抑制图像中的噪声,过高则忽略了图像中有用的变化。对于比较大的、颜色一致的运动目标,有可能在目标内部产生空洞,无法完整地提取运动目标。

简单说一下程序思路哈,参考了一下opencv官网教程

#include<iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
const unsigned char FORE_GROUD = 255;int thresh = 10;
int main(int argc,char*argv[])
{
 VideoCapture video(argv[1]); //判断如果video是否可以打开
 if(!video.isOpened())
 return -1;  

//用于保存当前帧的图片 

 Mat currentBGRFrame;
//用来保存上一帧和当前帧的灰度图片
 Mat previousSecondGrayFrame; Mat previousFirstGrayFrame; Mat currentGaryFrame;
 //保存两次的帧差
Mat previousFrameDifference; //previousFrameFirst - previousFrameSecond的差分
Mat currentFrameDifference;  //currentFrame - previousFrameFirst;
 //用来保存帧差的绝对值
Mat absFrameDifferece;
//用来显示前景
 Mat previousSegmentation; Mat currentSegmentation; Mat segmentation;
 //显示前景
 namedWindow("segmentation",1);
 createTrackbar("阈值:","segmentation",&thresh,FORE_GROUD,NULL);
 //帧数
 int numberFrame = 0;
//形态学处理用到的算子
 Mat morphologyKernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
 for(;;)
 {  //读取当前帧
 video >> currentBGRFrame;
 //判断当前帧是否存在
 if(!currentBGRFrame.data)
 break;
  numberFrame++;
 //颜色空间的转换
 cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);
 if( numberFrame == 1)  {
 //保存当前帧的灰度图
 previousSecondGrayFrame = currentGaryFrame.clone();
  //显示视频
 imshow("video",currentBGRFrame);   continue;  }
 else if( numberFrame == 2)
 {
 //保存当前帧的灰度图
  previousFirstGrayFrame = currentGaryFrame.clone();
 //previousFirst - previousSecond
 subtract(previousFirstGrayFrame,previousSecondGrayFrame,previousFrameDifference,Mat(),CV_16SC1);
 //取绝对值
 absFrameDifferece = abs(previousFrameDifference);
 //位深的改变
 absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);
 //阈值处理
 threshold(absFrameDifferece,previousSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);
  //显示视频
 imshow("video",currentBGRFrame);
 continue;  }
 else
 {
 //src1-src2
subtract(currentGaryFrame,previousFirstGrayFrame,currentFrameDifference,Mat(),CV_16SC1);
   //取绝对值
  absFrameDifferece = abs(currentFrameDifference);
 //位深的改变   absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);
   //阈值处理
 threshold(absFrameDifferece,currentSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);  //与运算
 bitwise_and(previousSegmentation,currentSegmentation,segmentation);    //中值滤波
medianBlur(segmentation,segmentation,3); //形态学处理(开闭运算)
 //morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);
 morphologyEx(segmentation,segmentation,MORPH_CLOSE,morphologyKernel,Point(-1,-1),2,BORDER_REPLICATE);
      //找边界
 vector< vector<oint> > contours;
 vector<Vec4i> hierarchy;
 //复制segmentation
  Mat tempSegmentation = segmentation.clone();
  findContours( segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//CV_RETR_TREE
  vector< vector<oint> > contours_poly( contours.size() );
  /*存储运动物体*/
  vector<Rect> boundRect;
  boundRect.clear();
 //画出运动物体
 for(int index = 0;index < contours.size() ;index++)
 {
 approxPolyDP( Mat(contours[index]), contours_poly[index], 3, true );
  Rect rect = boundingRect( Mat(contours_poly[index]) );
 rectangle(currentBGRFrame,rect,Scalar(0,255,255),2);   }
 //显示视频
 imshow("video",currentBGRFrame);
 //前景检测
imshow("segmentation",segmentation);
 //保存当前帧的灰度图
 previousFirstGrayFrame = currentGaryFrame.clone();
 //保存当前的前景检测
 previousSegmentation = currentSegmentation.clone();
 }
 if(waitKey(33) == 'q')
 break;
 }
 return 0;
}

编译之后,运行./main.cpp **.avi

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • opencv帧差法找出相差大的图像

    本文实例为大家分享了opencv帧差法找出相差大的图像,供大家参考,具体内容如下 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>

  • python+opencv实现移动侦测(帧差法)

    本文实例为大家分享了python+opencv实现移动侦测的具体代码,供大家参考,具体内容如下 1.帧差法原理 移动侦测即是根据视频每帧或者几帧之间像素的差异,对差异值设置阈值,筛选大于阈值的像素点,做掩模图即可选出视频中存在变化的桢.帧差法较为简单的视频中物体移动侦测,帧差法分为:单帧差.两桢差.和三桢差.随着帧数的增加是防止检测结果的重影. 2.算法思路 文章以截取视频为例进行单帧差法移动侦测 3.python实现代码 def threh(video,save_video,thres1,ar

  • opencv实现三帧差法解析

    今天和大家谈谈三帧差法来实现运动目标检测吧,其中运动检测画框实现追踪方法多种多样,大家可以自行百度,后面我也会一一实现,今天我先给大家玩玩三帧差法吧::::(注释非常清楚哦,程序也极其简单的) 帧差法是最为常用的运动目标检测和分割方法之一,基本原理就是在图像序列相邻两帧或三帧间采用基于像素的时间差分通过闭值化来提取出图像中的运动区域.首先,将相邻帧图像对应像素值相减得到差分图像,然后对差分图像二值化,在环境亮度变化不大的情况下,如果对应像素值变化小于事先确定的阂值时,可以认为此处为背景像素:如果

  • OpenCV实现帧差法检测运动目标

    今天的目标是用OpenCV实现对运动目标的检测,这里选用三帧帧差法.代码如下: #include <opencv2/opencv.hpp> #include <cv.h> #include <highgui.h> #include <stdio.h> #include <ctype.h> double Threshold_index=0; const int CONTOUR_MAX_AERA = 200; void trackbar(int po

  • Opencv二帧差法检测运动目标与提取轮廓

    Opencv学习之二帧差法运动目标检测与轮廓提取 ,供大家参考,具体内容如下 代码是从网上摘抄学习的,加了好多注释,感觉就像边看书边做笔记一样,给人以满足的享受.Let's do this! #include "highgui.h" #include "cv.h" #include "stdio.h" #include <time.h> #include <math.h> #include <string.h>

  • Qt+OpenCV利用帧差法实现车辆识别

    目录 一.目标 二.使用Qt界面 三.代码实现 一.目标 Qt界面实现 点击 线程启动按钮播放视频 左边界面显示原视频 右边界面显示车辆识别视频 结果展示如下: 初始界面 点击线程启动后,即可车辆识别 二.使用Qt界面 设计好界面后最好先保存 对按钮设置槽函数 三.代码实现 难点在于:线程同步问题 需要使用到connect函数中的第五个参数[第五个参数 具体说明如下] 1 AutoConnection 为默认参数,由发送信号决定,如果发送信号和接受信号是同一个线程,则调用DirectConnec

  • C++使用opencv处理两张图片的帧差

    本文为大家分享了使用opencv处理两张图片帧差的具体代码,供大家参考,具体内容如下 这个程序是两张图片做帧差,用C++实现的,把不同的地方用框框起来,仔细读一下程序,应该还是蛮简单的哈哈,opencv处理图片的基础. opencv配置不用我说了吧,源码cmake编译,然后导入vs即可. #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int mai

  • python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你儿子. 还有其他物品.什么桌子带腿.镜子反光能在里面倒影出东西,各种各样的特征,我们通过学习.归纳,自然而然能够很快识别分类出新物品.

  • python+opencv边缘提取与各函数参数解析

    前情提要:作为刚入门机器视觉的小伙伴,第一节课学到机器视觉语法时觉得很难理解, 很多人家的经验,我发现都千篇一律,功能函数没解析,参数不讲解,就一个代码,所以在此将搜集的解析和案例拿出来汇总!!! 一.opencv+python环境搭建 其实能写python的就能写opencv,但是工具很总要,代码提示也很重要,你可能会用submit     vs等工具,submit编码个人觉得不够智能,vs的话过完年我学的方向不一致,所以没用 推荐 pycharm ,在项目setting中的项目解释器中安装

  • OpenCV 之按位运算举例解析

    文章介绍 OpenCV 库中包含很多运算函数,这里着重介绍按位运算的基本原理并举例说明. 本篇文章中主要涉及到的函数有: 按位与:bitwise_and(): 按位或:bitwise_or(): 按位异或:bitwise_xor(). 按位反转:bitwise_not(): [注]以上所有运算皆基于二进制而来. 举例说明 1.bitwise_and() a = np.array([[1], [9], [1], [0], [0]]) b = np.array([[1], [8], [0], [0]

随机推荐