manbetx官方网站

内没人怎么防火防盗?装及就段机关看家程序。来探望机智的前端童鞋怎么防盗。

十月 22nd, 2018  |  manbet体育登录

假日马上快要交了,不少朋友将出门旅游或探亲访友。即使没有强迫症的汝,也许在锁门离开的转,心里也会泛起一丝淡淡的忧虑:离家这么长时,如何才能够担保家里所有平安?

来看看机智的前端童鞋怎么防盗

2016/07/12 · JavaScript
· 4 评论 ·
HTML5

原稿出处: VaJoy   

群付出的童鞋都是只身混江湖、夜宿城中村,如果住的地方安保欠缺,那么出门在外难免担心屋里的财安全。

实际世面上发多宏大上的防盗设施,但对灵动的前端童鞋来说,只要来同玉附带摄像头的计算机,就可以简简单单地促成一个防盗监控系统~

纯 JS 的“防盗”能力十分老程度靠 H5 canvas
的能力,且很幽默。如果你针对 canvas
还非熟识,可以先点这里阅读我的层层教程。

step1. 调用摄像头

我们要事先以浏览器上看同调用摄像头,用来监督室里之举止。不同浏览器被调用摄像头的
API 都稍发出入,在这边我们盖 chrome 做示范:

JavaScript

<video width=”640″ height=”480″ autoplay></video>
<script> var video = document.querySelector(‘video’);
navigator.webkitGetUserMedia({ video: true }, success, error); function
success(stream) { video.src = window.webkitURL.createObjectURL(stream);
video.play(); } function error(err) { alert(‘video error: ‘ + err) }
</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<video width="640" height="480" autoplay></video>
 
<script>
    var video = document.querySelector(‘video’);
 
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.webkitURL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert(‘video error: ‘ + err)
    }
</script>

运行页面后,浏览器出于安全性考虑,会了解是否同意时页面访问你的摄像头设备,点击“允许”后哪怕可知一直当
<video> 上来看拍摄头捕获到之画面了:

图片 1

step2. 捕获 video 帧画面

只不过开在摄像头监视房间可没其他意义,浏览器不会见协助您对监控画面进行剖析。所以这里我们胜利动用脚本捕获
video 上之轴画面,用于在此起彼伏进展多少解析。

自从此间开始我们就要靠 canvas
力量了。在 Canvas入门(五)一如既往软我们介绍过 ctx.drawImage()
方法,通过她可以捕获 video 帧画面并渲染到画布上。

咱得创造一个画布,然后这么写:

JavaScript

<video width=”640″ height=”480″ autoplay></video> <canvas
width=”640″ height=”480″></canvas> <script> var video =
document.querySelector(‘video’); var canvas =
document.querySelector(‘canvas’); // video捕获摄像头画面
navigator.webkitGetUserMedia({ video: true }, success, error); function
success(stream) { video.src = window.webkitURL.createObjectURL(stream);
video.play(); } function error(err) { alert(‘video error: ‘ + err) }
//canvas var context = canvas.getContext(‘2d’); setTimeout(function(){
//把当前瞧频帧内容渲染到画布上 context.drawImage(video, 0, 0, 640, 480);
}, 5000); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<video width="640" height="480" autoplay></video>
<canvas width="640" height="480"></canvas>
 
<script>
    var video = document.querySelector(‘video’);
    var canvas = document.querySelector(‘canvas’);
 
    // video捕获摄像头画面
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.webkitURL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert(‘video error: ‘ + err)
    }
 
    //canvas
    var context = canvas.getContext(‘2d’);
 
    setTimeout(function(){
        //把当前视频帧内容渲染到画布上
        context.drawImage(video, 0, 0, 640, 480);
    }, 5000);
 
</script>

苟齐代码所示,5秒后把张频帧内容渲染到画布上(下方右图)

图片 2

step3. 对捕获的简单只帧画面执行差别混合

在点我们提到了,要得力地分辨某个场景,需要对视频画面进行数据解析。

那一旦怎么辨识咱们的房子是否有人忽然闯入了吗?答案非常简短 —— 定时地捕获
video 画面,然后对比前后两幅内容是否存在比较充分变。

咱们事先简单地勾勒一个定时捕获的点子,并拿捕获到之帧数据存起来:

JavaScript

//canvas var context = canvas.getContext(‘2d’); var preFrame, //前一帧
curFrame; //当前帧 //捕获并保存帧内容 function captureAndSaveFrame(){
console.log(context); preFrame = curFrame; context.drawImage(video, 0,
0, 640, 480); curFrame = canvas.toDataURL; //转为base64并保存 }
//定时捕获 function timer(delta){ setTimeout(function(){
captureAndSaveFrame(); timer(delta) }, delta || 500); } timer();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    //canvas
    var context = canvas.getContext(‘2d’);
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){ console.log(context);
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL;  //转为base64并保存
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            timer(delta)
        }, delta || 500);
    }
 
    timer();

若果达到代码所示,画布会每隔500毫秒捕获并渲染一潮 video
的轴内容(夭寿哇,做扫尾这个动作不小心将饼干洒了一致地。。。\(“▔□▔)/)

图片 3

小心这里我们运用了 canvas.toDataURL 方法来保存帧画面。

接着就是数据解析处理了,我们可以通过比前后捕获的轴画面来判断摄像头是否监控到转,那么怎么开呢?

习设计之同校肯定常常使一个图层功能 —— 混合模式:

图片 4

当起星星点点独图层时,对顶层图层设置“差值/Difference”的良莠不齐模式,可以看透地观望个别单图层的别:

图片 5

“图A”是自个儿去年在商店楼下拍的照片,然后我将她稍微调亮了一点点,并当地方画了一个
X 和 O
得到“图B”。接着自己把它为“差值”模式混合在一起,得到了极右边的当下张图。

JavaScript

“差值”模式原理:要杂图层双方的RGB值中每个值分别开展比较,用高值减去低值作为合成后底颜料,通常用白色图层合成一图像时,可以获得负片效果的反倒相图像。用黑色的语句不发出其他变化(黑色亮度最低,下层颜色减去最好小颜色值0,结果以及原先同),而因此白色会得到反相效果(下层颜色为削弱去,得到补值),其它颜色则根据它的亮度水平

1
“差值”模式原理:要混合图层双方的RGB值中每个值分别进行比较,用高值减去低值作为合成后的颜色,通常用白色图层合成一图像时,可以得到负片效果的反相图像。用黑色的话不发生任何变化(黑色亮度最低,下层颜色减去最小颜色值0,结果和原来一样),而用白色会得到反相效果(下层颜色被减去,得到补值),其它颜色则基于它们的亮度水平

在CSS3中,已经有 blend-mode
特性来支持这个妙不可言的混合模式,不过我们发现,在主流浏览器上,canvas
的 globalCompositeOperation 接口也曾完美支持了图像混合模式:

乃我们还修多一个画布来展示前后两幅差异:

JavaScript

<video width=”640″ height=”480″ autoplay></video> <canvas
width=”640″ height=”480″></canvas> <canvas width=”640″
height=”480″></canvas> <script> var video =
document.querySelector(‘video’); var canvas =
document.querySelectorAll(‘canvas’)[0]; var canvasForDiff =
document.querySelectorAll(‘canvas’)[1]; // video捕获摄像头画面
navigator.webkitGetUserMedia({ video: true }, success, error); function
success(stream) { video.src = window.URL.createObjectURL(stream);
video.play(); } function error(err) { alert(‘video error: ‘ + err) }
//canvas var context = canvas.getContext(‘2d’), diffCtx =
canvasForDiff.getContext(‘2d’); //将第二只画布混合模式要为“差异”
diffCtx.globalCompositeOperation = ‘difference’; var preFrame, //前一帧
curFrame; //当前帧 //捕获并保存帧内容 function captureAndSaveFrame(){
preFrame = curFrame; context.drawImage(video, 0, 0, 640, 480); curFrame
= canvas.toDataURL(); //转为base64并保存 } //绘制base64图像及画布上
function drawImg(src, ctx){ ctx = ctx || diffCtx; var img = new Image();
img.src = src; ctx.drawImage(img, 0, 0, 640, 480); } //渲染前后两轴差异
function renderDiff(){ if(!preFrame || !curFrame) return;
diffCtx.clearRect(0, 0, 640, 480); drawImg(preFrame); drawImg(curFrame);
} //定时捕获 function timer(delta){ setTimeout(function(){
captureAndSaveFrame(); renderDiff(); timer(delta) }, delta || 500); }
timer(); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<video width="640" height="480" autoplay></video>
<canvas width="640" height="480"></canvas>
<canvas width="640" height="480"></canvas>
 
<script>
    var video = document.querySelector(‘video’);
    var canvas = document.querySelectorAll(‘canvas’)[0];
    var canvasForDiff = document.querySelectorAll(‘canvas’)[1];
 
    // video捕获摄像头画面
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.URL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert(‘video error: ‘ + err)
    }
 
    //canvas
    var context = canvas.getContext(‘2d’),
        diffCtx = canvasForDiff.getContext(‘2d’);
    //将第二个画布混合模式设为“差异”
    diffCtx.globalCompositeOperation = ‘difference’;
 
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL();  //转为base64并保存
    }
 
    //绘制base64图像到画布上
    function drawImg(src, ctx){
        ctx = ctx || diffCtx;
        var img = new Image();
        img.src = src;
        ctx.drawImage(img, 0, 0, 640, 480);
    }
 
    //渲染前后两帧差异
    function renderDiff(){
        if(!preFrame || !curFrame) return;
        diffCtx.clearRect(0, 0, 640, 480);
        drawImg(preFrame);
        drawImg(curFrame);
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            timer(delta)
        }, delta || 500);
    }
 
    timer();
 
</script>

意义如下(夭寿啊,做扫尾这个动作我又将雪碧洒在键盘上了。。。(#--)/

图片 6

好望,当前晚少幅差异很小时,第三独画布几乎是雾里看花的同切开,只有当照头捕获到动作了,第三单画布才起显著的高亮内容出现。

故,我们才待针对第三单画布渲染后的图像进行像素分析——判断该高亮阈值是否达到某个指定预期:

JavaScript

var context = canvas.getContext(‘2d’), diffCtx =
canvasForDiff.getContext(‘2d’); //将第二单画布混合模式使为“差异”
diffCtx.globalCompositeOperation = ‘difference’; var preFrame, //前一帧
curFrame; //当前帧 var diffFrame; //存放差异帧的imageData
//捕获并保存帧内容 function captureAndSaveFrame(){ preFrame = curFrame;
context.drawImage(video, 0, 0, 640, 480); curFrame = canvas.toDataURL();
//转为base64并保存 } //绘制base64图像及画布上 function drawImg(src,
ctx){ ctx = ctx || diffCtx; var img = new Image(); img.src = src;
ctx.drawImage(img, 0, 0, 640, 480); } //渲染前后两幅差异 function
renderDiff(){ if(!preFrame || !curFrame) return; diffCtx.clearRect(0, 0,
640, 480); drawImg(preFrame); drawImg(curFrame); diffFrame =
diffCtx.getImageData( 0, 0, 640, 480 ); //捕获差异帧的imageData对象 }
//计算差异 function calcDiff(){ if(!diffFrame) return 0; var cache =
arguments.callee, count = 0; cache.total = cache.total || 0;
//整个画布都是白色时有所像从的价值的总数 for (var i = 0, l =
diffFrame.width * diffFrame.height * 4; i < l; i += 4) { count +=
diffFrame.data[i] + diffFrame.data[i + 1] + diffFrame.data[i + 2];
if(!cache.isLoopEver){ //只待以第一浅循环里执行 cache.total += 255 * 3;
//单只白像素值 } } cache.isLoopEver = true; count *= 3; //亮度放大
//返回“差异画布高亮部分如素总值”占“画布全亮情况像素总值”的百分比 return
Number(count/cache.total).toFixed(2); } //定时捕获 function
timer(delta){ setTimeout(function(){ captureAndSaveFrame();
renderDiff(); setTimeout(function(){ console.log(calcDiff()); }, 10);
timer(delta) }, delta || 500); } timer();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    var context = canvas.getContext(‘2d’),
        diffCtx = canvasForDiff.getContext(‘2d’);
    //将第二个画布混合模式设为“差异”
    diffCtx.globalCompositeOperation = ‘difference’;
 
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    var diffFrame;  //存放差异帧的imageData
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL();  //转为base64并保存
    }
 
    //绘制base64图像到画布上
    function drawImg(src, ctx){
        ctx = ctx || diffCtx;
        var img = new Image();
        img.src = src;
        ctx.drawImage(img, 0, 0, 640, 480);
    }
 
    //渲染前后两帧差异
    function renderDiff(){
        if(!preFrame || !curFrame) return;
        diffCtx.clearRect(0, 0, 640, 480);
        drawImg(preFrame);
        drawImg(curFrame);
        diffFrame = diffCtx.getImageData( 0, 0, 640, 480 );  //捕获差异帧的imageData对象
    }
 
    //计算差异
    function calcDiff(){
        if(!diffFrame) return 0;
        var cache = arguments.callee,
            count = 0;
        cache.total = cache.total || 0; //整个画布都是白色时所有像素的值的总和
        for (var i = 0, l = diffFrame.width * diffFrame.height * 4; i < l; i += 4) {
            count += diffFrame.data[i] + diffFrame.data[i + 1] + diffFrame.data[i + 2];
            if(!cache.isLoopEver){  //只需在第一次循环里执行
                cache.total += 255 * 3;   //单个白色像素值
            }
        }
        cache.isLoopEver = true;
        count *= 3;  //亮度放大
        //返回“差异画布高亮部分像素总值”占“画布全亮情况像素总值”的比例
        return Number(count/cache.total).toFixed(2);
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            setTimeout(function(){
                console.log(calcDiff());
            }, 10);
 
            timer(delta)
        }, delta || 500);
    }
 
    timer();

专注这里我们下了 count *= 3
来放开差异高亮像从的亮度值,不然得出的数值实在太小了。我们运行下页面(图片于充分加载会发点慢)

图片 7

经试(xia)验(bai),个人认为如 calcDiff() 返回的比值如果过量
0.20,那么就足以定性为“一内空屋子,突然有人锻炼进来”的气象了。

step4. 上报异常图片

当上述的精打细算发现发生气象时,需要出某种途径通知我们。有钱生生机的语可以安排个邮件服务器,直接发邮件甚至短信通知到温馨,but
本文走之吃吐少年路线,就不闹的那高端了。

那么要怎样简单地贯彻好图片的申报也?我小还想到的凡 ——
直接把问题图片发送到有站点中失去。

这边我们选取博客园的“日记”功能,它好肆意上污染相关内容。

JavaScript

p.s.,其实这里原本是纪念直接拿图片传遍博客园相册上之,可惜POST请求的图纸实体要求走
file 格式,即无法通过脚本更改文件之 input[type=file],转 Blob
再上传也从没因此,只好作罢。

1
p.s.,其实这里原本是想直接把图片传到博客园相册上的,可惜POST请求的图片实体要求走 file 格式,即无法通过脚本更改文件的 input[type=file],转 Blob 再上传也没用,只好作罢。

咱俩当管制后台创建日记时,通过 Fiddler 抓包可看出那个要参数非常简单:

图片 8

就此得以一直组织一个呼吁:

JavaScript

//异常图片上传处理 function submit(){ //ajax 提交form $.ajax({ url :
‘http://i.cnblogs.com/EditDiary.aspx?opt=1’, type : “POST”, data : {
‘__VIEWSTATE’: ”, ‘__VIEWSTATEGENERATOR’: ‘4773056F’,
‘Editor$Edit$txbTitle’: ‘告警’ + Date.now(), ‘Editor$Edit$EditorBody’:
‘<img src=”‘ + curFrame + ‘” />’, ‘Editor$Edit$lkbPost’: ‘保存’ },
success: function(){ console.log(‘submit done’) } }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    //异常图片上传处理
    function submit(){
 
        //ajax 提交form
        $.ajax({
            url : ‘http://i.cnblogs.com/EditDiary.aspx?opt=1’,
            type : "POST",
            data : {
                ‘__VIEWSTATE’: ”,
                ‘__VIEWSTATEGENERATOR’: ‘4773056F’,
                ‘Editor$Edit$txbTitle’: ‘告警’ + Date.now(),
                ‘Editor$Edit$EditorBody’: ‘<img src="’ + curFrame + ‘" />’,
                ‘Editor$Edit$lkbPost’: ‘保存’
            },
            success: function(){
                console.log(‘submit done’)
            }
        });
    }

当要请页面和博客园域名不同,是无能为力发送 cookie
导致请求跨域而失效,不过是老好解决,直接修改 host
即可(怎么改就无介绍了,自行百度吧)

本身就边改了 host,通过 http://i.cnblogs.com/h5monitor/final.html
的地方访问页面,发现摄像头竟然失效了~

通过谷歌的文档好得知,这是为着安全性考虑,非
HTTPS 的服务端请求都无克通摄像头。不过解决办法也是有,以 window
系统吧条例,打开 cmd 命令行面板并稳定及 chrome 安装文件夹下,然后实施:

ZSH

chrome
–unsafely-treat-insecure-origin-as-secure=”http://i.cnblogs.com/h5monitor/final.html”
–user-data-dir=C:\testprofile

1
chrome –unsafely-treat-insecure-origin-as-secure="http://i.cnblogs.com/h5monitor/final.html"  –user-data-dir=C:\testprofile

行动将坐沙箱模式打开一个单身的 chrome
进程,并对准点名的站点去丢安全限制。注意咱们在初开之 chrome
中得更登录博客园。

这儿就会正常访问摄像头了,我们对代码做生处理,当差异检测发现异常时,创建同客日记,最小间隔时间为5秒(不了后来意识并未必要,因为博客园已经发出开了时限定,差不多10秒后才会颁新的日志)

JavaScript

//定时捕获 function timer(delta){ setTimeout(function(){
captureAndSaveFrame(); renderDiff(); if(calcDiff() > 0.2){
//监控及那个,发日志 submit() } timer(delta) }, delta || 500); }
setTimeout(timer, 60000 * 10); //设定打开页面十分钟后才开始监控
//异常图片上传处理 function submit(){ var cache = arguments.callee, now
= Date.now(); if(cache.reqTime && (now – cache.reqTime < 5000))
return; //日记创建最小间隔也5秒 cache.reqTime = now; //ajax 提交form
$.ajax({ url : ‘http://i.cnblogs.com/EditDiary.aspx?opt=1’, type :
“POST”, timeout : 5000, data : { ‘__VIEWSTATE’: ”,
‘__VIEWSTATEGENERATOR’: ‘4773056F’, ‘Editor$Edit$txbTitle’: ‘告警’ +
Date.now(), ‘Editor$Edit$EditorBody’: ‘<img src=”‘ + curFrame + ‘”
/>’, ‘Editor$Edit$lkbPost’: ‘保存’ }, success: function(){
console.log(‘submit done’) }, error: function(err){ cache.reqTime = 0;
console.log(‘error: ‘ + err) } }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            if(calcDiff() > 0.2){  //监控到异常,发日志
                submit()
            }
 
            timer(delta)
        }, delta || 500);
    }
 
    setTimeout(timer, 60000 * 10);  //设定打开页面十分钟后才开始监控
 
 
    //异常图片上传处理
    function submit(){
        var cache = arguments.callee,
            now = Date.now();
        if(cache.reqTime && (now – cache.reqTime < 5000)) return;  //日记创建最小间隔为5秒
 
        cache.reqTime = now;
 
        //ajax 提交form
        $.ajax({
            url : ‘http://i.cnblogs.com/EditDiary.aspx?opt=1’,
            type : "POST",
            timeout : 5000,
            data : {
                ‘__VIEWSTATE’: ”,
                ‘__VIEWSTATEGENERATOR’: ‘4773056F’,
                ‘Editor$Edit$txbTitle’: ‘告警’ + Date.now(),
                ‘Editor$Edit$EditorBody’: ‘<img src="’ + curFrame + ‘" />’,
                ‘Editor$Edit$lkbPost’: ‘保存’
            },
            success: function(){
                console.log(‘submit done’)
            },
            error: function(err){
                cache.reqTime = 0;
                console.log(‘error: ‘ + err)
            }
        });
    }

尽效果:

图片 9

日记也是妥妥的出来了:

图片 10

接触开就可知来看那个的那么张图了:

图片 11

而留心的是,博客园对日记发布数量是产生开每日额度限制来防刷的,达到限额的语句会促成当天的随笔和文章也罢无力回天发布,所以得小心使用:

图片 12

而是这种样式就能反映异常图片,暂时无法给我们当下收悉告警,有趣味之童鞋可以试行着又写单
chrome 插件,定时去拉取日记列表做判定,如果发新增日记则触发页面 alert。

除此以外我们当然希望能够直接针对闯入者进行警戒,这块比较好惩治 ——
搞个警示的节奏,在老的早晚接触播放即可:

JavaScript

//播放音频 function fireAlarm(){ audio.play() } //定时捕获 function
timer(delta){ setTimeout(function(){ captureAndSaveFrame(); if(preFrame
&& curFrame){ renderDiff(); if(calcDiff() > 0.2){ //监控及那个
//发日记 submit(); //播放音频告警 fireAlarm(); } } timer(delta) }, delta
|| 500); } setTimeout(timer, 60000 * 10);
//设定打开页面十分钟后才起来监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    //播放音频
    function fireAlarm(){
        audio.play()
    }
 
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            if(preFrame && curFrame){
                renderDiff();
                if(calcDiff() > 0.2){  //监控到异常
                    //发日记
                    submit();
                    //播放音频告警
                    fireAlarm();
                }
            }
            timer(delta)
        }, delta || 500);
    }
 
    setTimeout(timer, 60000 * 10);  //设定打开页面十分钟后才开始监控

末说一下,本文代码都挂在我的github落得,有趣味之童鞋可以自助下载。共勉~

1 赞 4 收藏 4
评论

图片 13

累加日子内没人,最重大的威慑来自星星独:一个凡是窃贼,另一个凡火灾。防盗防火防闺蜜虽然是一贯的主题,但具备办法都是于外出以前开的,究竟效果怎么样?

最是能够生一个配备,在主人非以小时实时督查家里。一旦闹题目,迅速通报主人,同时报警。

1.监督体系

1.1市场上之监控网

对是问题,网上发无数现成的督查系统。原理大概是:通过探测器监测家里的气象,一旦发现异常时,报警器通过网以报警音推送到主人的无绳电话机或微机。

探测器的类主要出星星点点种植:

(1)红外探测器

江湖万物包括你、我还有小偷的身体,无时无刻都以为外发射着红外线。

热线有个规律,就是温度更强的物体,向外发射的热线强度进一步充分。

为此,如果管红外线探测器装在派的地方或对面。当有梁上君子经过的下,它就能够探测到热线强度大增大,据此判断来小偷闯入。

(2)门磁探测器

门磁探测器由片独片构成,一部分装在门及,另一样有设置在门框上。如果小偷打开了家,探测器的简单片会给分手开,据此判断来梁上君子闯入。

这些报警器在定程度达能监控小偷与火灾,但其题材在于:

(1)红外线传感器是利用人体温度与环境温度差值来判定的,因此对温度非常乖巧。想想在炎炎的伏季,空气的热度几乎都是30几乎渡过,已经颇相近人体温度,这对于红外线传感器而言是一个挑战。

(2)无论是红外线传感器还是家磁传感器,它们还安在一贯的岗位(门及窗户对面或者旁边)。对于发生上进心的微偷而言,你以为她们非会见网购这个、拆开仔细研究清楚啊?训练有素的略微偷能迅速找到这些监督装置,可能仅待花几秒钟就管警报声消除了。

因此,我们需要想别的道来化解这些题目。

1.2咱的监控网

吓信息是:这一切还足以由此Matlab编程来实现!而且无论需打方面的传感器,只待以天桥上之摊位买只摄像头即可。

做事原理如下:程序通过调用摄像头,对门和窗自动定时拍照。每打一张像,就和前无异摆放照片对比,判断门窗是否被打开、家里是不是有贼闯入或火情。一旦探测出异常情况,立刻被主人发送报警邮件,并播放警报,赶走小盗。

如果你请一个针孔摄像头,藏到衣柜边上对着门窗,那么尽管是训练有素的略盗进来了,也束手无策迅速破除摄像头,警报声会一直不停。而且,摄像头对准温度并无敏感。

咱俩拿程序于个名字被doggy,doggy实现监督的流程图如下:

若是想用Matlab编程实现者这些功能,至少要化解下面几乎单困难:

(1)如何调用摄像头自动定时拍照?

(2)如何通过比两摆照片,判断女人是不是发生险闯入?

(3)判断出有贼之后,如何让主人发送报警邮件?

(4)如何自动播放警报?

(5)如果小偷对报警声响向不care,是否生其它措施?

脚一一说如何贯彻,没工夫看规律的同班,可以直接跨越到第6组成部分底采用方式。

2.定时自动拍照

定时自动拍照由一个主程序doggy.m和一个拍照函数takephotos.m组成。

里头主程序doggy.m的代码为:

%清除所有变量

clear

clc

%建立图片存储文件夹

ifexist(‘doggyphoto’,’dir’)~= 7

mkdir([cd,’/doggyphoto’])

end

directory=[cd,’/doggyphoto/’];

%设置一个督查界面

hf =
figure(‘Units’,’Normalized’,’Menubar’,’None’,’NumberTitle’,’off’,’Name’,’监控系统’);

ha = axes(‘Parent’, hf,’Units’,’Normalized’,’Position’, [0.125 0.2 0.75
0.75]);

axisoff

axisequal

%设置两只按钮

hb1 = uicontrol(‘Parent’, hf,’Units’,’Normalized’,’Position’, [0.3 0.05
0.15 0.1],’String’,’测试照头’,’Callback’, [‘imaqhwinfo;’…

‘obj = videoinput(”winvideo”);’…

‘set(obj, ”FramesPerTrigger”, 1);’…

‘set(obj, ”TriggerRepeat”, Inf);’…

‘objRes = get(obj, ”VideoResolution”);’…

‘nBands = get(obj, ”NumberOfBands”);’…

‘hImage = image(zeros(objRes(2), objRes(1), nBands));’…

‘preview(obj, hImage);’]);

hb2 = uicontrol(‘Parent’, hf,’Units’,’Normalized’,’Position’, [0.6 0.05
0.15 0.1],’String’,’开始监控’,’Callback’,’takephotos(directory,obj);’);

马上段先后分成四独组成部分:

先是部分:清除所有变量,避免其他变量影响监控网的运行;

次有:新建一个文书夹doggyphoto用于待会拍照存储照片,如果这个文件夹已存在就是毫无新建了。

老三片段:设置一个监理界面;

季部分:设置两只按钮,其中一个凡按钮是用来测试摄像头的,另一个按钮则是起监控的。

以第四片需调用一个函数takephotos,源程序是:

functiontakephotos(directory,obj)

escapetime=30;%从点击开始监控及锁门后离开的时日内,摄像头不监控,单位:秒

daynum=3;%一共打算出去几龙?单位:天

timestep=2;%每隔多少秒拍一赖照片?单位:秒

photonum=round(daynum*24*3600/timestep);

i=0;

whilephotonum>0

whileescapetime>0

disp([‘The monitoring system will start to workin ‘num2str(escapetime)’
seconds, please leave quickly.’]);

escapetime=escapetime-1;

pause(1);

ifescapetime==0

disp([‘The monitoring system will start to worknow.’]);

end

end

photonum=photonum-1;

i=i+1;

filename=[num2str(i)];

frame = getsnapshot(obj);%抓图

imwrite(frame,[directory,filename,’.jpg’]);%存图

disp([‘Take the ‘num2str(i)’ photos.’]);

if(i>1 &&comparephotos(i,i-1)>0)

sentemail();

playalarm();

disp([‘Something wrong in the room!’]);

end

pause(timestep);

end

cleari;%败局部变量

delete(obj);%关闭摄像头

在这函数中如果装几只参数:

(1)从持有人点击“开始监控”的按钮,到锁门后去就段时日外,摄像头应该无监控。否则,监控程序把主人呢作小偷了……这段时可长可短,取决于每个人动作快慢。这里doggy默认给了主人30秒钟,需要再增长日子可手动修改。

escapetime=30;%从点击开始监控到锁门后距的岁月外,摄像头不监控,单位:秒

(2)主人打算一起下多少天?doggy需要以即时段时内工作,默认是3上,同样的而手动修改者参数。

daynum=3;%一共打算出去几上?单位:天

(3)每隔多少秒拍一次于?如果打的无限勤,照片占用的硬盘空间可能非常坏,硬盘会被爆掉的。而若个别次摄影中间隔时间太久,小盗进来将家而关好了,两浅照片一摸一样,监控程序无法判定异常情况。默认是2秒,可手动修改。

timestep=2;%每隔多少秒拍一不好照片?单位:秒

通过Matlab内置函数getsnapshot函数拍照,然后通过放开函数imwrite函数存储,之后调用comparephotos函数判断是否有人闯入或是否出火灾,如果判断出充分动静,通过sentemail函数给主人犯邮件,并且通过playalarm播放警报。

3.断定是否有人闯入或火灾

这项功能是经comparephotos.m完成的,源代码如下:

functiontheif=comparephotos(i,j)

name1=[num2str(i)’.jpg’];

name2=[num2str(j)’.jpg’];

img1=imread(name1,’jpg’);

img2=imread(name2,’jpg’);

diffvalue=mean(mean(mean(abs(double(img1)-double(img2)))))%计算两摆设图的差值

Threshold=5;%设置报警的阈值

ifdiffvalue>Threshold%如果个别摆放图片出入过好,认为有贼闯入或产生火灾

theif=1;

else

theif=0;

end

这个函数首先调用内置函数imread读取两摆图片,然后继续对比。

在Matlab中,照片是因数组的形式储存的。因此,通过对比两独数组的差值就可知看清两摆放图纸的分别。

常规状况下,摄像头拍的鲜摆设类似之图样应该是异样不酷;如果差值过死,则证实有良状态。

测试结果如下:

(1)正常状态下

第2秒的图样:

第4秒的图片:

是因为并未丁闯入,也尚无火情,两布置图纸应该是平等模型一样的。

零星独数组相减之后,差值为0。如果拿此差值的数组再显,应该相同布置全黑的照片:

(2)如果第二摆像中推广了一个异物(记事本,请忽略自己的玉手…)

第2秒的肖像:

第4秒的像:

简单个数组相减之后,没有异物的地方差值为0,有异物的地方不同值未为0,所以差值的数组再显示就是这般的:

看,没有异物的地方是全黑的,有异物的地方便为检测出了。

(3)由于同一龙外不同随时,室外的光线并无同等,所以前后两摆相片并无是一心平等模型一样,即相互减后的数组再显不是全黑的,而是类似受全黑的有肯定噪音的图形:

故这里要出只参数,来调控报警的阈值。

Threshold=5;%设置报警的阈值

这参数反映了前后两摆图纸的区别程度。

如果Threshold设置为0,那么只要简单布置图纸有一致丝不同,doggy就会见就报警,真正得以兑现并一独自蚊子、一独自跳蚤都未深受飞进来。

而是实则,我们并不需要doggy这么乖巧。否则,由于室外的光明的例外而造成前后两摆放像并无是意一致模子一样,也会见挑起误报警。

这个参数和不同房子的窗子大小、位置相关。一般而言,通过测试后意识安装Threshold为5,可以很好之过滤掉误报警。

4.殡葬邮件

咱俩不期外出时,家里发生其它情形发生,但如产生动静,让doggy给我们就发一样查封邮件,源代码文件称sentemail.m,代码如下:

functionsentemail()

mail =’xxxxxxxxx@qq.com’;%得采取qq邮箱

password =’xxxxxx’;%输入邮箱的密码

setpref(‘Internet’,’E_mail’,mail);

setpref(‘Internet’,’SMTP_Server’,’smtp.qq.com’);%此处邮箱服务器和地方一样

setpref(‘Internet’,’SMTP_Username’,mail);

setpref(‘Internet’,’SMTP_Password’,password);

props = java.lang.System.getProperties;

props.setProperty(‘mail.smtp.auth’,’true’);

props.setProperty(‘mail.smtp.socketFactory.class’,’javax.net.ssl.SSLSocketFactory’);

props.setProperty(‘mail.smtp.socketFactory.port’,’465′);

subject=’Alarm’;%邮件标题

content=’Dear Master, there is something wrong in our house!’;%邮件内容

sendmail(‘xxxxxxxxx@qq.com’,subject,content);%需要发送到的邮箱地址

当当下同样块用专注的凡:

(1)密码要下明码,很坑爹是休是?别忘了上个月咱们说过得用pcode给程序加密。

(2)
Matlab可以以邮件里发送附件。然而,它发送邮件是经Java接口,速度较缓慢,所以不推荐添加太死之附件,以免发送失败。这里为保险起见,干脆不作附件好了。

(3)
Matlab只能发送不待authentication的邮箱地址,如果使用出现错误,请将POP3后者SMTP服务打开。以qq邮箱为条例,需要以设置中打开如下权限:

5.自动播放警报

通知了主人后,接下就是该发出声音赶走小偷了,函数文件称是playalarm.m,源代码如下:

functionplayalarm()

[y,fs]=wavread(‘Alarm.wav’);%保证wav文件在当前工作目录

sound(y, fs);

(1)警报声

极致常用的动静是警车的声。

报警器的音会让有发出贼心没贼胆的人退散,而且能引起广泛邻居注意。

(2)恐怖片

于等级比强之有点偷而言,这种报警音或早都于免疫了。

这会儿不使换成恐怖片的声,比警车的音又起功能。

友谊提醒:此恐怖片声音很惊悚,切勿在半夜三更一个口接触开。

1:24惊悚声音,慎入来源科学计算编点程

对盗贼而言,其实是得格外强之心理素质的。

愈来愈是上屋的前方几秒种,是最最乱以及防卫状态最好充分的时段。

外会见细心检查看起无产生情,一旦发现是屋子内没有威胁,他见面略微放松一点。

因而马上段惊悚的声,最前边7秒没动静,是为着让盗贼充分的流年放松。

对等他开始放松的时节,再猛地听到惊悚的音响才能够及最好好之功能。

(3)声音飘忽的觉得

光播放恐怖片的音乐,也许对于勇的盗来说根本不在乎,甚至只能作为他们饭后的小费。

那咱们不怕加点立体效果,即声音飘忽不定的发。

原理是这般的:人得判断声源的职务,是盖声源到少但耳朵的距离一般不同,声音传至零星特耳朵的时刻、强弱和任何特色呢便不同。

那么,如果我们由此左声道与右声道放出来的恐怖片声音强度要时刻不相同,盗贼就是见面深感恐怖声的出位置是当飘忽不定的,更兼具惊悚效果。

下,我们改变简单单声道音响之强度:

functionplayalarm2()

[y,fs]=wavread(‘kb.wav’);

left=y(:,1);%左声道

right=y(:,2);%右声道

x=1:length(left);

y(:,1)=left.*sin(2*pi().*x/length(left)*5)’;

y(:,2)=left.*(1-sin(2*pi().*x/length(left)*5))’;

wavwrite(y,fs,’kb2′);

比起上面的非常,能明了感觉到这次声源在左右运动。(每首推送只能插入一段落音频,所以马上段飘忽的节拍无法插入,需要试听的吃后台留言)

不过,这个声音还单纯以土匪之正前方,能免能够起方法于匪认为声源在左右前后运动,甚至逾越到他偷偷为?

答案当然是好的了哇!当半独波形具有180°相位差且分别位于两个声道时,只要简单单声道不被融合在一起,我们得明确感到到声源跑至末端去了。

可限于时间和字数,这里无法持续展开讨论,下次寻觅机会专门召开只Matlab处理立体声的专题吧。

(4)增加次声波

只有恐怖片声音的鼓舞,也许要未可知一心按住盗贼的贪心。

可否让听到立体声恐怖片的匪徒,除了以思想及不舒适之外,身体吗闹不痛快的感觉到呢?

连下去,隆重推出另一个特别杀器——次声波。

好家伙是破声波?人耳朵会听到的响动的频率是20交2万赫兹。频率低于20赫兹底声波叫做次声波。

一点频率的次声波由于和人体器官的震荡频率近乎甚至同一,容易与人体器官产生振动,对人体发出好强之伤害性,危险时可致人口死。

自然,通过matlab程序生成的次声波,经过音响播放出来其实功率很有些,并不足以伤害到盗贼。但是起码会叫匪感觉到出硌不痛快。

再次着重之是,这个声音盗贼是听不交之。

也就是说,站在土匪之角度,他无能为力听到声音,只能感受及难受。再下放上恐怖片的惊悚的立体音效,效果及了。

生成次声波的源代码如下:

functioncreateisound()

f=10;%频率10赫兹

w=2*pi()*f;

t=[0:0.0001:30];%步进0.0001秒

y=sin(w*t);

这么,就获取了一个效率也10赫兹,时间吗30秒的次声波。

(5)高分贝DJ

假定盗贼油盐不进,对警车声和恐怖片声音还免疫。

我们还有最后一致,但也是绝无艺术之点子:把音量调到最好可怜,播放下面高分贝DJ,把邻居曹还吵醒吧。

她俩会气冲冲找你算账,然后以潜意识中拿小偷逼走。

6.以办法

吓了,原理和摆明白,下面说如何使用此监控体系。

6.1搭建筑监控网

(1)材料准备

资料只需要:

无异于尊装有Matlab的微机

一个摄像头

一个响声(最好有小音炮,效果更理想)

将电脑、摄像头和声音都藏在隐身之职。音响最好对称的厕房间的有数单角。

(2)参数设置

拿装有代码拷到电脑及,一共发六个公文:

doggy.m,

takephotos.m,

comparephotos.m,

sentemail.m,

playalarm.m,

playalarm2.m,

每个文件对应的职能见下图:

通过doggy.m调用takephotos.m进行摄影,然后调用comparephotos.m判断是否有人闯入或是否发生火灾,如果判断有良动静,通过sentemail.m函数给主人犯邮件,并且通过playalarm.m和playalarm2.m广播警报。

急需设置的参数有:

(1)
takephotos.m中escapetime参数:从持有人点击“开始监控”的按钮,到锁门后去就段时日内,摄像头应该无监控。

(2) takephotos.m中daynum参数:主人打算一起下多少天?

(3) takephotos.m中timestep=2参数:每隔多少秒拍一坏?

(4) comparephotos.m中Threshold=5:设置报警的阈值。

(3)开始监控

参数设置好下,在主程序里运行doggy回车,弹出如下界面:

接触左下方的“测试摄像头”,看摄像头是否正规干活。

下一场点右侧下方的“开始监控”之后,程序开始倒计时:

持有者以此日子内,离开锁门准备去外边度假咯。

通下去,是先后各隔几秒钟给门和窗照相,

下一场对比前后两摆设相片判断是否有人闯入。

6.2盗贼之心得

咱俩盼望报警程序永远不要为激活。但是倘若被激活,它是这般防御盗贼之:

首先,盗贼进了门,开始判断女人是不是发生报警器或者其他威胁什么的。

等候了几乎秒钟,发现没什么不对劲,开始准备搜东西。

正要以外准备开始搜的时候,天上传来一道惊悚的声响。

萧条了几秒,他立马识别这是房子的所有者在广播恐怖片呢,心里想:小样,给自家玩就套。

可是接下,他又惊又喜的发现此惊悚的声响开始飘忽移动,慢慢挪动至外偷偷。

此刻,他都萌芽了退意。

还连下,次声波开始放,他倍感到除了心里不舒适之外,身体也发出几不顶舒服。

到底了吧,放弃吧。大部分土匪决定放弃了。

而,还有少部分盗是盗墓出身,根本无care。

好吧,这个时刻开始播报超大音量DJ。

邻居曹,请你们快气冲冲到我房子里吧!赶走盗贼就是依靠你们了。

好处,请提醒我本勿是当写恶搞的脚本,而是以认真严肃的勾勒推送。

7.描写在结尾

7.1改善方案

实在是次还有多地方得改善,比如:

(1)自动定时拍摄的照片的分辨率其实可以调整的复强一些,这样可以再准的拓展判断是否有人闯入。

(2)报警或恐怖片的立体声还可开的双重逼真,当然就如考虑到横个别个声道音响之推移以及相位差。

(3)可以调用多只摄像头,从周密对门进行防卫。

7.2防盗意识

比叫在家设置监督系统,更关键之是平常一经增进安全意识。

以以外场用餐经常财别外漏,在公共场合聊天时别说自己家有些许家财。

就贼偷,就不寒而栗贼想。监控体系永远只有是看守的最后一缠绕。

即便如足球比赛一样,监控网才是临门员而已。足球绝好控制在前场队员手里,才能够远离失败。如果一味是深受投机的足球近门员抵御对方的先锋,不停歇的扑球,迟早是碰头给进球。

(END)

相关文章

标签:, , ,

Your Comments

近期评论

    功能


    网站地图xml地图