Programmierung Gesichtserkennung mit der Web-CameraAuthor D.Selzer-McKenzie import processing.video.*;import monclubelec.javacvPro.*;import java.awt.*; // pour classes Point , Rectangle..import java.util.*;// Für WebCam:Capture cam1;//GSMovie cam1;OpenCV opencv; // deklariert ein OpenCV ObjektRectangle[] faceRect;// A list of my Face objectsArrayList// how many have I found over all timeint faceCount = 0;float sum=0;int scl=1;int frame=0;boolean delFaces;void setup() {// Für WebCam:cam1= new Capture(this, 1280, 720);//cam1 = new GSMovie(this, "maus.mov");// für WebCam auskommentieren://cam1.play();cam1.start();// initialisiert OpenCV ---opencv = new OpenCV(this);//Vorsicht: bei der Arbeit mit einer Datei muss die Größe genau passen!!!//opencv.allocate(640, 360);opencv.allocate(cam1.width, cam1.height);// Für WebCam:// opencv.allocate(cam1.getSourceWidth(), cam1.getSourceHeight()); // initialisiert die Buffer von OpenCVsize (opencv.width(), opencv.height());// Laden Beschreibungsdateiopencv.cascade("/usr/share/opencv/haarcascades/", "haarcascade_frontalface_alt_tree.xml");// Liste mit den GesichtsobjektenfaceList = new ArrayList}void draw() {// Dateien und die WebCam brauchen etwas Zeit zum Ladenif (cam1.available()) {// Einzelne Frames werden gelesencam1.read();opencv.copy(cam1);// Schnitt oder Kameraschwenk erkennenprintln(abs(opencv.sum()-sum)/1000000);if (abs(opencv.sum()-sum)/1000000 >7) delFaces=true;else delFaces=false;sum=opencv.sum();// ErkennenfaceRect = opencv.detect(false);image(opencv.getBuffer(), 0, 0);//Rechteck zeichnen//opencv.drawRectDetect(true);// Code ab hier von Daniel Shiffman// SCENARIO 1: faceList is emptyif (faceList.isEmpty()) {// Just make a Face object for every face Rectanglefor (int i = 0; i < faceRect.length; i++) {faceList.add(new Face(faceRect[i].x, faceRect[i].y, faceRect[i].width, faceRect[i].height));}// SCENARIO 2: We have fewer Face objects than face Rectangles found from OPENCV}else if (faceList.size() <= faceRect.length) {boolean[] used = new boolean[faceRect.length];// Match existing Face objects with a Rectanglefor (Face f : faceList) {// Find faces[index] that is closest to face f// set used[index] to true so that it can't be used twicefloat record = 50000;int index = -1;for (int i = 0; i < faceRect.length; i++) {float d = dist(faceRect[i].x, faceRect[i].y, f.r.x, f.r.y);if (d < record && !used[i]) {record = d;index = i;}}// Update Face object locationused[index] = true;f.update(faceRect[index]);}// Add any unused facesfor (int i = 0; i < faceRect.length; i++) {if (!used[i]) {faceList.add(new Face(faceRect[i].x, faceRect[i].y, faceRect[i].width, faceRect[i].height));}}// SCENARIO 3: We have more Face objects than face Rectangles found}else {// All Face objects start out as availablefor (Face f : faceList) {f.available = true;}// Match Rectangle with a Face objectfor (int i = 0; i < faceRect.length; i++) {// Find face object closest to faces[i] Rectangle// set available to falsefloat record = 50000;int index = -1;for (int j = 0; j < faceList.size(); j++) {Face f = faceList.get(j);float d = dist(faceRect[i].x, faceRect[i].y, f.r.x, f.r.y);if (d < record && f.available) {record = d;index = j;}}// Update Face object locationFace f = faceList.get(index);f.available = false;f.update(faceRect[i]);}// Start to kill any left over Face objectsfor (Face f : faceList) {if (f.available) {f.countDown();if (f.dead()) {f.delete = true;}}}}// Delete any that should be deletedfor (int i = faceList.size()-1; i >= 0; i--) {Face f = faceList.get(i);// Bei einem Schnitt werden alle Gesichter sofort gelöschtif (f.delete || delFaces) {faceList.remove(i);}}// Draw all the facesfor (int i = 0; i < faceRect.length; i++) {noFill();stroke(255, 0, 0);rect(faceRect[i].x*scl, faceRect[i].y*scl, faceRect[i].width*scl, faceRect[i].height*scl);}for (Face f : faceList) {f.display();}}}void keyReleased() {if (key == 's' || key == 'S') saveFrame(timestamp()+"_##.png");// for Movie//frame+=500;//cam1.jump(frame);//cam1.play();}// timestampString timestamp() {Calendar now = Calendar.getInstance();return String.format("%1$ty%1$tm%1$td_%1$tH%1$tM%1$tS", now);}// Which Face Is Which// Daniel Shiffman// April 25, 2011class Face {// A RectangleRectangle r;// Am I available to be matched?boolean available;// Should I be deleted?boolean delete;// How long should I live if I have disappeared?int timer = 63;// Assign a number to each faceint id;// Make meFace(int x, int y, int w, int h) {r = new Rectangle(x, y, w, h);available = true;delete = false;id = faceCount;faceCount++;}// Show mevoid display() {fill(0, 0, 255, timer*2);stroke(0, 0, 255);rect(r.x*scl, r.y*scl, r.width*scl, r.height*scl);fill(255, timer*2);text(""+id, r.x*scl+10, r.y*scl+30);}// Give me a new location / size// Oooh, it would be nice to lerp here!void update(Rectangle newR) {r = (Rectangle) newR.clone();}// Count me down, I am gonevoid countDown() {timer--;}// I am deed, delete meboolean dead() {if (timer < 0) return true;return false;}} |
Sonntag, 21. Dezember 2014
Programmierung Gesichtserkennung mit der Web-Camera
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.