OpenCV实现智能视频监控

本文实例为大家分享了OpenCV实现智能视频监控的具体代码,供大家参考,具体内容如下

之前在做毕设的时候网上找个完整的实现代码挺麻烦的,自己做完分享一下

因为代码较为简单,没有将代码分开写在不同文件,有需要自己整合下哈

使用环境Visual Studio 2010 和 OpenCV 2.4.9

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ctime>
using namespace std;
using namespace cv;

int videoplay();
void on_Trackbar(int ,void*);
char* str_gettime();
int bSums(Mat src);

char g_str[17];
int g_nNum = 0;//图片名称
int g_nDelay = 0;
int g_npic = 0;
Mat g_filpdstMat;
int g_pointnum = 1000;//设置像素点阈值生成图片
int g_pixel = 0;//像素点

int main()
{

 VideoCapture capture(0);

 //视频输出VideoWriter
 CvVideoWriter* outavi = NULL;
 //VideoWriter outavi;
 //outavi.open("sre.avi",-1, 5.0, Size(640, 480), true);
 outavi = cvCreateVideoWriter("录像.avi", -1, 5.0, cvSize(640, 480), 1);

 namedWindow("摄像头",WINDOW_AUTOSIZE);
 namedWindow("移动轨迹",WINDOW_AUTOSIZE);
 IplImage *pcpframe = NULL;

 Mat tempframe, currentframe, preframe, cpframe;
 Mat frame,jpg;
 int framenum = 0;
 //读取一帧处理
 while (1)
 {
 if(!capture.isOpened())
 {
  cout << "读取失败" << endl;
  return -1;
 }

 capture >> frame;//读取摄像头把每一帧传给frame

 frame.copyTo(cpframe);//把frame赋给cpframe,不影响frame
 tempframe = frame;//把frame赋给tempframe,影响frame

 flip(tempframe,g_filpdstMat,1);//水平翻转图像

 pcpframe = &IplImage(cpframe);//为了释放窗口,把Mat转化为IplImage使用

 //cpframe=cvarrToMat(pcpframe);
 //ipl转化矩阵  pBinary = &IplImage(Img)

 //7帧截取一次录入视频,频繁截取运转不过来
 if(framenum % 7 == 0)
 {
  //录像写入
  cvWriteFrame(outavi, pcpframe);
 }

 //判断帧数,若为第一帧,把该帧作为对比帧
 //若大于等于第二帧,则进行帧差法处理
 framenum++; 

 if (framenum == 1)
 {
  cvtColor(g_filpdstMat, preframe, CV_BGR2GRAY);
 }
 if (framenum >= 2)
 {
  cvtColor(g_filpdstMat, currentframe, CV_BGR2GRAY);
  //灰度图
  absdiff(currentframe,preframe,currentframe);//帧差法
  threshold(currentframe, currentframe, 30, 255.0, CV_THRESH_BINARY);
  //二值化

  erode(currentframe, currentframe,Mat());//腐蚀
  dilate(currentframe, currentframe,Mat());//膨胀

  g_pixel = bSums(currentframe);//调用函数bSums,计算白色像素点,赋值给g_pixel
  //小延迟后输出当前像素点数值,防止数据刷太快看不清
  g_nDelay++;
  if(g_nDelay > 5)
  {
  cout<< "当前白色像素点:" <<g_pixel << endl;
  cout << "按ESC退出" << endl;
  g_nDelay = 0;
  }

  //创建像素点滑轨
  createTrackbar("像素点:","移动轨迹",&g_pointnum, 20000,on_Trackbar);
  on_Trackbar(0, 0);//调用回调函数

  //显示图像
  imshow("摄像头", g_filpdstMat);
  imshow("移动轨迹", currentframe);

 }
 //把当前帧保存作为下一次处理的前一帧
 cvtColor(g_filpdstMat, preframe, CV_BGR2GRAY);

 //判断退出,并销毁录像窗口,否则下一步录像无法打开
 if((char)waitKey(10) == 27){cvReleaseVideoWriter(&outavi);break;}

 }//end while 

 while(1)
 {

 //显示提示窗口
 jpg = imread("模式选择.jpg", 1);
 imshow("模式选择",jpg);

 //设置key选择操作
 char key;
 key = waitKey(0);

 if(key == 'p' || key == 'P')//播放视频
  videoplay();
 if(key == 'q' || key == 'Q')//退出
  break;
 }
 return 0;
}

//打开录像
int videoplay()
{
 VideoCapture video("录像.avi");
 if(!video.isOpened())
 {
 fprintf(stderr,"打开失败\n");
 return false;
 }
 while(1)
 {
 Mat frame;
 video>>frame;

 if(frame.empty())
 {
  break;
 }
 cvNamedWindow("视频", CV_WINDOW_AUTOSIZE);
 imshow("视频",frame);
 waitKey(30);
 }
 cvDestroyWindow("视频");
 return 0;
}

//滑轨设定阈值判定是否保存当前摄像头图片
void on_Trackbar(int ,void*)
{
 //保存来人图片
 if(g_pixel > g_pointnum)
 {
 g_npic++;
 if(g_npic > 5)//为了避免风吹草动,小延迟之后才保存图片
 {
  //保存图片
  cout << endl << endl;
  cout << "场地异常,警报响应,准备拍照...\a" << endl;
  imwrite(str_gettime(),g_filpdstMat);
  cout << "当前白色像素点:" <<g_pixel << endl;
  cout << "按ESC退出" << endl;
  cout << endl;
  g_npic = 0;
 }
 }
}

//获取当前日期
char* str_gettime()
{
 char tmpbuf[10];

 //从tz设置时区环境变量
 _tzset();//时间函数

 //显示当前日期
 _strdate(tmpbuf);
 g_str[0] = tmpbuf[6];
 g_str[1] = tmpbuf[7];
 g_str[2] = tmpbuf[0];
 g_str[3] = tmpbuf[1];
 g_str[4] = tmpbuf[3];
 g_str[5] = tmpbuf[4];

 _strtime(tmpbuf);
 //时分秒
 g_str[6] = tmpbuf[0];
 g_str[7] = tmpbuf[1];
 g_str[8] = tmpbuf[3];
 g_str[9] = tmpbuf[4];
 g_str[10] = tmpbuf[6];
 g_str[11] = tmpbuf[7];

 //规定图片jpg格式
 g_str[12] = '.';
 g_str[13] = 'j';
 g_str[14] = 'p';
 g_str[15] = 'g';
 g_str[16] = '\0';

 //显示获取图像时间
 printf("生成图片:%s\n", g_str);
 return g_str;

}

int bSums(Mat src)
{

 int counter = 0;
 //迭代器访问像素点
 Mat_<uchar>::iterator it = src.begin<uchar>();
 Mat_<uchar>::iterator itend = src.end<uchar>();
 for (; it!=itend; ++it)
 {
 if((*it)>0) counter+=1;//二值化后,像素点是0或者255
 }
 return counter;
}

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

(0)

相关推荐

  • Python+OpenCV采集本地摄像头的视频

    本文实现了用Python和OpenCV配合,调用本地摄像头采集视频,基本上函数的话看opencv的官方文档就Ok了(The OpenCV Reference Manual  Release 2.4.7.0) 上代码: import cv2 import cv2.cv def getCam(): window_name='show image' cv2.namedWindow(window_name,cv2.WINDOW_NORMAL) video_cap_obj=cv2.VideoCapture

  • opencv实现图片与视频中人脸检测功能

    本文实例为大家分享了opencv实现人脸检测功能的具体代码,供大家参考,具体内容如下 第一章:反思与总结 上一篇博客我相信自己将人脸检测中的AdaBoost算法解释的非常清晰了,以及如何训练人脸检测的强分类器:人脸检测中AdaBoost算法详解.事后,自我感觉对这个人脸检测还是不够具体,所以自己抽了一下午的时间用opencv实现图片与视频中的人脸检测,下面是我用vs2013加opencv4.9来实现的.做一下声明,我的代码是参考OpenCV实现人脸检测的一个博客写的,非常感谢这位博主,我学到了很

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    起因 说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个.要是OpenCV+python.貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛.谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~ 依赖的包 在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦! import cv2 import numpy as np from PyQt5.QtWidge

  • Opencv实现读取摄像头和视频数据

    实际上,按一定速度读取摄像头视频图像后,便可以对图像进行各种处理了. 那么获取主要用到的是VideoCapture类,一个demo如下: //如果有外接摄像头,则ID为0,内置为1,否则用0就可以表示内置摄像头 cv::VideoCapture cap(0); //判断摄像头是否打开 if(!cap.isOpened()) { return -1; } cv::Mat myframe; cv::Mat edges; bool stop = false; while(!stop) { //获取当前

  • OpenCV实现智能视频监控

    本文实例为大家分享了OpenCV实现智能视频监控的具体代码,供大家参考,具体内容如下 之前在做毕设的时候网上找个完整的实现代码挺麻烦的,自己做完分享一下 因为代码较为简单,没有将代码分开写在不同文件,有需要自己整合下哈 使用环境Visual Studio 2010 和 OpenCV 2.4.9 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <ctime> usi

  • 关于.NET/C#/WCF/WPF 打造IP网络智能视频监控系统的介绍

    OptimalVision网络视频监控系统 OptimalVision(OV)网络视频监控系统(Video Surveillance System),是一套基于.NET.C#.WCF.WPF等技术构建的IP网络视频监控系统.设计与实现该系统的初衷是希望在家用电脑中部署该系统,连接本地或局域网设备,通过浏览器或手机客户端浏览宝宝实时视频,也就是俗称的"宝宝在线"或"家庭看护". 但由于业余时间总是有限,完成系统中的服务.配置.采集.传输和桌面GUI部分后,继续完成后续

  • 通过 Python 和 OpenCV 实现目标数量监控

    今天我们将利用python+OpenCV实现对视频中物体数量的监控,达到视频监控的效果,比如洗煤厂的监控水龙头的水柱颜色,当水柱为黑色的超过了一半,那么将说明过滤网发生了故障.当然不仅如此,我们看的是图像视频处理的技巧,你也可以将项目迁移到其他地方等,这仅仅是一个例子而已.我们知道计算机视觉中关于图像识别有四大类任务: . 分类-Classification:解决"是什么?"的问题,即给定一张图片或一段视频判断里面包含什么类别的目标. 定位-Location:解决"在哪里?&

  • Pygame与OpenCV联合播放视频并保证音画同步

    Pygame是一个超好用的SDL绑定.自从有了Pygame,妈妈再也不用担心我内存泄漏了. 但是这里有一个问题,Pygame的Movie模块已经废弃多年,这次做课题项目却要在一个游戏中来段视频播放.有点蒙圈.Ren'py提供的解决方案是使用libav,我尝试了一早上也搞不明白pyav怎么用.后来干脆用手边的OpenCV硬读视频吧. 这里说下第三方库: pygame numpy opencv-python 其中,numpy是Anaconda自带,我没自己装过不知道,但是其他两个都是可以用pip直接

  • vue + typescript + video.js实现 流媒体播放 视频监控功能

    视频才用流媒体,有后台实时返回数据, 要支持flash播放, 所以需安装对应的flash插件.当视频播放时,每间隔3秒向后台发送请求供检测心跳,表明在线收看状态,需要后台持续发送视频数据. 1. yarn add video.js videojs-flash 2. 创建videp.js声明文件 3. 创建video_player.vue组件,供外部调用.源码如下 <script lang="ts"> import { Component, Emit, Prop, Vue }

  • Python OpenCV对本地视频文件进行分帧保存的实例

    如下所示: # coding=utf-8 import os import cv2 videos_src_path = "/home/wgp/视频/" video_formats = [".MP4", ".MOV"] frames_save_path = "/home/wgp/视频/" width = 320 height = 240 time_interval = 50 def video2frame(video_src_p

  • python opencv 读取本地视频文件 修改ffmpeg的方法

    Python + opencv 读取视频的三种情况: 情况一:通过摄像头采集视频 情况二:通过本地视频文件获取视频 情况三:通过摄像头录制视频,再读取录制的视频 摄像头采集.本地视频文件的读取.写视频文件,网上都有代码. 我发现情况一和情况三都没有问题,大家注意读取自己通过摄像头录制的视频文件是没有问题的.但读取其他视频都会发现帧率为0(如果你获取视频的帧率并打印出来的话),并且退出读取.这时候读取是不成功的. 进去正题:如何解决读取视频失败的情况.这个问题很普遍,以至在官方教程的程序下面都提示

  • python opencv读mp4视频的实例

    如下所示: #获得视频的格式 videoCapture = cv2.VideoCapture('/home/lw/3661.mp4') #获得码率及尺寸 fps = videoCapture.get(cv2.CAP_PROP_FPS) size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) fNUMS = videoCapture.get(

  • 如何用OpenCV -python3实现视频物体追踪

    opencv OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python.Java and MATLAB/OCTAVE(版本2.

  • opencv设置采集视频分辨率方式

    如下所示: #include <opencv2\opencv.hpp> #include<ctime> using namespace cv; using namespace std; int main( ) { //[1]从摄像头读入视频 VideoCapture capture(0); //[2]循环显示每一帧 int j=0; capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080); capture.set(CV_CAP_PROP_FRAME_H

随机推荐