zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    window.URL.createObjectURL

    https://html5.xgqfrms.xyz/Canvas/safety-canvas.html

    
    	    var video = document.querySelector('video');
    	    var audio = document.querySelector('audio');
    	    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;   //当前帧
    
    	    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(){
    	        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 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);  //设定打开页面十分钟后才开始监控
    
    
    	    //异常图片上传处理
    	    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)
    	            }
    	        });
    	    }
    	
    
    


  • 相关阅读:
    SQL语句大全
    SQL SERVER 用sql语句将一列数据拼接成一个字符串
    常用 SQl 语句大全
    巧用一条SQL语句实现其它进制到十进制转换
    sql 2005
    sql convert(varchar(10),getdate(),120)
    sqlserver 日期函数
    转:DBCC CHECKDB 数据库或表修复
    Linux下使用SFTP命令
    mySQL 教程 第7章 存储过程和函数
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/12709336.html
Copyright © 2011-2022 走看看