树莓派3B+ 安装motion用自带CSI摄像头做网页监控

硬件准备:

树莓派3B+,500万CSI模块摄像头

系统环境:

pi@raspberrypi:~ $ cat /etc/issue
Raspbian GNU/Linux 9 \n \l
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux

首先在树莓派上有两种实现方案(我所知道的)。一种是用mjpg-streamer,一种是motion。motion是Linux下一款开源的摄像头监控软件,用命令行运行,只保存有运动物体的图像。当前教程使用的是motion,比较简单的一种。那么这款软件的优点就是安装配置简单,缺点就是拍摄有延迟,画面不清楚,不过后面第7步我会教大家怎么去优化。

1、安装

sudo apt install motion -y

2、配置

备份配置文件

sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.bak

编辑配置文档

sudo vim /etc/motion/motion.conf

更改文档中以下内容

daemon on       #改为on,后台运行

videodevice /dev/video0     #这个表示motion软件会使用这个设备,如果你的树莓派上没有这个文件,参考我之前的文章进行设置

width 640           #图像的宽

height 480           #图像的高

framerate 2                         #帧率,相当于fps,自动监控拍照,帧率没必要太高,否则输出的文件很多

threshold 3000                 #多少个像素发生改变的时候,保存当前照片

output_pictures on                 #开启自动保存运动图片

ffmpeg_output_movies on    #开启自动保存运动视频

ffmpeg_variable_bitrate    0 # 0, 2 - 31  动态比特率

target_dir /home/pi/motion-images           #图片保存的路径

stream_port 8081                #串流端口

stream_quality  50            #网络摄像头传输质量

stream_maxrate  1               #摄像头帧速率,数字越大延迟越小

stream_localhost off              #只通过本地串流关闭

stream_auth_method2                #开启密码认证

stream_authentication   #用户名:密码     #网页查看摄像头的用户名和密码4

webcontrol_port 8080             #通过网页控制的端口

webcontrol_localhost on         #只能通过本地进行网页控制打开


创建一个目录来存放motion拍下的运动图像

mkdir ~/motion-images

官方详细配置说明:http://lavrsen.dk/foswiki/bin/view/Motion/ConfigFileOptions

3、运行

sudo motion

用浏览器登陆树莓派的网址192.168.1.105:8081,会弹出用户名和密码的对话框,输入用户名和密码后看到图像就成功了。

4.、停止

sudo pkill motion
sudo systemctl stop motion.service
sudo service motion stop

不过有时候这两个命都不能停止motion的运行,那只好用脚本解决了

sudo nano motionstop.sh
#!/bin/bash
sudo ps -aux | grep motion | awk '{print $2}' | head -1 | xargs sudo kill -9
chmod +x motionstop.sh

接下先sudo motion

摄像头红灯亮

./motionstop.sh

摄像头红灯灭,motion进程被杀死

或者另外一种:

运行这条命令停止

sudo ps -C motion --noheader | awk '{print $1}' | xargs sudo kill -9

也可以写进脚本里面运行,方法和第一个是一样的。

5、设置为开机启动

sudo systemct  enable motion.service

或者

sudo vim /etc/rc.local

在exit 0前添加 motion , 保存,就会开机自动运行了。

6、防火墙开放端口

由于我在树莓派装了redhat的防火墙,故此处必须在防火墙开放端口,否则只能在树莓派本地通过网页访问

sudo firewall-cmd --permanent --add-port=8081/tcp
sudo firewall-cmd --reload

防火墙.png

现在可以再电脑上浏览器地址栏输入树莓派IP:8081查看效果了

实测支持UC,谷歌浏览器,IE打开地址会转到搜索,QQ浏览器会变成下载文件。

树莓派摄像头成功显示.png

前面介绍中说了motion会保存运动物体的图片,进入目录一看,这不一会就保存了好几十张图片

QQ浏览器截图20180731144227.png


7、优化

1、延迟和流畅度

主要优化的是延迟问题,如果只改默认配置那延迟相当严重,经过修改配置优化过后延迟和画质会有一个质的提升,但是占用带宽会达到10M-60M左右,也就是你在浏览器看监控的时候,电脑管家会显示每秒有1M-6M以上的下载。没有优化的话延迟在3-5秒,但是带宽只会占用1M左右,建议弄两份配置切换着使用,

sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.youuhua

切换配置记得先停止再启动,不然切换另一份配置文件之后是不会生效的。当然也可能你觉得优化过后还是不满意,那么请看我另一篇文章,安装mjpg-streamer来监控,不过默认情况下它占用带宽更高,达到了20M-50M左右,每秒有2-4.5M以上的下载量,而且画面不能像motion一样调整大小,打开网页界面重视固定大小,而motion你调整了宽度和高度之后网页的监控面积也会增大和缩小,所以说相比之下各有胜负!

那么改哪几个地方了?

sudo vim /etc/motion/motion.conf
framerate 30  #帧率 这个和下面的stream_maxrate是对应的,这里是摄像头原始帧率,也就是fps,下面那个是网络传输帧率,超过30就浪费带宽了,但是效果提升却看不上出来。
ffmpeg_variable_bitrate    2 #改为2,默认0
stream_maxrate  30   #默认1,改为30              #摄像头帧速率,数字越大延迟越小,和frame rate参数应该一致。
stream_quality  100  #默认50,改为100  网络摄像头传输质量

这三个地方改完之后

sh motionstop.sh

停止motion

sudo motion

再次启动motion

你会发现画质和延迟都有极大的改观。

2、关闭自动拍照和录像

另一个优化就是,默认情况motion都会对镜头中移动的物体进行拍照和录制视频,这样很占内存卡空间和影响使用寿命,只需要

sudo nano /etc/motion/motion.conf
output_pictures off      #关闭自动保存运动图片
ffmpeg_output_movies off    #关闭自动保存运动视频


8、照片上传到网盘:

将https://github.com/houtianze/bypy里的bypy.py bypygui.pyw setup.py上传到baidu目录里,并chmod 755 bypy.py权限

需要先认证:

pi@raspberrypi:~/code/baidu $ sudo python bypy.py syncup


Please visit:
https://openapi.baidu.com/oauth/2.0/authorize?scope=basic+netdisk&redirect_uri=oob&response_type=code&client_id=q8WE4xxxxxxxxxxxxxxxx
And authorize this app
Paste the Authorization Code here within 10 minutes.
Press [Enter] when you are done
3ead6bbe8ea730735810af937bxxxxx
Authorizing, please be patient, it may take upto 60.0 seconds...
Authorizing/refreshing with the OpenShift server ...
Successfully authorized  说明认证成功

sudo vim /etc/motion/motion.conf

on_picture_save /home/pi/baidu/upload.sh %f  拍照后执行upload.sh

sudo vim upload.sh
#!/bin/sh
sudo python /home/code/baidu/bypy.py syncup /mnt/udisk/motion
sudo chmod 755 upload.sh

用设置上面的方法不好使,只能用下面的办法,每30秒上传图片到百度网盘,然后删除本地图片 :

#!/usr/bin/python
import os,sys
import time
 
while True:
        try:
                os.system("sudo python /home/pi/alex/code/motion_pic2baidu/bypy.py syncup /var/lib/motion")  #这里一定要用绝对路径,不然开机启动会找不到文件,默认是root账户目录
                os.system("sudo rm -rf /var/lib/motion/*")
 
                time.sleep(30)
        except Exception,e:
                with open("log.log","a") as f:
                        f.write("error!\n")

保存后可直接运行:

python upload.py &

#下面这句是说一旦有照片被拍下来,则执行upload.sh命令, 
#其中%f参数会自动转化为当前图片文件的路径,传给upload.sh: 

on_picture_save /home/pi/baidu/upload.sh %f

开机启动:

sudo vi /etc/rc.local

在exit 0前加上:

sudo python /home/pi/alex/code/motion_pic2baidu/upload.py &

9、部分详细配置选项的翻译

本人英语渣,有翻译不对的地方请指出

选项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    数据库等待超时时间,毫秒


10、解决网页播放不能全屏的缺点:

windows电脑下载VLC播放器,打开网络串流,输入地址http://树莓派IP:8081 即可全屏播放,至此,树莓派监控完美实现。

11、 Motion软件的拓展知识

根据motion实现在端口8081发送实时视频的源码(webcam.c)来看,motion是通过服务端推送技术(即使用x-mixed-replace这样一个特殊的内容头)将从摄象头处读取的图片推送到客户端的浏览器中。实际传输的数据是一系列JPEG图片(Content-type: image/jpeg)。所以一般来说只要客户端浏览器支持对x-mixed-replace的实现(比较新的浏览器应该都能处理这个头),应该不会有任何问题的。
浏览器会根据服务器发送过来的内容头,即Content-type所示来处理实际内容。例如Content-type: text/html,即按网页来处理。又如Content-type: image/jpeg,则将内容显示为图片(motion在8081端口上发送的就是一系列的jpeg)。如果服务器发送过来的内容头浏览器无法有效识别,则一般情况下浏览器会提示用户将内容保存到本地的文件中,即如上图所示的“下载”。
因此,在这里建议LZ先将浏览器提示要下载的内容保存到本地文件中,再查看该文件的内容,进而判断motion到底传了什么东西过来(如果不是JPEG数据那肯定是服务端发生的问题,否则就是客户端浏览器的问题了。),这样比较容易找到问题所在。



最后编辑于:2018/07/31作者: admin

发表评论