首页 > 编程 > C > 正文

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

2020-01-26 13:49:19
字体:
来源:转载
供稿:网友

本文实例为大家分享了OpenCV利用背景建模检测运动物体的具体代码,供大家参考,具体内容如下

#include <opencv/highgui.h> #include <stdio.h>  int main( int argc, char** argv ){    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 = cvCaptureFromFile("video.avi")) ){      fprintf(stderr, "Can not open video file video.avi/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);        if( cvWaitKey(2) >= 0 )         break;     }   }    cvDestroyWindow("video");   cvDestroyWindow("background");   cvDestroyWindow("foreground");    cvReleaseImage(&pFrImg);   cvReleaseImage(&pBkImg);    cvReleaseMat(&pFrameMat);   cvReleaseMat(&pFrMat);   cvReleaseMat(&pBkMat);    return 0; } 

效果图:

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选