54 lines
1.1 KiB
JavaScript
54 lines
1.1 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 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();
|
|
}
|
|
|
|
self.onmessage = function (e) {
|
|
switch (e.data.cmd) {
|
|
case 'faceDetect':
|
|
faceDetect(e.data.img);
|
|
break;
|
|
}
|
|
}
|
|
|
|
self.onerror = function (e) {
|
|
console.log(e);
|
|
}
|