文档章节

OpenCV读视频文件和运动问题检测

moki_oschina
 moki_oschina
发布于 2016/04/08 23:42
字数 776
阅读 44
收藏 0

cvRunningAvg

  opencv中的函数,用来更新移动平均。用法:

  void cvRunningAvg(const CvArr * image,

  CvArr* acc,

  double alpha,

  const CvArr* mask=NULL)

  image:输入图像,1或3通道,8比特或32比特的float型

  acc:累加器,和image一样大小

  alpha:更新时,image所占的权重

  mask:操作符掩码

  if mask(x,y)!= 0 (1-alpha)*acc(x,y)+alpha*image(x,y) =>acc(x,y)

#if 0
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")
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 = cvCaptureFromAVI(".\\test.avi")))
 {
  //pCapture = cvCaptureFromCAM(-1))
  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(20) >= 0 )
   {
    break;
   }
  }
 }
 cvWaitKey();
 //销毁窗口
 cvDestroyWindow("video");
 cvDestroyWindow("background");
 cvDestroyWindow("foreground");
 //释放图像和矩阵
 cvReleaseImage(&pFrImg);
 cvReleaseImage(&pBkImg);
 cvReleaseMat(&pFrameMat);
 cvReleaseMat(&pFrMat);
 cvReleaseMat(&pBkMat);
 cvReleaseCapture(&pCapture);
 return 0;
}
#else
#include <cv.h>
#include <highgui.h>
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")
int main( int argc, char** argv )
{
 CvCapture* capture = NULL;
 IplImage *frame = NULL;
 IplImage  *frame_last = NULL;//存储上一帧
 IplImage  *m_out_image = NULL;
 IplImage* frame_gray = NULL;
 IplImage* frame_gray_last = NULL;
 IplImage* m_out_image_copy = NULL;
 int nFrmNum = 0;
 //capture = cvCaptureFromCAM(-1);
 capture = cvCaptureFromAVI(".\\test.avi");
 //创建窗口
 cvNamedWindow( "result", 1 );
 cvNamedWindow("差分");
 //逐帧读取视频
 while(frame = cvQueryFrame( capture ))
 {
  nFrmNum++;
  //如果是第一帧,需要申请内存,并初始化
  if(nFrmNum == 1)
  {
   frame_last = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U, frame->nChannels);
   cvCopy(frame,frame_last);
  }
  else
  {
   frame_gray = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U, 1);
   frame_gray_last = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U, 1);
   m_out_image = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U, 1);
   m_out_image_copy = cvCreateImage( cvSize(frame->width,frame->height),IPL_DEPTH_8U, 1 );
   cvCvtColor(frame,frame_gray,CV_RGB2GRAY);
   cvCvtColor(frame_last,frame_gray_last,CV_RGB2GRAY);
   cvAbsDiff(frame_gray,frame_gray_last,m_out_image);
   //cvThreshold(m_out_image,m_out_image,128, 255,CV_THRESH_BINARY);
   //将处理后的图像写出到第二个图像中
   if( m_out_image_copy->origin == IPL_ORIGIN_TL )
   {
    cvCopy( m_out_image, m_out_image_copy, 0 );
   }
   else
   {
    cvFlip( m_out_image, m_out_image_copy, 0 );
   }
   frame_last = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U, frame->nChannels);
   cvCopy(frame,frame_last);
   cvShowImage("差分",m_out_image_copy);
   cvShowImage("result",frame);
   cvReleaseImage( &m_out_image_copy );
   cvReleaseImage( &frame_gray_last );
   cvReleaseImage( &frame_gray );
   if( cvWaitKey( 20 ) >= 0 )
   {
    break;
   }
  }
 }
 cvWaitKey();
 cvReleaseImage( &m_out_image );
 cvReleaseImage( &frame_last );
 cvReleaseImage( &frame );
 cvReleaseCapture( &capture );
 cvDestroyWindow("result");
 cvDestroyWindow("差分");
 return 0;
}
#endif

本文转载自:http://blog.csdn.net/augusdi/article/details/9020009

moki_oschina
粉丝 26
博文 202
码字总数 44864
作品 0
成都
程序员
私信 提问
基于OpenCV和Python的文件操作——捕获摄像头的帧,在窗口显示图像,在窗口显示摄像头帧和视频文件的读/写

0 写在前面 这篇博客主要参考资料为《OpenCV 3计算机视觉Python语言实现》(Learning OpenCV 3 Computer Vison with Python)。 因为之前用Faster R-CNN做过一个红绿灯检测的小实践,但是Git...

learning_tortosie
2018/04/12
0
0
深刻了解OPENCV

OpenCV是Intel资助的开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个C/C++函数的跨平台的中、高层 API。...

红薯
2008/12/10
3.1K
3
基于OpenCV的iOS图像处理

关于图片处理 随着科技的发展,AI、机器学习、AR、VR等已经逐渐走进生活,模式识别、图像捕捉、图片拼接等已经成为其中的重要环节。因此,图像处理技术在未来会被移动端广泛使用。其中,有很...

无忌不悔
2017/09/06
0
0
视频人脸检测——Dlib版(六)

往期目录 视频人脸检测——Dlib版(六) OpenCV添加中文(五) 图片人脸检测——Dlib版(四) 视频人脸检测——OpenCV版(三) 图片人脸检测——OpenCV版(二) OpenCV环境搭建(一) 更多更...

王磊的博客
2018/05/11
0
0
视频分析(二):光流(Optical Flow)

目标 在这一章当中, 我们将使用Lucas-Kanade方法理解光流的概念及其估计。 我们将使用像cv2.calcOpticalFlowPyrLK()这样的函数来跟踪视频中的特征点。 光学流程 光流是由物体或相机的运动...

漫步当下
2018/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用kubeadm 搭建K8s集群

1. 参考官网 https://kubernetes.io/docs/setup/independent/install-kubeadm/

whhbb
44分钟前
2
0
Dubbo 3.0 !提升不止一点点!

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。 自去年 12 月开始,Dubbo 3.0 便已正...

编程SHA
45分钟前
2
0
提升不止一点点,Dubbo 3.0 预览版详细解读

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。更多用户信息,可以访问Dubbo @GitHub...

阿里云云栖社区
49分钟前
42
0
HanLP Analysis for Elasticsearch

基于 HanLP 的 Elasticsearch 中文分词插件,核心功能: 兼容 ES 5.x-7.x; 内置词典,无需额外配置即可使用; 支持用户自定义词典; 支持远程词典热更新(待开发); 内置多种分词模式,适合...

左手的倒影
今天
1
0
spark部署之yarn模式

spark部署之yarn模式 hadoop-3.0.0集群搭建 配置相应环境 java环境 scala(可配可不配) hadoop环境 从官网下载spark 解压 配置 /conf/spark-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_4...

jackmanwu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部