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 pos)
{
 Threshold_index=(double)pos;
}

int main(int argc, char* argv[])
{
 CvCapture *capture=cvCaptureFromCAM(0);
 int n_cnt=0;
 IplImage *img=NULL,
 *img_gray1=NULL,
 *img_gray2=NULL,
 *img_gray3=NULL,
 *img_diff1=NULL,
 *img_diff2=NULL,
 *img_diff_and=NULL,
 *img_binary=NULL,
 *img_dilate=NULL;
 CvMemStorage *stor;
 CvSeq *cont;

 stor=cvCreateMemStorage(0);
 cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);

 cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
 cvNamedWindow("dilate",CV_WINDOW_AUTOSIZE);
 img=cvQueryFrame(capture);
 img_gray1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_gray2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_gray3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_diff1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_diff2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_diff_and=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_binary=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
 img_dilate=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);

 int index=1;
 cvCreateTrackbar("Threshold","test",&index,255,trackbar);

 while(img=cvQueryFrame(capture))
 {
 if(n_cnt%3==0)
  cvCvtColor(img,img_gray1,CV_BGR2GRAY);
 else if(n_cnt%3==1)
  cvCvtColor(img,img_gray2,CV_BGR2GRAY);
 else if(n_cnt%3==2)
  cvCvtColor(img,img_gray3,CV_BGR2GRAY);
 char c=(char)cvWaitKey(25);
 if(c==27)
  break;
 if(n_cnt>3)
 {
  cvAbsDiff(img_gray1,img_gray2,img_diff1);
  cvAbsDiff(img_gray2,img_gray3,img_diff2);
  cvAnd(img_diff1,img_diff2,img_diff_and);
  cvThreshold(img_diff_and,img_binary,Threshold_index,255,CV_THRESH_BINARY);
  cvShowImage("test",img_binary);

  cvDilate(img_binary,img_dilate);
  //cvShowImage("dilate",img_dilate);

  cvFindContours(img_dilate,stor,&cont,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
  for(;cont;cont = cont->h_next)
  {
   CvRect r = ((CvContour*)cont)->rect;//子类转换为父类例子
   if(r.height * r.width > CONTOUR_MAX_AERA) // 面积小的方形抛弃掉
   {
    cvRectangle(img, cvPoint(r.x,r.y),
     cvPoint(r.x + r.width, r.y + r.height),
     CV_RGB(255,0,0), 1, CV_AA,0);
   }
  }
  cvShowImage("dilate",img);
 }
 if(c=='s')
 {
  cvSaveImage("d:/img.bmp",img);
  cvSaveImage("d:/img_binary.bmp",img_dilate);
 }
 n_cnt++;
 }

 cvDestroyAllWindows();
 cvReleaseCapture(&capture);
 cvReleaseImage(&img_gray1);
 cvReleaseImage(&img_gray2);
 cvReleaseImage(&img_gray3);
 cvReleaseImage(&img_diff1);
 cvReleaseImage(&img_diff2);
 cvReleaseImage(&img_diff_and);
 cvReleaseImage(&img_binary);
 cvReleaseImage(&img_dilate);
 cvReleaseMemStorage(&stor);
 return 0;
}

下图是检测的运动目标二值化图像以及在实际图像中叠加的矩形框效果图。

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

(0)

相关推荐

  • opencv实现三帧差法解析

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

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

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

  • 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>

  • OpenCV实现帧间差分法详解

    本文实例为大家分享了OpenCV实现帧间差分法的具体方法,供大家参考,具体内容如下 一.基本概念 基于视频的车辆检测算法种类很多:光流法检测,帧差法,背景消除法(其中包括:直方图法,平均值法,单分布和混合高斯分布背景模型,Kalman滤波等),边缘检测法,运动矢量检测法...下面分享的是运动目标检测算法中最基本的方法-帧间差分法. 相邻帧间图像差分思想:检测出了相邻两帧图像中发生变化的区域.该方法是用图像序列中的连续两帧图像进行差分,然后二值化该灰度差分图像来提取运动信息.由帧间变化区域检测分割

  • 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学习之特征点检测与匹配详解

    目录 背景 一.Harris角点 二.Shi-Tomasi角点检测 三.SIFT关键点 四.SIFT描述子 五.SURF 六.ORB 七.暴力特征匹配(BF) 八.FLANN特征匹配 九.图像查找 总结 背景 提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度学习的领域中,特征代表着图像的信息,对于分类.检测任务都是至关重要的: 特征点应用的一些场景: 图像搜索:以图搜图(电商.教育领域) 图像拼接:全景拍摄(关联图像拼接) 拼图游戏:游戏领域 一.Harris角点 哈里斯角点检测主要

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

随机推荐