index.html 3.22 KB
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Web Attendance System</title>
<style>
#container {
	margin: 0px auto;
	width: 1280px;
	height: 1280px;
	border: 10px #333 solid;
}
#videoInput {
	background-color: #666;
}
#canvasOutput {
	background-color: #666;
}
</style>
<script type='text/javascript' src="{{url_for('static', filename='js/opencv.js')}}"></script>
<script type='text/javascript' src="{{url_for('static', filename='js/utils.js')}}"></script>
<script type='text/javascript'>
function load_cascade()
{
    let faceCascadeFile = 'haarcascade_frontalface_default.xml'
    let faceCascadeURL = 'static/js/haarcascade_frontalface_default.xml'
    let utils = new Utils('errorMessage');	
    utils.createFileFromUrl(faceCascadeFile, faceCascadeURL, () => {
        main()
    });
}

function main()
{
let video = document.getElementById("videoInput");
let canvasOutput = document.getElementById("canvasOutput");
let canvasContext = canvasOutput.getContext('2d');

if (navigator.mediaDevices.getUserMedia){
    navigator.mediaDevices.getUserMedia({ video: true })
	.then(function (stream) {
            video.srcObject = stream;
	}).catch(function (err0r) {
            console.log("Something went wrong!");
        });
}

let src = new cv.Mat(video.height, video.width, cv.CV_8UC4);
let dst = new cv.Mat(video.height, video.width, cv.CV_8UC4);
let gray = new cv.Mat();
let cap = new cv.VideoCapture(video);
let faces = new cv.RectVector();
let classifier = new cv.CascadeClassifier();
var streaming = true;

classifier.load('haarcascade_frontalface_default.xml');

const FPS = 30;
function processVideo() {
    try {
        if (!streaming) {
            // clean and stop.
            src.delete();
            dst.delete();
            gray.delete();
            faces.delete();
            classifier.delete();
            return;
        }
        let begin = Date.now();
        // start processing.
        cap.read(src);
        src.copyTo(dst);
        cv.cvtColor(dst, gray, cv.COLOR_RGBA2GRAY, 0);
        // detect faces.
        let msize = new cv.Size(120, 120);
        classifier.detectMultiScale(gray, faces, 1.1, 3, 0, msize);
        // draw faces.
        var images = new Array();
        for (let i = 0; i < faces.size(); ++i) {
            let face = faces.get(i);
            let point1 = new cv.Point(face.x, face.y);
            let point2 = new cv.Point(face.x + face.width, face.y + face.height);
            let rect = cv.Rect(face.x, face.y, face.x + face.width, face.y + face.height)
            cv.rectangle(dst, point1, point2, [255, 0, 0, 255]);
            let roi = src.roi(rect);
            let img = cv.imencode('jpg', roi).toString('base64');
            alert(img);
            images.append(img);
        }
        cv.imshow('canvasOutput', dst);
        // schedule the next one.
        let delay = 1000/FPS - (Date.now() - begin);
        setTimeout(processVideo, delay);
    } catch (err) {
        console.log(err);
    }
}
setTimeout(processVideo, 0);
}
</script>
</head>
<body onload="cv['onRuntimeInitialized']=()=>{ load_cascade() }">
<div id="container">
<canvas id="canvasOutput" width=640 height=480></canvas>
</div>
<video autoplay="true" id="videoInput" width=640 height=480 style="display: none;">
</video>
</html>