Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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

Image Added

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 Funktion
faces = 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
titleBeispiel
collapsetrue
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

Image Added

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.Image Removed

Code Block
titleBeispiel
collapsetrue
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.

...