France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 511 membres enregistrés - 2 069 326 posts - 122 027 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Sujets divers
                [Java] Detection de mouvements [RESOLU] - Projet SourceForge
78 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
1,2 | Suivant
[Java] Detection de mouvements [RESOLU] - Projet SourceForge

kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 07 July 2005 - 02 h 10 m 24 s
Bonjour,

Je suis en train de developper un systeme de video surveillance simple en Java que je mettrai + tard sur sourceforge ou dev.java.net. Mais actuellement je bloque sur le systeme de detection de mouvement.

En gros, le systeme fonctionne avec le JAI/JMF de Sun => je capture a intervalle regulier des screenshot d une source video quelconque (=> j obtiens des PlanarImage que je peux transformer en BufferedImage ou autres si necessaire) et je cherche a savoir quand il y a eu un mouvement, en comparant ces images.

Ces spec ne sont pas modfiiables pour l instant.

Pour le peu que je connaisse du traitement d images, la meilleure detetion que j ai pu faire etait en :

1. transformant les captures en images noir et blanc
2. faire un diff entre ces images (deux pour l instant) pour faire ressortir les contours (differences), qui ressortent avec plus de luminosite
3. obtenir l histogramme du diff
4. je compte le nombre de bins pour la seule bande qui existe (image en N&B) dont la valeur est en dessous de 10.
5. je fais un ratio

Petite info :
Dans une image en N&B, on a un bande au lieu de trois car chaque pixel a sa couleur RGB=(x,x,x) au lieu de RGB=(x,y,z). En gros, je compte le nombre de pixels de l image dont la luminosite est inferieure a RGB=(10,10,10).

    Code     
 1. private float getBlackRatio(final PlanarImage img)
 2.     {
 3.         final int grayBand = 0;
 4.         final int blackRate = 10;
 5.         
 6.         final  ParameterBlock pb = new ParameterBlock();
 7.         pb.addSource(img);
 8.         pb.add(null).add(1).add(1);
 9.         pb.add(new int[] {256});
10.         pb.add(new double[] {0.0D});
11.         pb.add(new double[] {256.0D});
12.         
13.         final Histogram histogram = (Histogram) JAI.create("histogram", pb, null).getProperty("histogram");
14.         
15.         float blackNb = 0.0F;
16.         for (int i = 0; i < blackRate; i++) 
17.         {
18.             blackNb += histogram.getBinSize(grayBand, i);
19.         }
20.         
21.         return blackNb / histogram.getTotals()[grayBand];
22.     }


Mais le probleme en fesant ca c est que la valeur arbitraire de 10 est celle donnant de meilleurs resultats etant donne que cette methode se base sur la luminosite.
Or il peut y avoir peu de mouvement tout en ayant un changement de luminosite, et pire encore, avoir un mouvement et un changement de luminosite sur les objets qui ont bouge, ce qui peut entrainer uen annulation partielle de la difference...

Je precis que j ai cherche pas mal sur google, dans les limites de mes connaissance mais la si vous connaissez un site qui explique comment traiter des images pour trouver des differences dans les mouvements, formes ou autre, de preference en Java ce serait super !

Avis aux suggestions !

Merci :)

EDIT - 2005-08-30 : Pour ceux que ca interesse, j ai mis le projet sur sourceforge. C est juste un debut. Si vous avez envie de participer (doc, site, programmation java si vous connaissez tres bien le java et ANT, et surtout vos design patterns !) j ai ausun probleme a ce que vous rejoignez le projet !


Message édité 2 fois, la dernière par kha le 30 August 2005 - 16 h 11.


Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 07 July 2005 - 10 h 00 m 07 s
Bonjour,

J'ai deja fait cela. Sinon, il existe une solution Open Source GPL qui s'appelle motion en C et non en Java.
Voici comment j'ai procédé. J'ai gardé les couelurs d'origine de l'image et pour chaque pixel je compare les valeurs RGB. Sachant que les capteurs CCD ne sont pas parfaits, j'applique un coef de tolerance. Je considère que les pixels sont reellement differnts si la difference des valeurs RGB est superieure à la tolerance. D'autre part je considere qu'il y a mouvement si on a un nombre minimum de pixels differents. En jouant sur ces 2 parametres, on peut affiner la detection en la rendant plus ou moins sensible.

Pour mon cas, j'ai retenu un minimum de 200 pixels differents pour declarer un mouvement et la difference RGB devait etre superieure à 30, pour une image en 640x480.

Apres on peut aussi mesurer la distance entre 2 pixels differents car en general, c'est tout une zone qui bouge. et/ou choisir des zones...

Voala, hope that helps.



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 07 July 2005 - 10 h 30 m 30 s
Juste pour info j'ajoute le site de motion qui au depart est dedié au camera USB mais qui gere quelques cameras IP type AXIS.

http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome

Lorsque je m'y etait interessé je l'ai trouvé un peu lourd et lent. La multiplication des fonctionnalités en avait fait un mastodonte. Je ne sais pas si c'est encore le cas aujourd'hui...



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


gege38
- Ancien Modérateur -
Chief of the
(¯`·.__[T3aM.BouL3T©]__.·´¯)
Potatoe Reloaded

Messages : 14 114
Inscrit le 05/02/03
Ville : Domène
Non connecté
  Posté le 07 July 2005 - 11 h 57 m 06 s
Regarde du coté des réseaux neuronaux, ils ont quelques applications de traitement d'image assez performants :)

Je vais chercher de mon coté de ce coté là et je te recontacte ;)



" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld


kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 07 July 2005 - 15 h 44 m 05 s
Merci pour vos reponses !

Je vais essayer de faire une comparaison pixel par pixel, mais en java a part utiliser la fonction getRGB(x, y) de la classe BufefredImage pour recup la valeur rgb du pixel donne, je sais pas comment faire... il faudrait que jarrive a recuperer la matrice rgb de l image...

J avais essaye cette methode deja pour avoir qq valeurs rgb, et pour parcourir 800x600 px elle est pas mal lente => faut que je trouve autre chose je vais voir ca de + pres. c est une bonne piste ! Et c + simple aussi ! Faut juste que je trouve comment recup. l ensemble des valeurs rgb d une shot.

Pour les reseaux neuronnaux, c est pas trop complique ?




kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 07 July 2005 - 15 h 53 m 57 s
J ai trouve ca aussi : ca peut aider ;)
http://bart.sm.luth.se/~mathed-8/mDec/index.html




kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 07 July 2005 - 16 h 09 m 27 s




Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 07 July 2005 - 16 h 25 m 24 s
C'est bizarre de faire de la detection de mouvement en Java. En general, le traitement d'image se fait avec un langage compilé comme c'est un gros consommateur de ressource et de puissance... En C++ avec un Celeron 1,7 Ghz, on atteiganit un traitement de 15 images / seconds sachant qu'on recevait les données compressées.

Sinon, en C, j'avais les images dans des buffers et je les comparais octet par octet soit 3 octets par pixel en 24bits.
Mes connaissances Java sont assez limitées mais n'existe-t-il pas une fonction/methode qui renvoit un tableau ou un vecteur voire une matrice contenant les pixels de l'image?



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 07 July 2005 - 16 h 39 m 14 s

T'es oblige de le faire en Java ?

Va falloir que tu utilises des tableaux normaux pour representer tes images alors ..




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 07 July 2005 - 17 h 58 m 44 s
Oui je pense que je peux recupere des arrays au lieu de traiter pixel par pixel. Enfin ca doit sinon c est poche !

L avantage de Java c est que c est portable sans avoir besoin d etre recompile. le JAI et JMF permettent justement de faire abstraction des peripheriques, et de les gerer en tant que source. Et puis le traitement est assez simple et ce langage est + productif et permet + d evolutivite que si j avais fais en C. Il y a aussi beaucoup plus de librairies reutilisables et integrables facilement.

Je veux pas partir une polemique C/Java, mais pour ma part je pense que le C a juste avantage dans le bas niveau actuellement (systeme, raw socket, temps reel, virus, ...) pour la maintenance. Et les machines devenant de + en + performantes, le Java ne peut qu etre de plus en plus utilise car c est un langage + productif du point de vue gestion de projet. Surtout qu il est deja present dans des systemes embarques et temps reel aujourd hui.

Ya deja des examples qui ont l air de bien fonctionner dans les liens + haut donc je vais checker ca.




Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 08 July 2005 - 09 h 29 m 00 s
Peux-tu nous tenir au courant des performances lorsque ton projet tournera?. Je suis assez interessé par les résultats en Java.
Les exemples sités ci-dessus sont fait par des labos de recherche je crois ou ils cherchent plus à valider un algorithme, un process ou un resultat qu'a avoir des performances.


Message édité 1 fois, la dernière par Gosseyn le 08 July 2005 - 09 h 30.

"Si vous perdez, ne perdez pas la leçon."
Gosseyn


iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 08 July 2005 - 10 h 08 m 05 s

Le traitement d'images .. tout comme la synthese d'images me parait necessiter un langage rapide ..

En tout cas acceder par une methode a un pixel n'est vraiment pas performante du tout ..




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 08 July 2005 - 10 h 49 m 49 s
Peux-tu nous proposer une meilleure méthode?



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 08 July 2005 - 11 h 21 m 55 s

C'est pas evident ?




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 08 July 2005 - 13 h 21 m 12 s
non.



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 08 July 2005 - 14 h 19 m 28 s
Salut,
Oui bien sur des que j aurai vu tout ca je pensais paster le code ici. Ya pas de pb !

Avant , je mettrai le code pour la detection de changement de luminosite que je fais la. D ailleurs dans les site que j ai pu voir il y en a qui utilisent cette methode car elle est plus rapide qu une comparaison pixel par pixel. Mais il doivent faire qq chose en + car j obtient pas des resultats assez fiables.

Je verrai tout ca ce soir ou dimanche. Ce sera le petti matin pour vous donc ;)




iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 08 July 2005 - 16 h 56 m 42 s


Le 08 juillet 2005 - 13 h 21, Gosseyn a écrit :
non.


Relis tout et quand tu verras le mot tableau tu comprendras ..




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 08 July 2005 - 17 h 00 m 44 s
De toute façon, pour la vitesse, il s'agit juste de s'assurer que le temps de traitement ne dépasse pas le délai entre deux acquisitions. Avec des images de webcam (je suppose à 30 images/secondes en 640x480), je suppose que le processeur suit encore...
kha, tu nous laisseras des mesures de temps ? (des fois que ça montre que mon stage en septembre ne servira à rien :dd: )



Huile de fraise.

kha
Google is your best friend

Messages : 1 236
Inscrit le 01/03/02
Ville : Montreal
Non connecté
  Posté le 08 July 2005 - 22 h 19 m 44 s
Pour le temps, ma webcam est capable de capturer environ jusqu a 20/25 img âr sec, mais par defaut elle est a 15 je crois. MAis ca ca importe peu car je limite la prise de capture a un intervalle minimum de 1 seconde. Donc il faut que mon traitement se passe en 1 sec ou moins.

Les images ont une taille par defaut de 800x600, changeable.

Si le traitement prend plus de temps c est pas grave car j ai prevu une "queue" : le systeme de capture place les images ds une queue et elle sont recuperer par un thread "consumer"

le hic c est juste que si l utilisateur met une valeur maxi a la queue, ben le systeme de capture ne mettra pas ses captuere dedans et affichera uen exception mais sans planter.


Message édité 1 fois, la dernière par kha le 08 July 2005 - 22 h 20.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 08 July 2005 - 22 h 39 m 41 s
À mon avis en 1 seconde tu as largement le temps.

Le coup de la queue, c'est bien, mais s'il y a du monde dedans, c'est parce que le thread consumer ne suit pas. Si la tendance se maintient, il risque de prendre de plus en plus de retard et ça finit par exploser !

Tu peux aussi faire un système du genre : les images prises pendant un traitement sont sautées. Ça marche aussi.



Huile de fraise.

1,2 | Suivant
Page genérée en 0.2194 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory