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

所属分类: 软件编程 / C 语言 阅读数: 42
收藏 0 赞 0 分享

基于一个实现的基于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;  
} 

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

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多