基于OpenCV实现实时监控并通过运动检测记录视频
一、课程介绍
1. 课程来源
课程使用的操作系统为 Ubuntu 14.04
,OpenCV 版本为OpenCV 2.4.13.1
,你可以在这里查看该版本 OpenCV 的文档。官方文档中有两个例子可以帮助你理解此课程,分别是
你可以在我的 Github仓库 上找到 Windows 系统对应的 Visual Studio 工程。全部代码文件也可以在我的仓库中找到。
这里提供了完整的代码 http://labfile.oss.aliyuncs.com/courses/671/monitor-recorder.zip 。
2. 内容简介
- 课程实验使用PC机自带的摄像头作为监视器进行实时监控。
- 对原始图像做一定处理,使监控人员或监控软件更易发现监控中存在的问题。
- 当摄像头捕捉到运动产生时自动记录视频。
3. 课程知识点
本课程项目完成过程中将学习:
- 对摄像头数据的捕获
- 对捕获到的监控帧作背景处理
- 对监控视频做运动检测并记录视频
二、实验环境
本实验需要先在实验平台安装 OpenCV ,需下载依赖的库、源代码并编译安装。安装过程建议按照教程给出的步骤,或者你可以参考官方文档中 Linux 环境下的安装步骤,但 有些选项需要变更。安装过程所需时间会比较长,这期间你可以先阅读接下来的教程,在大致了解代码原理后再亲自编写尝试。
我提供了一个编译好的
2.4.13-binary.tar.gz
包,你可以通过下面的命令下载并安装,节省了编译的时间,通过这个包安装大概需要20~30分钟,视实验楼当前环境运转速度而定。$ sudo apt-get update$ sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev$ cd ~$ mkdir OpenCV && cd OpenCV$ wget http://labfile.oss.aliyuncs.com/courses/671/2.4.13-binary.tar.gz$ tar -zxvf 2.4.13-binary.tar.gz$ cd opencv-2.4.13$ cd build$ sudo make install
如果你想体验编译的整个过程,我也提供了一个一键安装的脚本文件,你可以通过下面的命令尝试。这个过程会非常漫长,约2小时,期间可能还需要你做一定的交互确认工作。
$ cd ~$ sudo apt-get update$ wget http://labfile.oss.aliyuncs.com/courses/671/opencv.sh$ sudo chmod 777 opencv.sh$ ./opencv.sh
如果你觉得有必要亲自尝试一下安装的每一步,可以按照下面的命令逐条输入执行,在实验楼的环境中大概需要两个小时。
$ sudo apt-get update$ sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev$ wget https://github.com/Itseez/opencv/archive/2.4.13.zip$ unzip 2.4.13.zip$ cd 2.4.13$ mkdir release && cd release$ cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_GTK=ON -D WITH_OPENGL=ON ..$ sudo make$ sudo make install$ sudo gedit /etc/ld.so.conf.d/opencv.conf $ 输入 /usr/local/lib,按 Ctrl + X 退出,退出时询问是否保存,按 Y 确认。$ sudo ldconfig -v$ sudo gedit /etc/bash.bashrc$ 在文件末尾加入$ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfigexport PKG_CONFIG_PATH按 Ctrl + X 退出,按 Y 确认保存。
检验配置是否成功。将 OpenCV 自带的例子(在目录
PATH_TO_OPENCV/samples/C
下)运行检测。如果成功,将显示 lena 的脸部照片,同时圈出其面部。$ cd samples/C$ ./build_all.sh$ ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg
三、实验原理
实验通过 OpenCV 提供的 API 完成大部分任务,首先捕获摄像头数据,之后对捕获到的每一帧作背景减除处理,得出易于识别的图像,最后利用直方图做实时图像和背景图像的对比,实现运动检测并写入视频文件。
四、实验步骤
通过以下命令可下载项目源码,作为参照对比完成下面详细步骤的学习。
wget http://labfile.oss.aliyuncs.com/courses/671/monitor-recorder.zipunzip monitor-recorder.zip
1.定义头文件
工程文件由一个头文件 monitor.hpp
和一个入口文件 main.cpp
构成。首先在头文件中定义将使用的库和相关变量。
代码中使用到的 OpenCV 头文件和 C++ 头文件在头文件 monitor.hpp
中声明如下,其中 unistd.h
包含了 Linux 下的 sleep
函数,参数为睡眠的秒数。
#ifndef __MONITOR_H_#define __MONITOR_H_//opencv#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/video/background_segm.hpp>#include <opencv2/objdetect/objdetect.hpp>#include <opencv2/imgproc/imgproc.hpp>//C++#include <ctime>#include <iostream>#include <string>#include <cstdio>#include <unistd.h> #include <sstream>using namespace cv;using namespace std;// ...#endif __MONITOR_H_
2.设计 processCamera
函数
processCamera
负责完成主