xxxxxxxxxx
106
let capture;
var update_memory;
var cascadeurl;
let initialized = false;
let canvas;
let ctx;
let mic;
function setup() {
canvas = createCanvas(640, 480);
pixelDensity(1);
ctx = canvas.drawingContext;
capture = createCapture({
video: {
mandatory: {
maxWidth: 640,
maxHeight: 480
},
optional: [{
maxFrameRate: 120
}]
},
audio: false
}, function() {
capture.hide();
});
mic = new p5.AudioIn();
mic.start();
pico_setup();
}
function pico_setup() {
update_memory = pico.instantiate_detection_memory(5); // we will use the detecions of the last 5 frames
cascadeurl = 'https://raw.githubusercontent.com/nenadmarkus/pico/c2e81f9d23cc11d1a612fd21e4f9de0921a5d0d9/rnt/cascades/facefinder';
fetch(cascadeurl).then(function(response) {
response.arrayBuffer().then(function(buffer) {
var bytes = new Int8Array(buffer);
facefinder_classify_region = pico.unpack_cascade(bytes);
// console.log('* cascade loaded');
})
})
}
function draw() {
pico_draw();
}
function pico_draw() {
pico_process(capture.elt);
}
function rgba_to_grayscale(rgba, nrows, ncols) {
var gray = new Uint8Array(nrows * ncols);
for (var r = 0; r < nrows; ++r)
for (var c = 0; c < ncols; ++c)
// gray = 0.2*red + 0.7*green + 0.1*blue
gray[r * ncols + c] = (2 * rgba[r * 4 * ncols + 4 * c + 0] + 7 * rgba[r * 4 * ncols + 4 * c + 1] + 1 * rgba[r * 4 * ncols + 4 * c + 2]) / 10;
return gray;
}
function pico_process(video) {
// render the video frame to the canvas element and extract RGBA pixel data
ctx.drawImage(video, 0, 0);
var rgba = ctx.getImageData(0, 0, 640, 480).data;
// prepare input to `run_cascade`
img = {
"pixels": rgba_to_grayscale(rgba, 480, 640),
"nrows": 480,
"ncols": 640,
"ldim": 640
}
params = {
"shiftfactor": 0.1,
"minsize": 50,
"maxsize": 500,
"scalefactor": 1.1
}
dets = pico.run_cascade(img, facefinder_classify_region, params);
dets = update_memory(dets);
dets = pico.cluster_detections(dets, 0.2);
if (dets.length > 0) {
for (i = 0; i < 1; ++i) {
let x = dets[i][1];
let y = dets[i][0];
let d = dets[i][2];
let img = get(x - d / 2, y - d / 2, d, d);
level = mic.getLevel();
let res = round(map(level, 0, 0.3, 5, d));
img.resize(res, res);
push();
translate(x, y);
imageMode(CENTER);
noSmooth();
image(img, 0, 0, d, d);
smooth();
pop();
}
}
}
var facefinder_classify_region = function(r, c, s, pixels, ldim) {
return -1.0;
};