Programmierung Gesichtserkennung mit der Web-Camera
Author D.Selzer-McKenzie
import processing.video.*;
import monclubelec.javacvPro.*;
import java.awt.*;
import java.util.*;
Capture cam1;
OpenCV opencv;
Rectangle[] faceRect;
ArrayList faceList;
int faceCount = 0;
float sum=0;
int scl=1;
int frame=0;
boolean delFaces;
void setup() {
cam1= new Capture(this, 1280, 720);
cam1.start();
opencv = new OpenCV(this);
opencv.allocate(cam1.width, cam1.height);
size (opencv.width(), opencv.height());
opencv.cascade("/usr/share/opencv/haarcascades/", "haarcascade_frontalface_alt_tree.xml");
faceList = new ArrayList();
}
void draw() {
if (cam1.available()) {
cam1.read();
opencv.copy(cam1);
println(abs(opencv.sum()-sum)/1000000);
if (abs(opencv.sum()-sum)/1000000 >7) delFaces=true;
else delFaces=false;
sum=opencv.sum();
faceRect = opencv.detect(false);
image(opencv.getBuffer(), 0, 0);
if (faceList.isEmpty()) {
for (int i = 0; i < faceRect.length; i++) {
faceList.add(new Face(faceRect[i].x, faceRect[i].y, faceRect[i].width, faceRect[i].height));
}
}
else if (faceList.size() <= faceRect.length) {
boolean[] used = new boolean[faceRect.length];
for (Face f : faceList) {
float 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;
}
}
used[index] = true;
f.update(faceRect[index]);
}
for (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));
}
}
}
else {
for (Face f : faceList) {
f.available = true;
}
for (int i = 0; i < faceRect.length; i++) {
float 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;
}
}
Face f = faceList.get(index);
f.available = false;
f.update(faceRect[i]);
}
for (Face f : faceList) {
if (f.available) {
f.countDown();
if (f.dead()) {
f.delete = true;
}
}
}
}
for (int i = faceList.size()-1; i >= 0; i--) {
Face f = faceList.get(i);
if (f.delete || delFaces) {
faceList.remove(i);
}
}
for (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");
}
String timestamp() {
Calendar now = Calendar.getInstance();
return String.format("%1$ty%1$tm%1$td_%1$tH%1$tM%1$tS", now);
}
class Face {
Rectangle r;
boolean available;
boolean delete;
int timer = 63;
int id;
Face(int x, int y, int w, int h) {
r = new Rectangle(x, y, w, h);
available = true;
delete = false;
id = faceCount;
faceCount++;
}
void 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);
}
void update(Rectangle newR) {
r = (Rectangle) newR.clone();
}
void countDown() {
timer--;
}
boolean dead() {
if (timer < 0) return true;
return false;
}
}
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.