基于OpenCv的运动物体检测算法分享!

基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体。

  #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);     argc = 1;        if( argc > 2 )      {       fprintf(stderr, "Usage: bkgrd [video_file_name]n");       return -1;      }     //打开摄像头     if (argc ==1)      if( !(pCapture = cvCaptureFromCAM(-1)))       {      fprintf(stderr, "Can not open camera.n");      return -2;       }     //打开视频文件     if(argc == 2)      if( !(pCapture = cvCaptureFromFile(argv[1])))       {      fprintf(stderr, "Can not open video file %sn", argv[1]);      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;          }      }           //销毁窗口     cvDestroyWindow("video");     cvDestroyWindow("background");     cvDestroyWindow("foreground");     //释放图像和矩阵     cvReleaseImage(&pFrImg);     cvReleaseImage(&pBkImg);     cvReleaseMat(&pFrameMat);     cvReleaseMat(&pFrMat);     cvReleaseMat(&pBkMat);     cvReleaseCapture(&pCapture);     return 0;    }   

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解基于OpenCv的运动物体检测算法分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482274.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐