Bonsoir,
Je viens de passer toute ma soirée sur un problème que je croyais pourtant facile à régler. *suspens* Je suis en train de faire un petit projet de chat vidéo où l'on ne voit que les deux yeux de son interlocuteur au lieu de tout le champ de la caméra. Du coup, j'ai commencé par faire de beaux eye tracking avec la librairie opencv_processing, qui marche assez bien, et j'ai même réussi à construire le rectangle autour des deux yeux, ce qui était et reste d'ailleurs assez chiant. C'est accessoire, donc j'en parlerai après.
Le vrai problème, c'est qu'il faut extraire ce foutu rectangle de l'image et le conserver, tout en vidéo qu'il est... et sans le reste. Ça a l'air simple, mais il n'existe apparemment pas de fonction dans Processing pour réaliser des saveFrame avec des découpes; ni même avec des requêtes de variables.
Bon, trève de tergiversations, voici le code:
import gab.opencv.*; import processing.video.*; import java.awt.*; Capture video; OpenCV opencvLeft; OpenCV opencvRight; void setup() { size(640, 480); video = new Capture(this, 640/2, 480/2); opencvLeft = new OpenCV(this, 640/2, 480/2); opencvRight = new OpenCV(this, 640/2, 480/2); opencvLeft.loadCascade("/Users/Upermuk/Documents/Processing/libraries/opencv_processing/library/cascade-files/haarcascade_mcs_lefteye.xml", true); opencvRight.loadCascade("/Users/Upermuk/Documents/Processing/libraries/opencv_processing/library/cascade-files/haarcascade_mcs_righteye.xml", true); video.start(); } void draw() { scale(2); opencvLeft.loadImage(video); opencvRight.loadImage(video); image(video, 0, 0 ); noFill(); stroke(0, 255, 0); strokeWeight(1); Rectangle[] leftEye = opencvLeft.detect(2.2, 10, -1, 15, 40); Rectangle[] rightEye = opencvRight.detect(2.2, 10, -1, 15, 40); println(leftEye.length); println(rightEye.length); //cadre oeil gauche for (int i = 0; i < leftEye.length; i++) { //println(leftEye[i].x + "," + leftEye[i].y); rect(leftEye[i].x, leftEye[i].y, leftEye[i].width, leftEye[i].height); delay(60); } //cadre oeil droit for (int j = 0; j < rightEye.length; j++) { stroke(255, 0, 0); rect(rightEye[j].x, rightEye[j].y, rightEye[j].width, rightEye[j].height); delay(60); } //cadre englobant oeil directeur for (int k = 0; k < leftEye.length; k++) { stroke(0,0,255); // if (rightEye[k].y >= leftEye[k].y) { rect(leftEye[k].x, leftEye[k].y, leftEye[k].width*2+10, leftEye[k].height); delay(300); PImage shot=get(leftEye[k].x, leftEye[k].y, leftEye[k].width*2+10, leftEye[k].height); shot.save("foo-#######.jpg"); //} /* else if (rightEye[k].y <= leftEye[k].y) { rect(leftEye[k].x, leftEye[k].y, leftEye[k].width*2+10, leftEye[k].height); delay(300); } else { println("Error drawing boxing"); }*/ } } void captureEvent(Capture c) { c.read(); }
Vous verrez qu'il y a également un problème de conditions du cadre des deux yeux. Je voulais mettre une condition pour qu'il supporte un écart plus ou moins grand entre les deux yeux, de sorte qu'on voie toujours les deux yeux ensemble, et qu'il println une erreur si ce n'est pas le cas. rightEye servirait en quelque sorte uniquement à corriger leftEye, qui est visiblement directeur. La condition sur le for avec tous les rectangles, il a pas aimé: au début ça va, mais si on gigote un peu, Processing plante. Mais bon, ça marche quand même sans.
Du coup en gros maintenant, la stratégie serait plutôt d'éxécuter toutes les fonctions de détection avant de commencer la visualisation du sketch, et de ne récupérer dans la fenêtre que le fameux rectangle des deux yeux. Mais je vois pas trop comment m'y prendre, les inserts dans le setup ont donné des résultats exotiques (un mini-moi sur fond gris resizé à la forme du cadre des deux yeux, qui se baladent en fonction de mes gestes... c'est con que j'aie baqué cette version, c'était assez comique).
Voilà, j'ai la tête comme un seau et je vois des yeux partout.
Bonne nuit, help
Hors ligne
Première réponse vite faite. L'image vidéo que tu obtiens est une PImage, donc tu peux lui appliquer la méthode copy() :
https://www.processing.org/reference/PImage_copy_.html
Tu peux copier juste une portion d'image dans une nouvelle PImage que tu affichera par la suite.
A compléter …
Hors ligne
T'es étudiante en art et tu ne veux pas déclencher un son avec une webcam ???? Mais !! ?
C'est quoi ce bordel...
Hors ligne
Hors ligne
Un peu de patience, les exams c'est vers Avril . Çà vous laisse le temps de préparer des codes "tout fait" qui déclenchent différentes webcams selon des sons . pi pour une des rares fois où c'est pas : heeeeelp ! un truc clef en main siouplé, rendu pour hier (c'est le prof. qui nous donné cette url) .
bon fini mumuse je retourne du côté de frei0r .
Dernière modification par sakramh (2014-11-25 21:53:29)
Hors ligne
Pages: 1