当有移动物体经过时,摄像头便自动抓拍并把拍到的图像存储在指定目录,实现无人监控功能。
motion 是一套免费开源的移动图像监测程序(详见http://www.lavrsen.dk/foswiki/bin/view/Motion)
源代码:https://github.com/xiaobo-linux/motion
解压源码,进入到目录里面运行
./configure --prefix=/${PWD}/_install / ( 自定义安装目录,我是直接安装源码下)
然后运行
mkdir _install
make
make install
cd _install
cp etc/motion-dist.conf etc/motion.conf
编辑配置文件:
vi etc/motion.conf(里面的具体配置意义可以看它的注释,或者见http://www.lavrsen.dk/foswiki/bin/view/Motion/ConfigFileOptions)
关键的几点配置:
daemon off #关掉deamon模式
locate_motion_mode on #探测到图像中有运动时,把运动区域用矩形框起来
videodevice /dev/video0 #加载USB摄像头的设备(对应自己的摄像头设备)
width 640 #图像宽度
height 480 #图像高度
target_dir /root/motion #设置拍摄图片的存储目录
threshold 3000 #这个是改变探测灵敏度,越小越灵敏,这里设为3000像素值
8081端口登录,需要输入用户和密码进行用户登录验证:
# Authentication for the stream. Syntax username:password
# Default: not defined (Disabled)
stream_authentication username:passwd
192.168.1.100:8080 (motion的配置页面,里面有很多motion的配置选项)
192.168.1.100:8081 (motion的网络监控地址)
如果使用外网的话,stream_loacalhost off
然后就可以运行motion了
./motion
在摄像头前面移动,motion就会监测到物体移动,然后将捕捉到的图像保存到指定的目录下面
配置多个摄像头的方法是:
把motion 可执行文件跟要控制的摄像头的配置文件 motion.conf 放在一块
motion + motion.conf 放在一起;
多个摄像头的话, 把 motion + motion.conf 放在别的文件夹内执行,motion.conf只需配置video编号跟浏览器查看摄像头的端口号
执行 ./moion 即可。
这样编译成的motion是没有视频编码功能的,要想将监控程序保存成视频文件,还要进行下面的更改。
重新配置motion之前还要先做好FFmpeg的编译准备工作。
先去下载FFmpeg
https://github.com/dwbuiten/FFmpeg
解压进入FFmpeg的目录,运行:
./configure --enable-memalign-hack --disable-debug --prefix=/${PWD}/_install / (自定义安装目录,我是直接安装源码下)
(FFmpeg的编译详细参数参考http://www.cnblogs.com/ohmytime/archive/2013/05/12/ffmpeg-build-help.html)
在配置的时候会提示找不到yasm的错误(我的fedora 10是这样的,具体错误原因记不住了。。。)
去下载一个编译安装就好了:https://github.com/yasm/yasm
(安装方法:解压进入yasm,运行./autogen.sh 然后make && make install即可)
再执行
make
make install
进入到 _install目录下可以看到生成的库文件以及可执行文件。可以测试一下_install/bin目录下的ffplay 播放器
ffplay /home/test.mp4(视频文件为自己指定的文件)
如果成功播放视频则表示FFmpeg库编译成功。接下来的工作会用到这个_install目录
进入到motion目录执行:
make distclean
/configure --prefix=/${PWD}/_install / --with-ffmpeg=FFmpeg/_install/ (这个就是刚才编译的库文件的目录)
make
在这一步会遇到一个错:/FFmpeg-master/libavformat/matroskadec.c:1173: undefined reference to `BZ2_bzDecompressInit'
解决办法是修改Makefile的第35行:
LIBS = -lm -lpthread -lSDL -lpthread -ljpeg -L/home/qin/FFmpeg-master/_install/lib -lavformat -lavcodec -lavutil -lm -lz -lsqlite3 -lbz2
(最后的红色字体部分是新加上的)
重新make即可
make && make install
安装成功后保证motion.conf配置文件正确的情况下运行motion:
./motion
motion还有很多功能,比如:
on_event_start /root/detected #当该事件产生时执行detected脚本,该脚本是简单的可执行shell脚本,下同
on_event_end /root/end #当该事件产生时执行end脚本
gap 5 #设置,在探测到运动后,多长时间没有运动的话就触发运动结束指令on_event_end。
还可以设置报警等功能。
如果把这个移植到开发板上,然后弄上个usb的摄像头,就可以实现实时视频监控或者移动图像的监控了.
选项 | Range/Values Default | 说明 |
---|---|---|
auto_brightness | Values: on,off Default: off | 让motion自动调节视频的的亮度,只适用于不带有自动亮度调节的摄像机 |
brightness | Values: 0-255 Default: 0 (disabled) | 调整摄像机的亮度 |
saturation | Values: 0 - 255 Default: 0 (disabled) | 调整摄像机的颜色饱和度 |
hue | Values: 0 - 255 Default: 0 (disabled) | 调整摄像机的色调 |
contrast | Values: 0-255 Default: 0 (disabled) | 调整摄像机的对比度 |
daemon | Values: on,off Default: off | 以守护进程在后台运行。这个选项只能放在motion.conf,不能放在 thread config file |
emulate_motion | Values: on, off Default: off | 即使没有运动物体也要保存图像 |
ffmpeg_output_movies | Values: on, off Default: off | 是否保存视频 |
ffmpeg_bps | Values: 0 - 9999999 Default: 400000 | 视频比特率 |
ffmpeg_variable_bitrate | Values: 0, 2 - 31 Default: 0 (disabled) | 动态比特率,如果开启这个功能ffmpeg_bps将被忽略,0为关闭,2为最好质量,31为最差质量 |
ffmpeg_duplicate_frames | Values: on, off Default: on | 为了达到每秒的帧数要求,会复制一下帧填充空白时间,关掉这个功能后每个帧都紧接下一个帧,看起来像快进 |
ffmpeg_output_debug_movies | Values: on, off Default: off | 调试模式,只看到变化的图像 |
ffmpeg_video_codec | Values: mpeg4, msmpeg4, swf, flv, ffv1, mov, ogg, mp4, mkv, hevc Default: mpeg4 | 视频格式 |
framerate | Values: 2 - 100 Default: 100 (no limit) | 帧速率,每秒多少帧 |
frequency | Values: 0 - 999999 Default: 0 (Not set) | 频率协调 Hz,(不清楚作用) |
lightswitch | Values: 0 - 100 Default: 0 (disabled) | 忽略光照强度改变引起的变化 |
locate_motion_mode | Values: on, off, preview Default: off | 给运动物体用方框标出 |
locate_motion_style | Values: box, redbox, cross, redcross Default: box | 标记风格 |
max_movie_time | Values: 0 (infinite) - 2147483647 Default: 3600 | 最大视频时间 |
minimum_frame_time | Values: 0 - 2147483647 Default: 0 | 最小帧间隔,设置为0表示采用摄像头的帧率 |
minimum_motion_frames | Values: 1 - 1000s Default: 1 | 捕捉持续至少指定时间的运动帧 |
movie_filename | Values: Max 4095 characters Default: %v-%Y%m%d%H%M%S | 视频的文件名 |
ffmpeg_timelapse | Values: 0-2147483647 Default: 0 (disabled) | 间隔时间,拍摄延时视频 |
ffmpeg_timelapse_mode | Values: hourly, daily, weekly-sunday, weekly-monday, monthly, manual Default: daily | 延时拍摄模式 |
timelapse_filename | Values: Max 4095 characters Default: %v-%Y%m%d-timelapse | 延时拍摄的文件名 |
output_pictures | Values: on,off,first,best,center Default: on | 是否保存图片和模式设置 |
output_debug_pictures | Values: on,off Default: off | 图片调试模式,只输出运动物体 |
picture_filename | Values: Max 4095 characters Default: %v-%Y%m%d%H%M%S-%q | 图片文件名 |
picture_type | Values: jpeg,ppm Default: jpeg | 图片类型 |
post_capture | Values: 0 - 2147483647 Default: 0 (disabled) | 运动在持续多少帧之后才被捕捉 |
pre_capture | Values: 0 - 100s Default: 0 (disabled) | 输出图像包括捕捉到运动的前几秒 |
quality | Values: 1 - 100 Default: 75 | jpg图像的质量 |
quiet | Values: on, off Default: off | 安静模式,检测到运动不输出哔 |
rotate | Values: 0, 90, 180, 270 Default: 0 (not rotated) | 旋转图像角度 |
stream_auth_method | Values: 0,1,2 Default: 0 | 网页监控身份认证方法:0-无,1-基本,2-MD5 |
stream_authentication | Values: username:password Default: Not defined | 网页监控用户名和密码 |
stream_limit | Values: 0 - 2147483647 Default: 0 (unlimited) | 限制帧的数量 |
stream_localhost | Values: on, off Default: on | 是否只能本地访问网络摄像头 |
stream_maxrate | Values: 1 - 100 Default: 1 | 限制网络摄像头帧速率 |
stream_port | Values: 0 - 65535 Default: 0 (disabled) | 网络摄像头端口 |
stream_quality | Values: 1 - 100 Default: 50 | 网络摄像头传输质量 |
switchfilter | Values: on, off Default: off | 过滤器开关,过滤器用来区分真正的运动和噪声 |
target_dir | Values: Max 4095 characters Default: Not defined = current working directory | 视频和图片的保存路径 |
videodevice | Values: Max 4095 characters Default: /dev/video0 | 摄像头设备名 |
height | Values: Device Dependent Default: 288 | 图像高度,范围跟摄像机相关 |
width | Values: Device Dependent Default: 352 | 图像宽度,范围跟摄像机相关 |
process_id_file | Values: Max 4095 characters Default: Not defined | 保存PID的文件,推荐/var/run/motion.pid |
database_busy_timeout | Values: 0 .. positive integer Default: 0 | 数据库等待超时时间,毫秒 |