Gezicht herkennen

Naast je handen, kan je met OpenCV ook gezichten herkennen. In het onderstaande voorbeelden volgen we het gezicht en plakken we op die plaats een transparante PNG-afbeelding. Die afbeelding (in het onderstaande geval "konijn.png") bewaar je in dezelfde map als je sketch.

import gab.opencv.*;
import processing.video.*;
import java.awt.Rectangle;
import java.util.HashMap;

Capture cam;
OpenCV opencv;
Rectangle[] faces;
PImage konijn;

// Lijst om laatst bekende gezichtsposities op te slaan
HashMap<Integer, Rectangle> lastKnownFaces = new HashMap<>();

void setup() {
  size(1080, 720);
  konijn = loadImage("konijn.png");
  
  // Webcam initialiseren
  cam = new Capture(this, 1080, 720);
  cam.start();
  
  // OpenCV initialiseren (we wachten tot de webcam actief is voordat we een afbeelding inladen)
  opencv = new OpenCV(this, 1080, 720);
  
  // Laad gezichtsherkenningscascade
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  
}

void draw() {
  if (cam.available()) {
    cam.read();
  }
  
  // Laad het camerabeeld in OpenCV
  opencv.loadImage(cam);
  
  // Gezichten detecteren
  faces = opencv.detect();
  
  // Het camerabeeld weergeven
  image(opencv.getInput(), 0, 0);
  
  // Teken gezichten of vorige gezichtsposities
  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);

  // Lege HashMap voor huidige gezichten
  HashMap<Integer, Rectangle> currentFaces = new HashMap<>();
  
  // Voor elk gedetecteerd gezicht
  for (int i = 0; i < faces.length; i++) {
    // Gebruik een unieke ID voor elk gezicht (bijvoorbeeld de x- en y-positie combineren)
    int faceID = faces[i].x + faces[i].y;
    
    // Voeg het huidige gezicht toe aan de lijst van gezichten
    currentFaces.put(faceID, faces[i]);
    
    // Teken het konijn op de gedetecteerde positie
    image(konijn, faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
  
  // Controleer of er gezichten zijn die niet meer gedetecteerd worden en onthoud hun laatste positie
  for (Integer id : lastKnownFaces.keySet()) {
    if (!currentFaces.containsKey(id)) {
      // Teken het konijn op de laatst bekende positie
      Rectangle lastFace = lastKnownFaces.get(id);
      image(konijn, lastFace.x, lastFace.y, lastFace.width, lastFace.height);
    }
  }

  // Update de lijst met laatst bekende gezichtsposities
  lastKnownFaces = currentFaces;
}
Volgende pagina