...
Die Methode um den hellsten Punkt in einem Bild zu finden wurde in Beispiel “P04_6_Video_Kamerabild_Hellster_Punkt” schon besprochen. Mit OpenCV können wir viel einfacher auf diese Methode zugreifen. Dazu rufen wir die Funktion PVector loc = opencv.max();
welche uns direkt einen PVector mit den Koordinaten des hellsten Punktes zurückgibt. In gleicher Weise können wir auch die Koordinaten des dunkelsten Punktes finden PVector loc = opencv.min();
.
Face Detection
Eine sehr interessante Methode in OpenCV ist das sog. Face Detection. Mit dieser Funktion können wir Gesichter in einem Bild erkennen. Beispiel “P05_3_OpenCV_FaceDetection” zeigt, wie es geht.
Im setup()
müssen wir OpenCV zunächst ein sog. Haar-Cascade übergeben. Dieses bestimmt, nach welchen Mustern (Gesicht, Mund, Nase, Körper, usw.) der Algorithmus suchen soll:
Code Block |
---|
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); |
Im draw()
gibt uns die Funktionfaces = opencv.detect();
dann ein Die folgenden Funktion gibt uns ein Array vom Typ Rectangle zurück. Diese Rechtecke beschreiben die Bereiche im Bild, an welchen ein Gesicht erkannt wurde. Um die Rechtecke zu zeichnen iterieren wir durch das Array und stellen die Rechtecke dar.
Code Block |
---|
faces = opencv.detect(); |
Mit einer Schlaufe können wir diese dann durchgehen:
Code Block |
---|
for (int i = 0; i < faces.length; i++) { rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); } |
...
Code Block | ||||
---|---|---|---|---|
| ||||
import gab.opencv.*;
import java.awt.Rectangle;
import processing.video.*;
OpenCV opencv;
Rectangle[] faces;
Capture video;
void setup() {
size(640, 480);
video = new Capture(this, width, height, 30);
opencv = new OpenCV(this, width, height);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
// CASCADE_CLOCK
// CASCADE_NOSE
// CASCADE_MOUTH
// CASCADE_UPPERBODY
// CASCADE_PROFILEFACE
// CASCADE_EYE
// CASCADE_PEDESTRIANS
// ...
video.start();
}
void draw() {
if (video.available()) {
video.read();
}
image(video, 0, 0);
opencv.loadImage(video);
faces = opencv.detect();
noFill();
stroke(0, 255, 0);
strokeWeight(3);
for (int i = 0; i < faces.length; i++) {
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
} |
Region Of Interest
Eine weitere hilfreiche Funktion ist die Beschränkung von OpenCV auf einen bestimmten Bereich des Bildes. Dies ist immer dann hilfreich, wenn wir nur einen Teil des Bildes auf Veränderungen oder das Auftauchen von Gesichtern etc. überwachen wollen. Dazu rufen benutzen wir die folgende Funktion:
Code Block |
---|
opencv.setROI(mouseX, mouseY, roiWidth, roiHeight); |
Diese gibt einen rechteckigen Bereich an, welcher für OpenCV verwendet werden soll. Beispiel “P05_4_OpenCV_RegionOfInterest” gibt einen Überblick, wie diese Funktion genutzt werden kann.
Code Block | ||||
---|---|---|---|---|
| ||||
import gab.opencv.*;
import processing.video.*;
OpenCV opencv;
Capture video;
int roiWidth = 150;
int roiHeight = 150;
boolean useROI = true;
void setup() {
size(640, 480);
video = new Capture(this, width, height, 30);
opencv = new OpenCV(this, width, height);
video.start();
}
void draw() {
if (video.available()) {
video.read();
}
//image(video, 0, 0);
opencv.loadImage(video);
opencv.setROI(mouseX, mouseY, roiWidth, roiHeight);
opencv.findCannyEdges(20,75);
image(opencv.getOutput(), 0, 0);
} |
Aufgaben
- Verwendet das bisher gelernte Wissen um Objekte (Partikel, Bilder, SVG’s) auf das Kamerabild reagieren zu lassen.
...