zeus.ugent.be/content/assets/scripts/halloween/worker.js

124 lines
2.6 KiB
JavaScript

var face_cascade, eye_cascade;
function loadFaceDetectTrainingSet() {
if (face_cascade == undefined) {
face_cascade = new cv.CascadeClassifier();
let load = face_cascade.load('../../test/data/haarcascade_frontalface_default.xml');
// console.log('load face detection training data', load);
}
}
function loadEyesDetectTrainingSet() {
if (eye_cascade == undefined) {
eye_cascade = new cv.CascadeClassifier();
let load = eye_cascade.load('../../test/data/haarcascade_eye.xml');
// console.log('load eye detection training data', load);
}
}
function faceDetect(imageData) {
loadFaceDetectTrainingSet();
let img = cv.matFromArray(imageData, 24); // 24 for rgba
let img_gray = new cv.Mat();
cv.cvtColor(img, img_gray, cv.ColorConversionCodes.COLOR_RGBA2GRAY.value, 0);
let faces = new cv.RectVector();
let s1 = [0, 0];
let s2 = [0, 0];
face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, 0, s1, s2);
let rects = [];
for (let i = 0; i < faces.size(); i += 1) {
let faceRect = faces.get(i);
rects.push({
x: faceRect.x,
y: faceRect.y,
width: faceRect.width,
height: faceRect.height
});
}
postMessage({ features: rects, output: true });
img.delete();
faces.delete();
img_gray.delete();
}
function eyesDetect(imageData) {
loadFaceDetectTrainingSet();
loadEyesDetectTrainingSet();
let img = cv.matFromArray(imageData, 24); // 24 for rgba
let img_gray = new cv.Mat();
cv.cvtColor(img, img_gray, cv.ColorConversionCodes.COLOR_RGBA2GRAY.value, 0);
let faces = new cv.RectVector();
let s1 = [0, 0];
let s2 = [0, 0];
face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, 0, s1, s2);
let rects = [];
for (let i = 0; i < faces.size(); i += 1) {
let faceRect = faces.get(i);
let x = faceRect.x;
let y = faceRect.y;
let w = faceRect.width;
let h = faceRect.height;
rects.push({
x: x,
y: y,
width: w,
height: h
});
let roiRect = new cv.Rect(x, y, w, h);
let roi_gray = img_gray.getROI_Rect(roiRect);
let eyes = new cv.RectVector();
eye_cascade.detectMultiScale(roi_gray, eyes, 1.1, 3, 0, s1, s2);
for (let j = 0; j < eyes.size(); j += 1) {
let eyeRect = eyes.get(j);
rects.push({
x: x + eyeRect.x,
y: y + eyeRect.y,
width: eyeRect.width,
height: eyeRect.height
});
}
eyes.delete();
roi_gray.delete();
}
postMessage({ features: rects });
img.delete();
faces.delete();
img_gray.delete();
}
self.onmessage = function (e) {
switch (e.data.cmd) {
case 'faceDetect':
faceDetect(e.data.img);
break;
case 'eyesDetect': {
eyesDetect(e.data.img);
break;
}
}
}
self.onerror = function (e) {
console.log(e);
}