OpenCV读视频文件和运动物体检测

简介:

简要说明:本程序 尝试打开本电脑上的摄像头作为视频输入设备,或者将命令行的输入参数作为文件名来打开的视频文件。不管是哪一种方法,最后都是不断的循环处理一帧一帧地处理,涉及到的图像处理有 背景擦除,平滑滤波,二值化等。

转自:

http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B

 

有微小调整。在VS2005+OpenCV下调试通过。

 

 
 
  1. #include <stdafx.h> 
  2. #include <stdio.h> 
  3. #include <cv.h> 
  4. #include <cxcore.h> 
  5. #include <highgui.h> 
  6.   
  7. int main( int argc, char** argv ) 
  8.     //声明IplImage指针 
  9.     IplImage* pFrame = NULL;  
  10.     IplImage* pFrImg = NULL; 
  11.     IplImage* pBkImg = NULL; 
  12.  
  13.     CvMat* pFrameMat = NULL; 
  14.     CvMat* pFrMat = NULL; 
  15.     CvMat* pBkMat = NULL; 
  16.  
  17.     CvCapture* pCapture = NULL; 
  18.  
  19.     int nFrmNum = 0; 
  20.  
  21.     //创建窗口 
  22.     cvNamedWindow("video", 1); 
  23.     cvNamedWindow("background",1); 
  24.     cvNamedWindow("foreground",1); 
  25.     //使窗口有序排列 
  26.     cvMoveWindow("video", 30, 0); 
  27.     cvMoveWindow("background", 360, 0); 
  28.     cvMoveWindow("foreground", 690, 0); 
  29.  
  30.  
  31.     if( argc > 2 ) 
  32.     { 
  33.         fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); 
  34.         return -1; 
  35.     } 
  36.  
  37.     //打开摄像头 
  38.     if (argc ==1) 
  39.     { 
  40.         if( !(pCapture = cvCaptureFromCAM(0))) 
  41.         { 
  42.             fprintf(stderr, "Can not open camera.\n"); 
  43.             return -2; 
  44.         } 
  45.     } 
  46.     //打开视频文件 
  47.     if(argc == 2) 
  48.     { 
  49.         if( !(pCapture = cvCaptureFromFile(argv[1]))) 
  50.         { 
  51.             fprintf(stderr, "Can not open video file %s\n", argv[1]); 
  52.             return -2; 
  53.         } 
  54.     } 
  55.     //逐帧读取视频 
  56.     while(pFrame = cvQueryFrame( pCapture )) 
  57.     { 
  58.         nFrmNum++; 
  59.  
  60.         //如果是第一帧,需要申请内存,并初始化 
  61.         if(nFrmNum == 1) 
  62.         { 
  63.             pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1); 
  64.             pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1); 
  65.  
  66.             pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  67.             pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  68.             pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  69.  
  70.             //转化成单通道图像再处理 
  71.             cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); 
  72.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 
  73.  
  74.             cvConvert(pFrImg, pFrameMat); 
  75.             cvConvert(pFrImg, pFrMat); 
  76.             cvConvert(pFrImg, pBkMat); 
  77.         } 
  78.         else 
  79.         { 
  80.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 
  81.             cvConvert(pFrImg, pFrameMat); 
  82.             //高斯滤波先,以平滑图像 
  83.             //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); 
  84.  
  85.             //当前帧跟背景图相减 
  86.             cvAbsDiff(pFrameMat, pBkMat, pFrMat); 
  87.  
  88.             //二值化前景图 
  89.             cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY); 
  90.  
  91.             //进行形态学滤波,去掉噪音   
  92.             //cvErode(pFrImg, pFrImg, 0, 1); 
  93.             //cvDilate(pFrImg, pFrImg, 0, 1); 
  94.  
  95.             //更新背景 
  96.             cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); 
  97.             //将背景转化为图像格式,用以显示 
  98.             cvConvert(pBkMat, pBkImg); 
  99.  
  100.             //显示图像 
  101.             cvShowImage("video", pFrame); 
  102.             cvShowImage("background", pBkImg); 
  103.             cvShowImage("foreground", pFrImg); 
  104.  
  105.             //如果有按键事件,则跳出循环 
  106.             //此等待也为cvShowImage函数提供时间完成显示 
  107.             //等待时间可以根据CPU速度调整 
  108.             if( cvWaitKey(2) >= 0 ) 
  109.                 break
  110.         } 
  111.     } 
  112.      
  113.     //销毁窗口 
  114.     cvDestroyWindow("video"); 
  115.     cvDestroyWindow("background"); 
  116.     cvDestroyWindow("foreground"); 
  117.  
  118.     //释放图像和矩阵 
  119.     cvReleaseImage(&pFrImg); 
  120.     cvReleaseImage(&pBkImg); 
  121.  
  122.     cvReleaseMat(&pFrameMat); 
  123.     cvReleaseMat(&pFrMat); 
  124.     cvReleaseMat(&pBkMat); 
  125.  
  126.     cvReleaseCapture(&pCapture); 
  127.  
  128.     return 0; 









本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/278918,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
算法 计算机视觉
OpenCV(四十三):Shi-Tomas角点检测
OpenCV(四十三):Shi-Tomas角点检测
66 0
|
5月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
297 0
|
6天前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
18 3
|
10天前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
47 1
|
10天前
|
编解码 计算机视觉 Python
Opencv学习笔记(九):通过CV2将摄像头视频流保存为视频文件
使用OpenCV库通过CV2将摄像头视频流保存为视频文件,包括定义视频编码格式、设置保存路径、通过write写入视频文件,并提供了相应的Python代码示例。
36 0
|
9天前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
22 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
9天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
14 0
|
3月前
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
|
4月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
76 0
|
5月前
|
数据采集 Java 数据挖掘
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试