Analyse d'image

Analyse d'image - C++ - Programmation

Marsh Posté le 23-10-2004 à 19:38:09    

Voila je dois concevoir un programme pour analyser une image et en tirer des coordonnées de différents objets prédéfinies.
 
Donc le flux d'image proviendrait d'une webcam ( 640x480 ), étant donné qu'il s'agit d'un ordinateur embarqué ( Epia M10000 ), dont la rapidité de traitement est relativement faible ( équivalent à un pentium II 400mhz ... ), il faudrait que je conçoive un programme extrèmement éfficace qui puisse recevoir le flux et le traiter éfficacement.
 
Etant donné l'environnement et les images à analyser, il est possible de n'analyser qu'une image sur 5, voir moins.
 
Après avoir traiter l'image, il faudrait stocké les différents coordonnées dans une base de donnée, et les transmettres dans un flux E/S vers un autre programme ...
 
Les images à analyser ont des couleurs très simplifié, et voila ce qu'il ( au point de vue analytique juste, sans le GUI ) faudrait que je fasse ( en plus complexe certe car il faudra aussi reconnaitre si des quilles sont relevé ou couché ):
 
http://www.ueensam.org/em6/pic/photo_img3.jpg
 
D'après vous, est-ce que ce que je cherche à faire est possible?  
 
Je dispose d'environ 6 mois pour le concevoir, sachant que je débute juste en C++ mais que j'ai des antécédants de webmasteur ( PHP & MySQL donc ).
 
EDIT: à propos de la plateforme, il s'agirait certainement d'un UNIX ou d'une Debian


Message édité par quickman le 23-10-2004 à 19:40:17

---------------
Last.fm || Shift Happens || CAN HAS STDIO?
Reply

Marsh Posté le 23-10-2004 à 19:38:09   

Reply

Marsh Posté le 23-10-2004 à 19:39:55    

quickman a écrit :

Voila je dois concevoir un programme pour analyser une image et en tirer des coordonnées de différents objets prédéfinies.
 
Donc le flux d'image proviendrait d'une webcam ( 640x480 ), étant donné qu'il s'agit d'un ordinateur embarqué ( Epia M10000 ), dont la rapidité de traitement est relativement faible ( équivalent à un pentium II 400mhz ... ), il faudrait que je conçoive un programme extrèmement éfficace qui puisse recevoir le flux et le traiter éfficacement.
 
Etant donné l'environnement et les images à analyser, il est possible de n'analyser qu'une image sur 5, voir moins.
 
Après avoir traiter l'image, il faudrait stocké les différents coordonnées dans une base de donnée, et les transmettres dans un flux E/S vers un autre programme ...
 
Les images à analyser ont des couleurs très simplifié, et voila ce qu'il ( au point de vue analytique juste, sans le GUI ) faudrait que je fasse ( en plus complexe certe car il faudra aussi reconnaitre si des quilles sont relevé ou couché ).
 
D'après vous, est-ce que ce que je cherche à faire est possible?  
 
Je dispose d'environ 6 mois pour le concevoir, sachant que je débute juste en C++ mais que j'ai des antécédants de webmasteur ( PHP & MySQL donc ).


Je crois pas que tu va en tirer quelque chose en C++...


Message édité par WhatDe le 23-10-2004 à 19:40:31
Reply

Marsh Posté le 23-10-2004 à 19:48:26    

WhatDe a écrit :

Je crois pas que tu va en tirer quelque chose en C++...


 
il faudrait que je m'oriente vers quel language?
 
EDIT: je croix surtout que sa peut m'aider pour savoir à quoi sa ressemble une boucle, etc... , mais non je n'ai jamais eut la prétention de dire que j'allais en faire quelques choses en C++


Message édité par quickman le 24-10-2004 à 11:10:58

---------------
Last.fm || Shift Happens || CAN HAS STDIO?
Reply

Marsh Posté le 23-10-2004 à 19:50:49    

Aucune idée [:whatde]

Reply

Marsh Posté le 24-10-2004 à 00:40:26    

J'ai pas pigé : ton screenshot là, il est déjà fait le programme non ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-10-2004 à 09:04:02    

quickman a écrit :

Voila je dois concevoir un programme pour analyser une image et en tirer des coordonnées de différents objets prédéfinies.
 
Donc le flux d'image proviendrait d'une webcam ( 640x480 ), étant donné qu'il s'agit d'un ordinateur embarqué ( Epia M10000 ), dont la rapidité de traitement est relativement faible ( équivalent à un pentium II 400mhz ... ), il faudrait que je conçoive un programme extrèmement éfficace qui puisse recevoir le flux et le traiter éfficacement.
 
Etant donné l'environnement et les images à analyser, il est possible de n'analyser qu'une image sur 5, voir moins.
 
Après avoir traiter l'image, il faudrait stocké les différents coordonnées dans une base de donnée, et les transmettres dans un flux E/S vers un autre programme ...
 
Les images à analyser ont des couleurs très simplifié, et voila ce qu'il ( au point de vue analytique juste, sans le GUI ) faudrait que je fasse ( en plus complexe certe car il faudra aussi reconnaitre si des quilles sont relevé ou couché ):
 
http://www.ueensam.org/em6/pic/photo_img3.jpg
 
D'après vous, est-ce que ce que je cherche à faire est possible?  
 
Je dispose d'environ 6 mois pour le concevoir, sachant que je débute juste en C++ mais que j'ai des antécédants de webmasteur ( PHP & MySQL donc ).
 
EDIT: à propos de la plateforme, il s'agirait certainement d'un UNIX ou d'une Debian


 
Laisse moi deviner: c'est une caméra destinée à compter les points dans un bowling, c'est ça ? Je dirais qu'en 6 mois, faire ça en C++ alors que tu n'as aucun background dans ce langage ni en reconnaissance d'images (enfin je suppose), tu te prépares à passer de loooongues semaines au bureau. Une solution qui te faciliterait énormément le travail serait d'utiliser une bibliothèque de traitement d'images toute faite en C/C++ open source ou commerciale (avec le source biezn sûr), ou alors le logiciel Matlab avec les modules de génération de code et de reconnaissance d'image. Si on te répond non, alors c'est probablement qu'ils veulent le beurre, le fromage, le tiroir-caisse et la crémière avec.


Message édité par el muchacho le 24-10-2004 à 09:20:01
Reply

Marsh Posté le 24-10-2004 à 10:36:52    

reconnaissance d'image en 6 mois deja c pas gagner, en plsu si tu galere en debutant le C++ spa la peine.

Reply

Marsh Posté le 24-10-2004 à 10:43:14    

el muchacho a écrit :

Laisse moi deviner: c'est une caméra destinée à compter les points dans un bowling, c'est ça ? Je dirais qu'en 6 mois, faire ça en C++ alors que tu n'as aucun background dans ce langage ni en reconnaissance d'images (enfin je suppose), tu te prépares à passer de loooongues semaines au bureau. Une solution qui te faciliterait énormément le travail serait d'utiliser une bibliothèque de traitement d'images toute faite en C/C++ open source ou commerciale (avec le source biezn sûr), ou alors le logiciel Matlab avec les modules de génération de code et de reconnaissance d'image. Si on te répond non, alors c'est probablement qu'ils veulent le beurre, le fromage, le tiroir-caisse et la crémière avec.


 
Pour les lib, j'y avais penssé mais le peu de recherche que j'avais faite sous google ne m'avait pas trouvé grand chose, donc il va falloir que je recherche un peu plus :)
 
Pour Matlab, je ne connais pas :/
 
Sinon un truc que j'avais penssé faire :sarcastic: :
 
-> On fait des passes horizontal sur l'image et pour chaque pixel on détermine s'il est rouge ou vert ( pour le savoir, on convertis la valeur en RVB et on fait des comparaisons entre R V & B pour savoir si la couleur à une dominante rouge, vert ou bleu ) et on range les résultats dans un tableau avec, dans les colonnes, l'abscisse des pixels, et dans les lignes, l'ordonnée.
 
-> On prend la couleur alliée ( rouge on va dire ), on fait des pass verticales ( dans les colonnes du tableau donc ), dès qu'une case est à 1, on crée un nouvel "amas" qu'on stock dans un nouveau tableau à double entrée, on attribue à la case "min" & "max" la valeur du pixel, puis on passe au pixel suivant, s'il est rouge, on redéfinie "max", sinon ben on passe à un nouveau pix ... et on attribut à "milieu" l'écart entre les 2 valeurs extrêmes divisé par 2 ( ajouté à la valeur "min" )
 
-> On fait des pass horizontales avec le même principe.
 
-> On compare les amas verticaux et horizontaux, dès qu'un "milieu" horizontal a des coordonnées similaires ( à 4 px près ~) avec un "milieu" vertical, on stock ses coordonnées dans un nouveau tableau et on passe au suivant.
 
-> On essaye de faire des liaisons, pour chaque pixels considérer comme centre, on regarde dans son entourage proche ( 8 px ~ ) s'il n'y a pas un autre pixel considéré comme milieu, si oui il trouve un coef directeur qu'il stock avec le pixel, si non, ben c'est pas grave, il passe à un autre pixel, ..., pour chaque pixels, il vérifie s'il n'a pas une liaison déjà établie avec un pixel précédent pour pas en refaire une avec lui, etc ...
 
-> On trouve des chaînes de pixel ayant des liaisons entre eux, on leurs trouve un coef directeur commun en faisait la moyenne de tout leurs coef.
 
-> Donc si le coef est supérieur à une certaine valeur, on considère la quille comme debout.
 
-> Ensuite la distance, si la quille est couché, alors on prend le point le plus bas et avec un peu de triangulation, grâce à l'angle de la caméra avec la table qui est fixe notamment, on trouve la distance, qui doit être légèrement corrigé à cause de l'optique de la caméra, légèrement bombé. Si elle est debout, c'est un peu pareil sauf qu'il ne faut pas oublié les vis qui la tienne debout.
 
-> On stock les coordonnées et l'état dans la BDD, avec le temps T de début de traitement, et envoie sa dans un flux E/S destiné à un autre prog.
 
-> On fait la même chose pour la couleur ennemie.
 
-> On tempo jusqu'à l'arrivée d'une nouvelle image, etc...
 
Cay nulle mais bon, je débute aussi [:uhlan] , le truc qui m'inquiète c'est le nombre de cycle qu'il va falloir pour faire sa [:totoz]
 
et sinon, oui, tu as bien deviné [:vavavoum]


Message édité par quickman le 24-10-2004 à 11:09:07

---------------
Last.fm || Shift Happens || CAN HAS STDIO?
Reply

Marsh Posté le 24-10-2004 à 11:23:56    

6 mois, tout seul, c'est vraiment pas réaliste. Il te faudra probablement 2-3 mois pour apprendre à te débrouiller avec le langage (et bcp plus pour coder correctement en C++), et encore, pour avoir l'expérience nécessaire pour le débogage d'une appli réelle, je ne suis même pas sûr que ce soit suffisant (à moins que tu sois un génie du dev qui s'ignore). Il te restera 3-4 mois pour développer un truc qui marche (donc qui ne fait pas d'erreurs) sur un proc de faible puissance et peu répandu: autant dire mission impossible.
 
Fais des recherches sr la morphologie mathématique
http://web.ccr.jussieu.fr/urfist/i [...] pitre3.htm


Message édité par el muchacho le 24-10-2004 à 11:32:54
Reply

Marsh Posté le 24-10-2004 à 16:57:50    

Citation :

Sinon un truc que j'avais penssé faire  :  
 
-> On fait des passes horizontal sur l'image et pour chaque pixel on détermine s'il est rouge ou vert ( pour le savoir, on convertis la valeur en RVB et on fait des comparaisons entre R V & B pour savoir si la couleur à une dominante rouge, vert ou bleu ) et on range les résultats dans un tableau avec, dans les colonnes, l'abscisse des pixels, et dans les lignes, l'ordonnée.  
 
-> On prend la couleur alliée ( rouge on va dire ), on fait des pass verticales ( dans les colonnes du tableau donc ), dès qu'une case est à 1, on crée un nouvel "amas" qu'on stock dans un nouveau tableau à double entrée, on attribue à la case "min" & "max" la valeur du pixel, puis on passe au pixel suivant, s'il est rouge, on redéfinie "max", sinon ben on passe à un nouveau pix ... et on attribut à "milieu" l'écart entre les 2 valeurs extrêmes divisé par 2 ( ajouté à la valeur "min" )  
 
-> On fait des pass horizontales avec le même principe.  
 
-> On compare les amas verticaux et horizontaux, dès qu'un "milieu" horizontal a des coordonnées similaires ( à 4 px près ~) avec un "milieu" vertical, on stock ses coordonnées dans un nouveau tableau et on passe au suivant.  
 
-> On essaye de faire des liaisons, pour chaque pixels considérer comme centre, on regarde dans son entourage proche ( 8 px ~ ) s'il n'y a pas un autre pixel considéré comme milieu, si oui il trouve un coef directeur qu'il stock avec le pixel, si non, ben c'est pas grave, il passe à un autre pixel, ..., pour chaque pixels, il vérifie s'il n'a pas une liaison déjà établie avec un pixel précédent pour pas en refaire une avec lui, etc ...  
 
-> On trouve des chaînes de pixel ayant des liaisons entre eux, on leurs trouve un coef directeur commun en faisait la moyenne de tout leurs coef.  
 
-> Donc si le coef est supérieur à une certaine valeur, on considère la quille comme debout.


T'essayes de faire un truc à taton, c'est pas top. Y'a plein d'algo de détections de contours à tester. Ca a l'air complexe au premier abord, mais en fait c'est con comme principe. Faut te trouver un soft avec lequel tu peux tester différents algos sur ton images pour voir ce que ça donne dans ton cas et trouver un algo ou une combinaison d'agos qui marche bien pour toi. Le but c'est d'obtenir une image noir & blanc où seuls les contours qui t'intéressent ressortent.
Cherche du côté de la divergence, gradient, dérivée partielle, forme fondamentale, courbure, ...
Tu trouves facilement ces trucs dans les softs de traitement d'image (algos de mise en relief, etc...)
 
Sinon t'as pas répondu : le screenshot que tu montres, il fait comment le logiciel ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-10-2004 à 16:57:50   

Reply

Marsh Posté le 24-10-2004 à 19:28:59    

Ça sent le concours E=M6 ça :D

Reply

Marsh Posté le 24-10-2004 à 19:40:48    

printf a écrit :

Ça sent le concours E=M6 ça :D


Bien joué ! Pour ceux parmi nous qui sont sortis des bancs de l'école il y a longtemps :
 
http://www.vieartificielle.com/nou [...] uvelle=728

Reply

Marsh Posté le 24-10-2004 à 20:26:43    

HelloWorld a écrit :


T'essayes de faire un truc à taton, c'est pas top. Y'a plein d'algo de détections de contours à tester. Ca a l'air complexe au premier abord, mais en fait c'est con comme principe. Faut te trouver un soft avec lequel tu peux tester différents algos sur ton images pour voir ce que ça donne dans ton cas et trouver un algo ou une combinaison d'agos qui marche bien pour toi. Le but c'est d'obtenir une image noir & blanc où seuls les contours qui t'intéressent ressortent.
Cherche du côté de la divergence, gradient, dérivée partielle, forme fondamentale, courbure, ...
Tu trouves facilement ces trucs dans les softs de traitement d'image (algos de mise en relief, etc...)
 
Sinon t'as pas répondu : le screenshot que tu montres, il fait comment le logiciel ?


 
ok je vais voir du coté de Matlab, apparement il y a des fonctions intéréssantes pour les algos ...
 
Le screenshot, je ne sais pas comment il fait :/ rien n'est expliqué sur leurs sites, mais le trucs qui l'on doit faire en plus de savoir où sont les quilles, c'est savoir si elles sont tombé ou pas :/


Message édité par quickman le 24-10-2004 à 20:27:39

---------------
Last.fm || Shift Happens || CAN HAS STDIO?
Reply

Marsh Posté le 24-10-2004 à 21:36:24    

printf a écrit :

Ça sent le concours E=M6 ça :D


 
Jai pensé à un truc comme ça aussi, vu qu'il a pas l'air sorti de l'école, et qu'il parlait d'"ennemi".


Message édité par el muchacho le 24-10-2004 à 21:38:11
Reply

Marsh Posté le 26-10-2004 à 15:18:51    

La caméra est fixe ou mobile ? Si elle est fixe, tu dois commencer par prendre une photo du fond sans les objets (= le masque) et faire une soustraction puis une binarisation avant d'analyser l'image. Après cette 1ère opération, seuls les objets à étudier restent sur l'image à analyser. Le gros problème ensuite est de dénombrer ces objets. Sur l'image qui est montrée en exemple, c'est trivial car les objets sont distincts, mais s'il se touchent ça devient tout de suite plus compliqué. En fonction de leur forme, il faut se demander entre autre s'ils peuvent se chevaucher ou non...

Reply

Marsh Posté le 27-10-2004 à 00:39:13    

Thr128 a écrit :

La caméra est fixe ou mobile ? Si elle est fixe, tu dois commencer par prendre une photo du fond sans les objets (= le masque) et faire une soustraction puis une binarisation avant d'analyser l'image. Après cette 1ère opération, seuls les objets à étudier restent sur l'image à analyser. Le gros problème ensuite est de dénombrer ces objets. Sur l'image qui est montrée en exemple, c'est trivial car les objets sont distincts, mais s'il se touchent ça devient tout de suite plus compliqué. En fonction de leur forme, il faut se demander entre autre s'ils peuvent se chevaucher ou non...


 
ben c'est un mix de tout ce que tu as dis de pire, la caméra est sur le robot, donc mobile, et les quilles sont posées les unes sur les autres en début de match [:aras qui rit]  
 
m'enfin ce n'est pas grâve s'il ne distingue qu'une forme alors qu'il y a 3 objets


---------------
Last.fm || Shift Happens || CAN HAS STDIO?
Reply

Marsh Posté le 30-10-2004 à 23:23:09    

Bon, alors en six mois, tout seul, c'est sur que ca va etre chaud. Surtout si tu n'as aucune idée de ce qui t'attend en pratique.
 
Bon, deja, si tu devais coder toi même les fonctions, ce qui suppose te taper la lecture de bouquins sur le sujet, c'est impossible. Le moindre bouquin suppose des connaissances en Math niveau Bac+2.
 
Donc pour faire simple, je te donne l'URL magique de la librairie Gandalf qui permet de faire des tas de choses rigolotes sur les images. Bon tu te serviras juste de 2, 3 fonctions pour detecter tes contours, mais ca t'avancera un peu.
 
http://gandalf-library.sourceforge.net
 
Bon, sinon, je te conseille aussi de chercher du coté de la segmentation d'image dans une Biblioyhèque Universitaire si tu peux y avoir acces, trouve un bouquin qui donne les algos et les implémentation et c'est parti. Bonne chance, car dans ce domaine, on trouve souvent que des bouquins écrit par des matheux (appliqués ), avec de l'intégrake au kilomètre, sans jamais aucune implémentation.
 
Vala, bon courage ...

Reply

Marsh Posté le 30-10-2004 à 23:31:24    

Oué je reconnais le screen c le sujet d'E=M6 de l'année dernière avec les noix de coco :p
Cette année c pas mal le sujet aussi :)

Reply

Sujets relatifs:

Leave a Replay

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