您的位置:首页 > 编程语言

背景差法OpenCV实现程序代码

2011-03-08 17:31 337 查看

背景差法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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  image null 2010