基于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* 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);
 argc = 1; 

 if( argc > 2 )
  {
   fprintf(stderr, "Usage: bkgrd [video_file_name]\n");
   return -1;
  }
 //打开摄像头
 if (argc ==1)
  if( !(pCapture = cvCaptureFromCAM(-1)))
   {
  fprintf(stderr, "Can not open camera.\n");
  return -2;
   }
 //打开视频文件
 if(argc == 2)
  if( !(pCapture = cvCaptureFromFile(argv[1])))
   {
  fprintf(stderr, "Can not open video file %s\n", argv[1]);
  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);
   //如果有按键事件,则跳出循环
   //此等待也为cvShowImage函数提供时间完成显示
   //等待时间可以根据CPU速度调整
   if( cvWaitKey(2) >= 0 )
    break;  

  }
  }  

 //销毁窗口
 cvDestroyWindow("video");
 cvDestroyWindow("background");
 cvDestroyWindow("foreground");
 //释放图像和矩阵
 cvReleaseImage(&pFrImg);
 cvReleaseImage(&pBkImg);
 cvReleaseMat(&pFrameMat);
 cvReleaseMat(&pFrMat);
 cvReleaseMat(&pBkMat);
 cvReleaseCapture(&pCapture);
 return 0;
}

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

(0)

相关推荐

  • 基于MFC和OpenCV实现角点检测

    本文实例为大家分享了MFC和OpenCV实现角点检测的具体代码,供大家参考,具体内容如下 // 角点检测 // 根据<基于OpenCV的计算机视觉技术实现> #define max_corners 200; // 限定的最大角点数 IplImage* srcImage = 0; // 待处理的源图像 IplImage* ImageShow = 0; // 存储显示带角点的图像 IplImage* grayImage = 0; // 原始图像转换成的灰阶图像 IplImage* corners1

  • 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实现人脸检测

    前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

  • opencv实现图片与视频中人脸检测功能

    本文实例为大家分享了opencv实现人脸检测功能的具体代码,供大家参考,具体内容如下 第一章:反思与总结 上一篇博客我相信自己将人脸检测中的AdaBoost算法解释的非常清晰了,以及如何训练人脸检测的强分类器:人脸检测中AdaBoost算法详解.事后,自我感觉对这个人脸检测还是不够具体,所以自己抽了一下午的时间用opencv实现图片与视频中的人脸检测,下面是我用vs2013加opencv4.9来实现的.做一下声明,我的代码是参考OpenCV实现人脸检测的一个博客写的,非常感谢这位博主,我学到了很

  • 基于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背景差分器. 一.基本背景差分器 首先,基本

  • 基于opencv实现车道线检测

    基于opencv的车道线检测,供大家参考,具体内容如下 原理: 算法基本思想说明: 传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受到各种噪声干扰,直接运用有时候效果不好,更多的时候通过霍夫直线检测进行初步的筛选,然后再有针对性的进行直线拟合,根据拟合的直线四个点坐标,绘制出车道线,这种方式可以有效避免霍夫直线拟合不良后果,是一种更加稳定的车道线检测方法,在实际项目中,可以选择两种方法并行,在计算出结果后进行叠加或者对比提取,今天分享的案例主要是绕开了霍夫

  • 基于OpenCV实现车道线检测(自动驾驶 机器视觉)

    目录 0 前言 1 车道线检测 2 目标 3 检测思路 4 代码实现 4.1 视频图像加载 4.2 车道线区域 4.3 区域 4.4 canny 边缘检测 4.5 霍夫变换(Hough transform) 4.6 HoughLinesP 检测原理 0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测. 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手.那么面对这样极其复杂问题,我们解决问

  • 基于OpenCV的路面质量检测的实现

    本期我们将展示一种对路面类型和质量进行分类的方法及其步骤.为了测试这种方法,我们使用了我们制作的RTK数据集. 路面分类 该数据集[1]包含用低成本相机拍摄的图像,以及新兴国家常见的场景,其中包含未铺砌的道路和坑洼.路面类型是有关人或自动驾驶车辆应如何驾驶的重要信息.除了乘客舒适度和车辆维护以外,它还涉及每个人的安全.我们可以通过[2]中的简单卷积神经网络(CNN)结构来实现. 在这种方法中,我们对表面类型分类任务使用特定的模型,我们将其定义为以下类别:沥青,已铺设(用于所有其他类型的路面)和未

  • python基于Opencv实现人脸口罩检测

    一.开发环境 python 3.6.6 opencv-python 4.5.1 二.设计要求 1.使用opencv-python对人脸口罩进行检测 三.设计原理 设计流程图如图3-1所示, 图3-1 口罩检测流程图 首先进行图片的读取,使用opencv的haar鼻子特征分类器,如果检测到鼻子,则证明没有戴口罩.如果检测到鼻子,接着使用opencv的haar眼睛特征分类器,如果没有检测到眼睛,则结束.如果检测到眼睛,则把RGB颜色空间转为HSV颜色空间.进行口罩区域的检测.口罩区域检测流程是首先把

  • Opencv光流运动物体追踪详解

    光流的概念是由一个叫Gibson的哥们在1950年提出来的.它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法.那么所说的光流到底是什么? 简单来说,上图表现的就是光流,光流描述的是图像上每个像素点的灰度的位置(速度)变化情况,光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的"运动".研究光流场的目的就是为了从

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

  • OpenCV 视频中火焰检测识别实践

    主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些遗漏的区域.基于OpenCV的开源库,在VS2013平台上,实现了两个视频中火焰的检测. 利用OpenCV有强大的图像处理库,直接将图像分离为RGB三通道,设置条件限制,找到火焰的像素位置,将原图处理成二值图像.对于火焰检测,本文结合RGB判据和HIS判据,分割出火焰的区域.一般用于人眼观看的颜色模

随机推荐