视频图像中运动检测

下面这个程序 来自于仕琪的讲稿 《使用OpenCV进行图像处理》]中的例程:

 

#include "stdafx.h" 
#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); 
 
 
   
    if( !(pCapture = cvCaptureFromCAM(-1))) 
    { // pCapture = cvCaptureFromAVI("E:\\code\\car.avi")
            
        fprintf(stderr, "Can not open camera.\n"); 
        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; 
 
 
       
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值