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;
}