OpenCV利用背景建模检测运动物体

本文实例为大家分享了OpenCV利用背景建模检测运动物体的具体代码,供大家参考,具体内容如下

#include <opencv\highgui.h>
#include <stdio.h> 

int main( int argc, char** argv ){ 

  IplImage* pFrame = NULL;
  IplImage* pFrImg = NULL;
  IplImage* pBkImg = NULL; 

  CvMat* pFrameMat = NULL;
  CvMat* pFrMat = NULL;
  CvMat* pBkMat = NULL; 

  CvCapture* pCapture = NULL; 

  int nFrmNum = 0; 

  cvNamedWindow("video", 1);
  cvNamedWindow("background",1);
  cvNamedWindow("foreground",1); 

  cvMoveWindow("video", 30, 0);
  cvMoveWindow("background", 360, 0);
  cvMoveWindow("foreground", 690, 0);
  //打开视频文件
  if( !(pCapture = cvCaptureFromFile("video.avi")) ){ 

    fprintf(stderr, "Can not open video file video.avi\n");
    return -2;
  } 

  //逐帧读取视频
  while(pFrame = cvQueryFrame( pCapture )){ 

    nFrmNum++; 

    // 第一帧需要申请内存并初始化
    if(nFrmNum == 1){ 

      pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),
                  IPL_DEPTH_8U,1);
      pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),
                  IPL_DEPTH_8U,1);
      pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
      pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
      pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 

      // 转换为单通道图像再处理
      cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
      cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 

      cvConvert(pFrImg, pFrameMat);
      cvConvert(pFrImg, pFrMat);
      cvConvert(pFrImg, pBkMat);
    }else{ 

      cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
      cvConvert(pFrImg, pFrameMat); 

      // 高斯滤波平滑图像
      cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); 

      // 当前帧与背景图相减
      cvAbsDiff(pFrameMat, pBkMat, pFrMat); 

      // 二值化背景图
      cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY); 

      //进行形态学滤波,去除噪声. 效果不好,将行车都作为噪声去除了
      //cvErode(pFrImg, pFrImg, 0, 1);
      //cvDilate(pFrImg, pFrImg, 0, 1); 

      // 更新背景
      cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
      // 将背景转换为图像格式,用于显示
      cvConvert(pBkMat, pBkImg); 

      cvShowImage("video", pFrame);
      cvShowImage("background", pBkImg);
      cvShowImage("foreground", pFrImg); 

      if( cvWaitKey(2) >= 0 )
        break;
    }
  } 

  cvDestroyWindow("video");
  cvDestroyWindow("background");
  cvDestroyWindow("foreground"); 

  cvReleaseImage(&pFrImg);
  cvReleaseImage(&pBkImg); 

  cvReleaseMat(&pFrameMat);
  cvReleaseMat(&pFrMat);
  cvReleaseMat(&pBkMat); 

  return 0;
} 

效果图:

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

您可能感兴趣的文章:

  • Opencv基于CamShift算法实现目标跟踪
  • 使用OpenCV实现检测和追踪车辆
  • opencv+arduino实现物体点追踪效果
(0)

相关推荐

  • opencv+arduino实现物体点追踪效果

    本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过pc控制摄像头的舵机,使这一点始终在图像的中心. 要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动. #include<opencv2\opencv.hpp> #include<opencv\cv.h> #include<opencv\highgui.h> #include<math.h> #include<Windows.h> #include<string.h

  • 使用OpenCV实现检测和追踪车辆

    本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下 完整源码GitHub 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译 由于要对背景建模,这个方法要求背景是静止的 另外不同车辆白色区域不能连通,否则会认为是同一物体 void processVideo(char* videoFilename) {

  • Opencv基于CamShift算法实现目标跟踪

    CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟踪的过程中随着目标大小的变化实时调整搜索窗口大小,对于视频序列中的每一帧还是采用MeanShift来寻找最优迭代结果,至于如何实现自动调整窗口大小的,可以查到的论述较少,我的理解是通过对MeanShift算法中零阶矩的判断实现的. 在MeanShift算法中寻找搜索窗口的质心用到窗口的零阶矩M00和一阶矩M1

  • OpenCV利用背景建模检测运动物体

    本文实例为大家分享了OpenCV利用背景建模检测运动物体的具体代码,供大家参考,具体内容如下 #include <opencv\highgui.h> #include <stdio.h> int main( int argc, char** argv ){ IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvMat* pFrameMat = NULL; CvMat* pFrMat

  • 详解opencv去除背景算法的方法比较

    目录 背景减除法 (1)BackgroundSubtractorMOG (2)BackgroundSubtractorMOG2 (3)BackgroundSubtractorGMG 帧差法 最近做opencv项目时,使用肤色分割的方法检测目标物体时,背景带来的干扰非常让人头痛.于是先将背景分割出去,将影响降低甚至消除.由于初次接触opencv,叙述不当的地方还请指正. 背景减除法 (以下文字原文来源于https://docs.opencv.org/3.4.7/d8/d38/tutorial_bg

  • 基于OpenCv的运动物体检测算法

    基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体. #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> int main( int argc, char** argv ) //声明IplImage指针 IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBk

  • Python使用背景差分器实现运动物体检测

    目录 前言 一.基本背景差分器 二.MOG背景差分器 流程 代码编写 三.KNN背景差分器 前言 目前,许多运动检测技术都是基于简单的背景差分概念的,即假设摄像头(视频)的曝光和场景中的光照条件是稳定的,当摄像头捕捉到新的帧时,我们可以从参考图像中减去该帧,并取这个差的绝对值,以获得帧中每个像素位置的运动测量值.如果帧的任何区域与参考图像有很大的不同,我们就认为给定区域中是一个运动物体. 本文主要简单介绍基本背景差分器,详细介绍MOG背景差分器,KNN背景差分器. 一.基本背景差分器 首先,基本

  • python+openCV利用摄像头实现人员活动检测

    本文实例为大家分享了python+openCV利用摄像头实现人员活动检测的具体代码,供大家参考,具体内容如下 1.前言 最近在做个机器人比赛,其中一项要求是让机器人实现对是否有人员活动的检测,所以就先拿PC端写一下,准备移植到机器人的树莓派. 2.工具 工具还是简单的python+视觉模块openCV,代码量也比较少.很简单就可以实现 3.人员检测的原理   从图书馆借了一本<特征提取与图像处理(第二版)>,是Mark S.Nixon和Alberto S.Aguado写的,其中讲了跟多关于检测

  • python opencv 检测移动物体并截图保存实例

    最近在老家找工作,无奈老家工作真心太少,也没什么面试机会,不过之前面试一家公司,提了一个有意思的需求,检测河面没有有什么船只之类的物体,我当时第一反应是用opencv做识别,不过回家想想,河面相对的东西比较少,画面比较单一,只需要检测有没有移动的物体不就简单很多嘛,如果做街道垃圾检测的话可能就很复杂了,毕竟街道上行人,车辆,动物,很多干扰物,于是就花了一个小时写了一个小的demo,只需在程序同级目录创建一个img目录就可以了 # -*-coding:utf-8 -*- __author__ =

  • opencv检测动态物体的实现

    之前我在超市看到当有物体经过时,监控的屏幕边缘会出现绿框.感觉蛮有意思的.来用opencv试试能不能实现类似的效果.   我采用的检测动态物体的方法是,比较前后两帧图像,即当前画面与上一帧的画面出现了不同.我们把两帧画面进行比较.然后框选出运动的物体.我们还希望程序可以判断当前窗口到底有没有物体在运动.那么我们就需要添加一个状态.为了方便我们找到什么时间有物体移动,我打印出时间.   当我们的程序检测到移动的物体时,会捕捉到它的轮廓,添加一个外接整矩形框,返回x,y的坐标.当不返回坐标时,则意味

  • 利用OpenCV实现YOLO对象检测方法详解

    目录 前言 什么是YOLO物体检测器? 项目结构 检测图像 检测视频 前言 本文将教你如何使用YOLOV3对象检测器.OpenCV和Python实现对图像和视频流的检测.用到的文件有yolov3.weights.yolov3.cfg.coco.names,这三个文件的github链接如下: GitHub - pjreddie/darknet: Convolutional Neural Networks https://pjreddie.com/media/files/yolov3.weights

  • Python OpenCV利用笔记本摄像头实现人脸检测

    本文实例为大家分享了Python OpenCV利用笔记本摄像头实现人脸检测的具体代码,供大家参考,具体内容如下 1.安装opencv 首先参考其他文章安装pip. 之后以管理员身份运行命令提示符,输入以下代码安装opencv pip install --user opencv-python 可以使用以下代码测试安装是否成功 #导入opencv模块 import cv2 #捕捉帧,笔记本摄像头设置为0即可 capture = cv2.VideoCapture(0) #循环显示帧 while(Tru

  • OpenCV利用霍夫变换进行直线检测

    本文实例为大家分享了OpenCV利用霍夫变换进行直线检测的具体代码,供大家参考,具体内容如下 1.最简单的霍夫变换是在图像中识别直线.在平面直角坐标系(x-y)中,一条直线可以用下式表示:y=kx+b. 这表示参数平面(k-b)中的一条直线.因此,图像中的一个点对应参数平面中的一条直线,图像中的一条直线对应参数平面中的一个点.对图像上所有的点作霍夫变换,最终所要检测的直线对应的一定是参数平面中直线相交最多的那个点.这样就在图像中检测出了直线.在实际应用中,直线通常采用参数方程:p=x\cos\t

随机推荐