Modifier une vidéo en temps réel [ Résolu .. en partie]

Modifier une vidéo en temps réel [ Résolu .. en partie] - Java - Programmation

Marsh Posté le 20-09-2003 à 12:15:17    

Bonjour.
Ce que je voudrais faire c'est :  
1) capturer la vidéo par une WebCam
2) Modifier "la vidéo" en appliquant par ex un filtre rouge
3) l'afficher... en espérant que le traitement image par image ne soit pas trop long et rende qq chose qui soit assez fluide.
 
Alors pour l'instant ,j'arrive à capturer la vidéo d'une webcam , appliquer un filtre à une image , quand je clique sur un bouton "Filtre" et afficher le résultat ... ce que je voudrais faire maintenant ,c'est la modification "en temps réel" de ce que vois la caméra.
Voila à quoi ressemble ce que j'ai réalisé.
http://www.multimania.com/biologiemol/video.JPG
Tout à gauche, un panel contenant l'image Capturée/Filrée
Tout à droite , la vidéo qui s'affiche en tps réel.
 
J'ai mis comme code sur le bouton "Restore" : (c'est simplement pour que je puisse commencer le traitement quand je le désire .. mais le bouton restore n'avait pas cette tache à la base ... c'est juste temporaire)

Code :
  1. public void actionPerformed(ActionEvent e) {
  2.   Component c = (Component)e.getSource();
  3.   if (c==acquis) {
  4. /** etc....**/
  5.                 }
  6. /**etc...**/
  7.                 if (c==restore) {
  8.          compteur=0;
  9.   while(compteur<2) { // Qui deviendra une boucle  
  10. //sans fin par la suite , pour vérifier le bon fonctionnement  
  11. // du prog
  12.   acquis.doClick();
  13.   filtreR.doClick();
  14.   compteur++;
  15.   imgPanel.setImage(img);
  16.   for(int i=0;i<100000000;i++){
  17. //Boucle immonde sensé simuler une pause ...
  18.   }
  19.   System.out.println("Ok" );
  20.  }
  21. }


Donc le prog est sensé simuler un appui sur Acqui . Ce qui charge en mémoire l'image (dans un objet de type Image) que l'on voit à la caméra ,mais ne l'affiche pas .
Puis un appui sur filtre qui opère sur l'image chargé.
Enfin , j'affiche l'image dans le panel tout à gauche.

Voila le pb :
Le compteur est à deux , donc je devrais voir 2 images s'afficher successivement .... tenant compte de la pseudo pause pas propre que j'ai rajouté . Cependant , la première image capturée/filtrée ne s'affiche pas ,uniquement la deuxième s'affiche..... Or je voudrais avoir qq chose qui ressemble à du filtrage temps réel de la vidéo  
 
Une idée ?  
Merci d'avance.
C@limerot
 
NB : Edit :
l'objet imgPanel est un objet de la classe ImagePanel suivante :

Code :
  1. class ImagePanel extends Panel
  2.    {
  3.      public Image myimg = null;
  4.    
  5.      public ImagePanel()
  6.      {
  7.        setLayout(null);
  8.        setSize(320,240);
  9.      }
  10.    
  11.      public void setImage(Image img)
  12.      {
  13.        this.myimg = img;
  14.        repaint();
  15.      }
  16.    
  17.      public void paint(Graphics g)
  18.      {
  19.        if (myimg != null)
  20.        {
  21.          g.drawImage(myimg, 0, 0, this);
  22.        }
  23.      }
  24.    }


Message édité par calimerot le 20-09-2003 à 14:13:50
Reply

Marsh Posté le 20-09-2003 à 12:15:17   

Reply

Marsh Posté le 20-09-2003 à 14:13:23    

Résolu :  
L'utilisation d'un thread permet de résoudre le pb ... maintenant, il faut alléger les traitements pour accélérer l'affichage ... pour faire du "temps réel" :
 

Code :
  1. else if(c == restore) {
  2.    //System.out.println("Restauration de l'image avant modification" );
  3.    th = new myThread();
  4.    th.start();
  5.   }
  6.  }
  7.  class myThread extends Thread {
  8.   boolean afini = false;
  9.   public void run() {
  10.    try {
  11.    System.out.println("Exécution du Thread" );
  12.    acquis.doClick();
  13.   filtreR.doClick();
  14.      imgPanel.setImage(img);
  15.      //sleep(1); A priori inutile mais je pensais
  16. // qu'une pause permettrait au thread principal d'avoir
  17. // les ressources du processeur pour lui tout seul ...  
  18. // permettant peut être d'afficher la vidéo de droite
  19. // d'une manière plus fluide
  20.      run();
  21.      }
  22.      catch(Exception e){}
  23.   }
  24.  }


Quoi que la vidéo à droite ne continue pas à s'afficher .. j'ai des ralentissements . Meme si le thread principal est en concurrence avec le thread créé ... j'aurais pensé avoir qq chose de plus ou moins fluide .
 
enfin voila .

Reply

Marsh Posté le 20-09-2003 à 18:37:09    

juste par curiosité,, c'est difficile a mettre en place?
t utilise une api spéciale genre Java Media framework ?
le code source est t il dispo ?  :whistle:  
 
 
 

Reply

Marsh Posté le 20-09-2003 à 18:44:17    

Citation :

  for(int i=0;i<100000000;i++){
          //Boucle immonde sensé simuler une pause ...

:lol:

Reply

Marsh Posté le 20-09-2003 à 22:18:49    

veryfree a écrit :

juste par curiosité,, c'est difficile a mettre en place?
t utilise une api spéciale genre Java Media framework ?
le code source est t il dispo ?  :whistle:  
 
 
 
 


 
c'est du JMF oui :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 20-09-2003 à 22:33:30    

DarkLord a écrit :


 
c'est du JMF oui :)


 
je veux le meme alors  [:snoozy]

Reply

Marsh Posté le 21-09-2003 à 00:19:29    

veryfree a écrit :


 
je veux le meme alors  [:snoozy]  


 
Effectivement ,c'est du JMF ;
Ce n'est pas particulièrement dur à mettre en place , mais le tps de tout développer , il m'a fallu deux semaines  :bounce:  
Le tout étant de mettre la main sur du code assez bien construit pour le comprendre ... et l'adapter .
Si tu veux le code :
http://www.multimania.com/biologiemol/Convertisseur/
Les commentaires ne sont pas forcément trés clair ... j'ai laissé ceux que j'avais mis sans les retoucher ... si tu as des questions :
calimerot_6@hotmail.com

Reply

Marsh Posté le 22-09-2003 à 15:33:09    

merci bien je regarde ca qd je peux :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed