In diesem Tutorial werden wir uns mit OpenCV beschäftigen. OpenCV (Wikipedia) ist eine Sammlung von Computer Vision Algorithmen, welche von Intel initiiert wurde. Sie beinhaltet einige interessante Funktionen, welche wir uns zu Nutze machen können. Dazu gehören neben den schon gelernten Funktionen (Background Subtraction, Brightest Point) auch Funktionen zum erkennen von Gesichtern oder dem Hervorheben von Kanten in einem Bild.
...
Die Library gibt es hier als Download: OpenCV for Processing (Referenz der Funktionen).
Getting Started
Die grundlegende Struktur von OpenCV for Processing ist sehr einfach.
Zuerst müssen wir die Library importiernimportieren:
Code Block |
---|
import gab.opencv.*; |
Dann können wirn wir ein OpenCV Steuerobjekt deklarieren:
...
Eine grosse Anzahl von Beispielen kommt mit der Library und es wird empfohlen sich diese einmal genauer anzusehen. In den folgenden Beispielen werden die vier wichtigsten Funktionen der Library vorgestellt.
Background Subtraction
Folgendes Beispiel zeigt, wie ein Hintergrundbild mit einem Vordergrundbild verglichen wird. Dazu übergeben wir im setup()
nach der Initialisierung der Library mit dem Befehl opencv.startBackgroundSubtraction(5, 3, 0.5);
drei Parameter.
...
Alle Regionen, welche auf dem folgenden Bild in Rot dargestellt sind, haben sich in den letzten Frames verändert.
Brightest Point
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
Code Block | ||||
---|---|---|---|---|
| ||||
import gab.opencv.*;
import processing.video.*;
OpenCV opencv;
Capture video;
void setup() {
size(640, 480);
video = new Capture(this, width, height, 30);
opencv = new OpenCV(this, width, height);
opencv.startBackgroundSubtraction(5, 3, 0.5);
video.start();
}
void draw() {
background(255);
if (video.available()) {
video.read();
}
// image(video, 0, 0);
opencv.loadImage(video);
opencv.updateBackground();
opencv.dilate();
opencv.erode();
fill(255, 0, 0);
noStroke();
for (Contour contour : opencv.findContours()) {
contour.draw();
}
} |
Brightest Point
Mit OpenCV können wir sehr einfach 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();
.
Code Block | ||||
---|---|---|---|---|
| ||||
import gab.opencv.*;
import processing.video.*;
OpenCV opencv;
Capture video;
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);
image(opencv.getOutput(), 0, 0);
PVector loc = opencv.max();
fill(255, 0, 0);
noStroke();
ellipse(loc.x, loc.y, 50, 50);
} |
Face Detection
Eine sehr interessante Methode in OpenCV ist das sog. Face Detection. Mit dieser Funktion können wir Gesichter in einem Bild erkennen.
...
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);
} |
...
- Verwendet das bisher gelernte Wissen um Objekte (Partikel, Bilder, SVG’s) auf das Kamerabild reagieren zu lassen.
Weiteres
...
- OpenCV – offizielle Homepage