• 大小: 6KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-08-04
  • 语言: 其他
  • 标签: opencv  背景差  

资源简介

本程序通过对采集到的视频序列进行分析,采用背景差法和自适应背景更新的方法对,进入视频序列或摄像头中的人体进行自动检测

资源截图

代码片段和文件信息


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

#include 
#include 
#include 


int main( int argc char** argv )//需要输入命令行的参数
{
  //声明IplImage指针
  IplImage* pframe = NULL; //从摄像头或者文件中抓取并返回一帧,获取真正的图像的指针
  IplImage* pFrImg = NULL;//申请了8位无符号整形的内存空间将第一帧图像转换成灰度图像存的了这里,不是第一帧的也存到这里 也转成灰度,在处理,作为前景
                          //存放了二值化之后的前景,原来图像绝对差后存放在pFrMat
  IplImage* pBkImg = NULL;//申请了8位无符号整形的内存空间将第一帧图像转换成灰度图像存的了这里,作为背景,再把背景图像转换成矩阵格式
                          //存储更新后的背景
  CvMat* pframeMat = NULL;//存放其他帧的数组,申请32位,单精度,1通道的矩阵空间,pFrImg存的由pframe转换过来的灰度图像,再由pFrImg转换过来的矩阵存的这里pframeMat
  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( argc != 2 )//按ctrl+F5后就出现了window的黑面
    {
      fprintf(stderr “Usage: bkgrd \n“);
      return -1;
    }

  //打开视频文件
  //在命令行上输入Debug>bkgrd.exe SampleVideo.avi    则argv[0]=bkgrd.exe;argv[1]=SampleVideo.avi
  if( !(pCapture = cvCaptureFromFile(argv[1])))//cvCaptureFromFile 视频获取结构,获得视频的,如果获取的不是SampleVideo.avi这个视频则输出不能打开视频文件
                                            //存放着视频
    {
      fprintf(stderr “Can not open video file %s\n“ argv[1]);
      return -2;
    }
   
  //逐帧读取视频
   while(pframe = cvQueryframe( pCapture ))//cvQueryframe从摄像头或者文件中抓取并返回一帧 IplImage* cvQueryframe( CvCapture* capture );
    {
       nFrmNum++;//执行完这条语句后,(i=3j=i++后,j=3,i=4),nFrmNum++=0,nFrmNum==1
      
       //如果是第一帧,需要申请内存,并初始化
       if(nFrmNum == 1)//如果是第一帧
{
pBkImg = cvCreateImage(cvSize(pframe->width pframe->height)//IplImage* cvCreateImage( CvSize size int depth int channels );
   IPL_DEPTH_8U1);                                                     //创建一幅灰度图像,通道1,分配出了内存
   pFrImg = cvCreateImage(cvSize(pframe->width pframe->height)  
IPL_DEPTH_8U1);                                                     //创建一幅灰度图像,分配出了内存,无符号8位整型 
            pBkMat = cvCreateMat(pframe->height pframe->width CV_32FC1);
   pFrMat = cvCreateMat(pframe->height pframe->width CV_32FC1);//32位,单精度,1通道
   pframeMat = cvCreateMat(pframe->height pframe->width CV_32FC1);//CvMat* cvCreateMat( int rows int cols int type );

   //转化成单通道图像再处理
//关键步骤---------------------------

评论

共有 条评论