Hello tout le monde !
Je me présente rapidement : Je suis étudiant en Information-communication et Hypermédia à Annecy. J'ai un projet de groupe qui consiste à réaliser une installation multimédia !
Je suis de l'ordre du novice total en programmation (le HTML et CSS ça aide pas trop pour la kinect ) et j'aimerais réaliser un détourage d'une personne en temps réel sans fond vert via une kinect (ou autre, si c'est possible !) afin d'enlever son background et de lui mettre une vidéo à la place. J'ai pas mal cherché tout ce qui se faisait avec la kinect mais le milieu est assez fermé et très vite compliqué, c'est pourquoi je suis venu chercher de l'aide par ici !
J'ai trouvé pas mal de vidéo sur youtube, c'est quelque chose dans ce genre là qu'il me faudrait :
https://www.youtube.com/watch?v=voShjOoPmpo
Si vous avez des idées, des solutions, des bonbons, ou quoique ce soit, tout aide me sera utile !
(je tiens à préciser que je suis certes totalement débutant dans ce milieu, mais motivé à travailler autant qu'il le faudra ! )
Et sur ce, je vous souhaite à tous une bonne soirée / journée / matinée / autre ! (rayez la mention inutile)
Love,
Azeb.
Dernière modification par Azeb (2014-03-25 22:59:04)
Hors ligne
Bonsoir,
Processing me paraît tout indiquer pour réaliser ton projet.
Pour cela il faut installer Processing et les autres composants pour la kinect :
http://wiki.labomedia.org/index.php/Kinect#Installation
Ensuite, tu lances un exemple genre DepthImage.
Plus l'image est proche, plus elle est claire.
Il faut que tu apprennes à manipuler les images sous Processing.
La tâche n'est pas du tout impossible.
Hors ligne
Salut!
La kinect est parfaitement adaptée pour ton projet. Je te conseille de te procurer le bouquin "Making Things See"de Greg Borenstein, qui t'expliquera comment installer ta Kinect et tous les drivers nécessaire, et surtout qui t'explique de manière détaillé comment réaliser un détourage automatique des personnes sans fond vert avec processing et une kinect (c'est un des projet du bouquin, tout est parfaitement expliqué, le code est fournie et détaillé...).
Bonne chance!
Adrien
Dernière modification par Adiou (2014-03-26 10:27:21)
Hors ligne
Salut !
Alors voilà j'ai jeté un oeil au livre "Making Things See", et je me suis attaqué à l'étape du détourage !
Malheureusement j'ai bien mon image en background mais la silhouette n'apparait pas...
J'ai corrigé deux erreurs que Processing me sortait comme un ami me l'a conseillé pour l'exercice d'avant (qui consistait à simplement détouré la silhouette en vert sur fond noir) :
kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_NONE); ----> kinect.enableUser(); et
userMap = kinect.getUsersPixels(SimpleOpenNI.USERS_ALL); --------> userMap = kinect.userMap();
Le problème vient peut-être de là ?
Voilà le code en entier :
import SimpleOpenNI.*;
SimpleOpenNI kinect;
boolean tracking = false;
int userID;
int[] userMap;
// declare our background
PImage backgroundImage;
void setup() {
size(640, 480);
kinect = new SimpleOpenNI(this);
kinect.enableDepth();
// enable color image from the Kinect
kinect.enableRGB();
kinect.enableUser();
// turn on depth-color alignment
kinect.alternativeViewPointDepthToImage();
// load the background image
backgroundImage = loadImage("empire_state.jpg");
}
void draw() {
// display the background image
image(backgroundImage, 0, 0);
kinect.update();
if (tracking) {
// get the Kinect color image
PImage rgbImage = kinect.rgbImage();
// prepare the color pixels
rgbImage.loadPixels();
loadPixels();
userMap = kinect.userMap();
for (int i =0; i < userMap.length; i++) {
// if the pixel is part of the user
if (userMap[i] != 0) {
// set the sketch pixel to the color pixel
pixels[i] = rgbImage.pixels[i];
}
}
updatePixels();
}
}
Voilà, si quelqu'un a une idée !
Après il me restera encore à trouver comment remplacer l'image par une vidéo ^^
Merci à tous !
Azeb
Hors ligne
Bonjour,
voilà une piste de travail pour toi :
import SimpleOpenNI.*; SimpleOpenNI kinect; boolean tracking = true; int userID; int[] userMap; // declare our background PImage backgroundImage; int seuil; void setup() { size(640, 480); kinect = new SimpleOpenNI(this); kinect.enableDepth(); // enable color image from the Kinect kinect.enableRGB(); backgroundImage = loadImage("empire_state.jpg"); seuil = 900; } void draw() { // display the background image image(backgroundImage, 0, 0); kinect.update(); if (tracking) { // get the Kinect color image PImage rgbImage = kinect.rgbImage(); // prepare the color pixels rgbImage.loadPixels(); loadPixels(); userMap = kinect.depthMap(); for (int i =0; i < userMap.length; i++) { // if the pixel is part of the user if ((userMap[i] > 0) && ( userMap[i] < seuil)) { // set the sketch pixel to the color pixel pixels[i] = rgbImage.pixels[i]; } } updatePixels(); text(seuil, 20, 20); } } void keyPressed() { if (keyCode == UP) { seuil += 10; } if (keyCode == DOWN) { seuil -= 10; } }
Hors ligne
Hello again,
J'ai réussi à avoir un résultat pas mal avec un code qui ressemble à celui que tu m'as mis ici.
J'ai vu avec un prof pour mettre une vidéo en background et j'ai essayé avec du code glané de ci de là, mais au vu de ce que je comprends au code c'est du mission impossible
Voilà ce que j'ai pour le moment :
Si jamais il y a une âme charitable qui aurait une réponse...
import processing.opengl.*; import SimpleOpenNI.*; //install this on your machine and also the library in processing //http://code.google.com/p/simple-openni/wiki/Installation SimpleOpenNI kinect; boolean tracking = false; int userID; int[] userMap; // declare our images PImage backgroundImage; PImage resultImage; void setup() { size(640*2, 480); // load the background image backgroundImage = loadImage("http://www.eheart.com/SHASTA/wallpaper/alpenglow-640x480.jpg"); kinect = new SimpleOpenNI(this); if(kinect.isInit() == false) { println("Can't init SimpleOpenNI, maybe the camera is not connected!"); exit(); return; } // enable depthMap generation kinect.enableDepth(); // enable skeleton generation for all joints kinect.enableUser(); // enable color image from the Kinect kinect.enableRGB(); //enable the finding of users but dont' worry about skeletons // turn on depth/color alignment kinect.alternativeViewPointDepthToImage(); //create a buffer image to work with instead of using sketch pixels resultImage = new PImage(640, 480, RGB); } void draw() { kinect.update(); // get the Kinect color image PImage rgbImage = kinect.rgbImage(); image(rgbImage, 640, 0); if (tracking) { //ask kinect for bitmap of user pixels loadPixels(); userMap = kinect.userMap(); for (int i =0; i < userMap.length; i++) { // if the pixel is part of the user if (userMap[i] != 0) { // set the pixel to the color pixel resultImage.pixels[i] = rgbImage.pixels[i]; } else { //set it to the background resultImage.pixels[i] = backgroundImage.pixels[i]; } } //update the pixel from the inner array to image resultImage.updatePixels(); image(resultImage, 0, 0); } } void onNewUser(SimpleOpenNI curContext, int userId) { userID = userId; tracking = true; println("tracking"); //curContext.startTrackingSkeleton(userId); } void onLostUser(SimpleOpenNI curContext, int userId) { println("onLostUser - userId: " + userId); } void onVisibleUser(SimpleOpenNI curContext, int userId) { //println("onVisibleUser - userId: " + userId); }
Au plaisir,
Azeb
Hors ligne
Voilà, l'idée :
import processing.opengl.*; import SimpleOpenNI.*; import processing.video.*; //install this on your machine and also the library in processing //http://code.google.com/p/simple-openni/wiki/Installation Movie film; SimpleOpenNI kinect; boolean tracking = false; int userID; int[] userMap; // declare our images PImage backgroundImage; PImage resultImage; void setup() { size(640*2, 480); // load the background image backgroundImage = loadImage("http://www.eheart.com/SHASTA/wallpaper/alpenglow-640x480.jpg"); kinect = new SimpleOpenNI(this); if (kinect.isInit() == false) { println("Can't init SimpleOpenNI, maybe the camera is not connected!"); exit(); return; } // enable depthMap generation kinect.enableDepth(); // enable skeleton generation for all joints kinect.enableUser(); // enable color image from the Kinect kinect.enableRGB(); //enable the finding of users but dont' worry about skeletons // turn on depth/color alignment kinect.alternativeViewPointDepthToImage(); //create a buffer image to work with instead of using sketch pixels resultImage = new PImage(640, 480, RGB); film = new Movie(this, "tagazou.mov"); film.loop(); } void draw() { kinect.update(); // get the Kinect color image PImage rgbImage = kinect.rgbImage(); image(rgbImage, 640, 0); if (tracking) { //ask kinect for bitmap of user pixels loadPixels(); userMap = kinect.userMap(); for (int i =0; i < userMap.length; i++) { // if the pixel is part of the user if (userMap[i] != 0) { // set the pixel to the color pixel resultImage.pixels[i] = rgbImage.pixels[i]; } else { //set it to the background resultImage.pixels[i] = film.pixels[i]; } } //update the pixel from the inner array to image resultImage.updatePixels(); image(resultImage, 0, 0); } } void onNewUser(SimpleOpenNI curContext, int userId) { userID = userId; tracking = true; println("tracking"); //curContext.startTrackingSkeleton(userId); } void onLostUser(SimpleOpenNI curContext, int userId) { println("onLostUser - userId: " + userId); } void onVisibleUser(SimpleOpenNI curContext, int userId) { //println("onVisibleUser - userId: " + userId); } void movieEvent(Movie m) { m.read(); }
Hors ligne
Hello !
Alors j'ai pris ton code, mais au moment de lancer j'ai ce message d'erreur en boucle :
JNA: Callback org.gstreamer.elements.AppSink$2@2695c1ab threw the following exception:
java.lang.NoClassDefFoundError: Could not initialize class org.gstreamer.lowlevel.AppAPI
at org.gstreamer.elements.AppSink.gst(AppSink.java:38)
at org.gstreamer.elements.AppSink.pullBuffer(AppSink.java:128)
at org.gstreamer.elements.RGBDataAppSink$AppSinkNewBufferListener.newBuffer(RGBDataAppSink.java:144)
at org.gstreamer.elements.AppSink$2.callback(AppSink.java:184)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:455)
at com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:485)
Est-ce qu'il me manque un fichier quelque part ?
Azeb
Hors ligne
Arrive-tu à faire tourner le programme vidéo des exemples :
File > Examples > Librairies > Video > Movie > Loop
As-tu bien remplacer tagazou.mov par ton fichier vidéo ?
Quelle est ta configuration matérielle et logicielle ?
Hors ligne
Non le programme vidéo en exemple ne se lance pas non plus,
J'ai bien remplacé par une vidéo aux bonnes dimensions dans un dossier data.
Je tourne sur windows 7 SP1, Processing 2.1.1., SimpleOpenNI Version 1.96
quand je lance avec le code, j'ai bien à droite l'image de la kinect, à gauche le carré reste gris, et dans processing le message d'erreur.
Azeb
Hors ligne
On a finalement réussit à faire défiler 25 images /s en background au lieu de mettre une vidéo !
Azeb
Dernière modification par Azeb (2014-04-02 20:26:01)
Hors ligne
Pages: 1