kha
Google is your best friend
Messages : 1 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 07 juillet 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).
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 août 2005 - 16 h 11. |
| |
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 07 juillet 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 juillet 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 juillet 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 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 07 juillet 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 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 07 juillet 2005 - 15 h 53 m 57 s |
|
|
|
|
|
| |
|
kha
Google is your best friend
Messages : 1 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 07 juillet 2005 - 16 h 09 m 27 s |
|
|
|
|
|
| |
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 07 juillet 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 juillet 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 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 07 juillet 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 juillet 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 juillet 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 juillet 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 juillet 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 juillet 2005 - 11 h 21 m 55 s |
|
|
|
|
|
| |
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 juillet 2005 - 13 h 21 m 12 s |
|
|
|
|
|
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|
kha
Google is your best friend
Messages : 1 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 08 juillet 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 juillet 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 juillet 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  )
|
|
| |
Huile de fraise.
|
kha
Google is your best friend
Messages : 1 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 08 juillet 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 juillet 2005 - 22 h 20. |
| |
|
Petit_PimoOosE
rsqrtps & pshufb
Messages : 4 617 Inscrit le 15/06/03
Ville : Montréal
Non connecté
|
|
Posté le 08 juillet 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.
|