index.html 3.61 KB
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Web Attendance System</title>
<style>
#container {
	margin: 0px auto;
	width: 640px;
	height: 480px;
	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 src="https://code.jquery.com/jquery-1.12.4.min.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.
        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);
            cv.rectangle(dst, point1, point2, [255, 0, 0, 255]);
            let cropped = new cv.Mat();
            let rect = new cv.Rect(face.x, face.y, face.width, face.height);
            cropped = src.roi(rect);
            let tempCanvas = document.createElement("canvas");
            cv.imshow(tempCanvas,cropped);
            let b64encoded = tempCanvas.toDataURL("image/jpeg", 1.0);
            $.ajax({
                   type: "POST",
                   url: "{{url_for('verify')}}",
                   dataType: "json",
	           data: {'image':b64encoded, 'data':'testestest'}
                   });
        }
        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">
<video autoplay="true" id="videoInput" width=640 height=480 style="display: none;"></video>
<canvas id="canvasOutput" width=640 height=480></canvas>
<div id="hidden_container" style="display: none;"><div>
</div>
</body>
</html>