Обработка OpenCV+ - FaceDetection в фильме
Я использую "Обработка" с OpenCV Lib и хотел переписать пример кода от создателей Git, чтобы вместо определения лица при захвате камеры я загружал видео (.mp4).
Ссылка на Git и пример кода (который работает): Ссылка
Вот мой эскиз:
import processing.video.*;
import gab.opencv.*;
import java.awt.Rectangle;
OpenCV opencv;
Movie myMovie;
Rectangle[] faces;
void setup() {
size(480, 270);
myMovie = new Movie(this, "people3.mp4");
myMovie.loop();
opencv = new OpenCV(this, myMovie.width, myMovie.height);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
}
void movieEvent(Movie myMovie) {
myMovie.read();
}
void draw() {
background(0);
if (myMovie.available()) {
opencv.loadImage(myMovie);
faces = opencv.detect();
image(myMovie, 0, 0);
if (faces != null) {
for (int i = 0; i < faces.length; i++) {
strokeWeight(2);
stroke(255, 0, 0);
noFill();
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
}
}
}
То, что я получаю, это
IndexOutOfBoundsException: индекс: 3, размер: 0
на openCV.loadImage(myMovie), и я не знаю почему.
Ценю любую помощь!
1 ответ
Сделано это работает. Не спрашивайте меня почему, но необходимо вызвать обе функции: Movie.loop() и Movie.play(). Вот и все:
import processing.video.*;
import gab.opencv.*;
import java.awt.Rectangle;
OpenCV opencv;
Movie myMovie;
Rectangle[] faces;
void setup() {
size(480, 270);
myMovie = new Movie(this, "people3.mp4");
opencv = new OpenCV(this, 480, 270);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
myMovie.loop();
myMovie.play();
}
void draw() {
//Movie needs time to load into canvas, so we wait until we get a height
while (myMovie.height == 0 ) delay(10);
image(myMovie, 0, 0);
opencv.loadImage(myMovie);
faces = opencv.detect();
if (faces != null) {
for (int i = 0; i < faces.length; i++) {
strokeWeight(2);
stroke(255, 0, 0);
noFill();
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
}
}
void movieEvent(Movie myMovie) {
myMovie.read();
}