背景差法OpenCV实现程序代码

背景差法OpenCV实现程序代码

默认分类 2010-11-12 22:10:27 阅读70 评论0   字号: 订阅

#include "highgui.h"

#include "cv.h"

#include <stdio.h>

#include"例子一.h"

int main(int argc,char**argv)

{

//声明指针,矩阵

IplImage*image=NULL;

IplImage*backimage=NULL;

IplImage*foreimage=NULL;

IplImage*tank=NULL;

 

CvMat*imagemat=NULL;

CvMat*foremat=NULL;

CvMat*backmat=NULL;

CvCapture*capture=NULL;

int num=0;

//创建窗口

cvNamedWindow("cvcamwindow",CV_WINDOW_AUTOSIZE);

cvNamedWindow("foreground",1);

cvNamedWindow("background",1);

cvNamedWindow("wo",1);

//读取摄像头

       if(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))

              capture=cvCaptureFromCAM(argc==2?argv[1][0]-'0':0);

       else if(argc==2)

              capture=cvCaptureFromAVI(argv[1]);

   

//声明视频结构

int isColor = 1;

       int frameW=160;

       int frameH=120;

       int fps=8;

   CvVideoWriter* camWriter=cvCreateVideoWriter("E://directx//jianhua12.avi",-1,fps,cvSize(frameW,frameH),isColor);

       if(!capture)

       {

              fprintf(stderr,"could not initialize capturing.../n");

          return 0;

      }

 

//处理图像

       while(image=cvQueryFrame(capture))

       {

              num++;

              if(num==1)//第一针申请内存

              {

foreimage=cvCreateImage(cvGetSize(image),8,1);

                  backimage=cvCreateImage(cvGetSize(image),8,1);

           tank=cvCreateImage(cvGetSize(image),8,3);

 

            backmat=cvCreateMat(image->height,image->width,CV_32FC1);

            foremat=cvCreateMat(image->height,image->width,CV_32FC1);

            imagemat=cvCreateMat(image->height,image->width,CV_32FC1);

 

               //转换成单通道处理

               cvCvtColor(image,backimage,CV_BGR2GRAY);

               cvCvtColor(image,foreimage,CV_BGR2GRAY);

            //矩阵初始化

            cvConvert(foreimage,foremat);

            cvConvert(foreimage,backmat);

            cvConvert(foreimage,imagemat);

          }

              else

              {

                     cvCvtColor(image,foreimage,CV_BGR2GRAY);

                     cvConvert(foreimage,imagemat);

                    

                    //高斯滤波,平滑图像

                     cvSmooth(imagemat,imagemat,CV_GAUSSIAN,3,0,0);

                     //当前跟背景差分

                     cvAbsDiff(imagemat,backmat,foremat);

                     cvConvert(foremat,foreimage);

                    //二值化

                     cvThreshold(foreimage,foreimage,60,255.0,CV_THRESH_BINARY);

                     //进行形态学滤波,去掉噪音

                     cvDilate(foreimage, foreimage, 0, 1);

                    cvErode(foreimage, foreimage, 0, 1);

                     cvErode(foreimage, foreimage, 0, 1);

                     cvDilate(foreimage, foreimage, 0, 1);

)//还原处理

                     int nl=foreimage->height;

                     int nc=foreimage->width;

                   BwImage foreimageA(foreimage);

                     RgbImage imageA(image);

                     RgbImage tankA(tank);

                     for(int i=0;i<nl;i++)

                     {

                            for(int j=0;j<nc;j++)

                            {

                                if (foreimageA[i][j]==0)

                   {

tankA[i][j].b=0;

                                      tankA[i][j].g=0;

                                      tankA[i][j].r=0;

}

                  else      

tankA[i][j]=imageA[i][j];                               

                            }

                     }

           tank->origin=image->origin;

//保存前景

                     cvWriteFrame(camWriter,tank);

                     //更新背景

                     cvRunningAvg(imagemat,backmat,0.005,0);

                  //将背景转化为图像格式

                     cvConvert(backmat,backimage);

                     //使图像正立

                     backimage->origin=image->origin;

                     foreimage->origin=image->origin;

                     //显示图像

                     cvShowImage("cvcamwindow", image);

           cvShowImage("background", backimage);

           cvShowImage("foreground" ,foreimage);

                     cvShowImage("wo",tank);

                  //时间缓冲

           int key=cvWaitKey(90);

                     if(cvWaitKey(2)>=0)

                            break;

              }

       }

 

       cvDestroyWindow("cvcam window");

      cvDestroyWindow("background");

      cvDestroyWindow("foreground");

      cvDestroyWindow("wo");

 

       cvReleaseImage(&foreimage);

      cvReleaseImage(&backimage);

      cvReleaseImage(&tank);

      

       cvReleaseMat(&imagemat);

      cvReleaseMat(&foremat);

      cvReleaseMat(&backmat);

 

     cvReleaseVideoWriter (&camWriter);

    

      return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值