From f41c8821b75af67363e3aa1a8d41fb563c3895c3 Mon Sep 17 00:00:00 2001 From: Marco Tulio Soares Date: Tue, 10 Sep 2024 00:49:58 -0300 Subject: [PATCH] temporizador adicionado --- riso_frontend/public/script.js | 148 ++++++++++++--------------------- 1 file changed, 53 insertions(+), 95 deletions(-) diff --git a/riso_frontend/public/script.js b/riso_frontend/public/script.js index 89fd8a3d..4b0aace3 100644 --- a/riso_frontend/public/script.js +++ b/riso_frontend/public/script.js @@ -1,99 +1,57 @@ -function initializeVideoScript() { - const video = document.getElementById('video'); - let happinessCounter = 0; // Inicializa o contador de felicidade - const smiledFaces = new Map(); // Mapa para rastrear rostos que já sorriram - - // Função para carregar os modelos necessários - async function loadModels() { - try { - // Carrega os modelos necessários para o face-api.js - await faceapi.nets.tinyFaceDetector.loadFromUri('./models'); - await faceapi.nets.faceLandmark68Net.loadFromUri('./models'); - await faceapi.nets.faceRecognitionNet.loadFromUri('./models'); - await faceapi.nets.faceExpressionNet.loadFromUri('./models'); - - console.log("Todos os modelos foram carregados com sucesso."); - startVideo(); // Inicia o vídeo após os modelos serem carregados - } catch (error) { - console.error("Erro ao carregar os modelos:", error); - } - } - - // Função para iniciar o vídeo - function startVideo() { - navigator.mediaDevices.getUserMedia({ video: {} }) - .then(stream => { - video.srcObject = stream; - }) - .catch(err => console.error("Erro ao acessar a câmera:", err)); - } - - // Função para verificar se todos os modelos foram carregados - function areModelsLoaded() { - return ( - faceapi.nets.tinyFaceDetector.isLoaded && - faceapi.nets.faceLandmark68Net.isLoaded && - faceapi.nets.faceRecognitionNet.isLoaded && - faceapi.nets.faceExpressionNet.isLoaded - ); - } - - // Adiciona um ouvinte de evento 'play' para quando o vídeo começar - video.addEventListener('play', async () => { - // Verifica se os modelos estão carregados antes de prosseguir - if (!areModelsLoaded()) { - console.error("Modelos não carregados corretamente."); - return; - } - - const canvas = faceapi.createCanvasFromMedia(video); - document.body.append(canvas); - const displaySize = { width: video.width, height: video.height }; - faceapi.matchDimensions(canvas, displaySize); - - setInterval(async () => { - try { - // Verifica novamente se os modelos estão carregados antes da inferência - if (!areModelsLoaded()) { - console.error("Modelos ainda não carregados. Tentando novamente..."); - return; - } - - // Realiza a detecção de rostos - const detections = await faceapi.detectAllFaces(video, new faceapi.TinyFaceDetectorOptions()) - .withFaceLandmarks() - .withFaceExpressions(); - - const resizedDetections = faceapi.resizeResults(detections, displaySize); - canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); - faceapi.draw.drawDetections(canvas, resizedDetections); - faceapi.draw.drawFaceLandmarks(canvas, resizedDetections); - faceapi.draw.drawFaceExpressions(canvas, resizedDetections); - - resizedDetections.forEach(detection => { - const faceId = detection.detection.box.x.toFixed(2) + detection.detection.box.y.toFixed(2); - const isSmiling = detection.expressions.happy > 0.9; - - if (isSmiling && !smiledFaces.has(faceId)) { - happinessCounter++; - smiledFaces.set(faceId, true); // Marca que esse rosto já teve o sorriso contado - console.log(`A pessoa ficou feliz ${happinessCounter} vezes`); +const video = document.getElementById('video'); +let happinessCounter = 0; // Inicializa o contador de felicidade +const smiledFaces = new Map(); // Mapa para rastrear o último sorriso de cada rosto +let lastCountTime = Date.now(); // Tempo do último incremento do contador + +Promise.all([ + faceapi.nets.tinyFaceDetector.loadFromUri('./models'), + faceapi.nets.faceLandmark68Net.loadFromUri('./models'), + faceapi.nets.faceRecognitionNet.loadFromUri('./models'), + faceapi.nets.faceExpressionNet.loadFromUri('./models') +]).then(startVideo); + +function startVideo() { + navigator.getUserMedia( + { video: {} }, + stream => video.srcObject = stream, + err => console.error(err) + ); +} - // Remove o rosto do mapa após um curto período - setTimeout(() => { - smiledFaces.delete(faceId); - }, 5000); // Ajuste o tempo conforme necessário (5 segundos neste exemplo) - } - }); - } catch (error) { - console.error("Erro durante a detecção de rostos:", error); +video.addEventListener('play', () => { + const canvas = faceapi.createCanvasFromMedia(video); + document.body.append(canvas); + const displaySize = { width: video.width, height: video.height }; + faceapi.matchDimensions(canvas, displaySize); + setInterval(async () => { + const detections = await faceapi.detectAllFaces(video, new faceapi.TinyFaceDetectorOptions()) + .withFaceLandmarks() + .withFaceExpressions(); + + const resizedDetections = faceapi.resizeResults(detections, displaySize); + canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); + faceapi.draw.drawDetections(canvas, resizedDetections); + faceapi.draw.drawFaceLandmarks(canvas, resizedDetections); + faceapi.draw.drawFaceExpressions(canvas, resizedDetections); + + let smileDetected = false; // Flag para verificar se pelo menos um sorriso foi detectado + + resizedDetections.forEach(detection => { + const faceId = detection.detection.box.x.toFixed(2) + detection.detection.box.y.toFixed(2); // Cria um identificador único para o rosto + const isSmiling = detection.expressions.happy > 0.9; // Verifica se a pessoa está sorrindo + + if (isSmiling) { + smileDetected = true; // Marca que pelo menos um sorriso foi detectado } - }, 100); - }); + }); - // Chama a função para carregar os modelos ao iniciar o script - loadModels(); -} + const currentTime = Date.now(); // Pega o tempo atual -// Chama a função para inicializar o script -initializeVideoScript(); + // Verifica se passou 1 minuto desde o último incremento do contador e se algum sorriso foi detectado + if (smileDetected && currentTime - lastCountTime > 7000) { // 60 segundos (1 minuto) + happinessCounter++; + lastCountTime = currentTime; // Atualiza o tempo do último incremento do contador + console.log(`A pessoa ficou feliz ${happinessCounter} vezes`); + } + }, 100); +});