Open CV detection de couleur sur un flux vidéo

Résolu
dulbi Messages postés 5 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 4 juillet 2009 - 23 juin 2009 à 11:13
cs_moulzo Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 3 décembre 2014 - 30 déc. 2009 à 20:43
Bonjour,

Je cherche a détecter tous les pixels d'une certaine couleur sur le flux de ma webcam.

Je parcours donc tous les pixels de mon IplImage en utilisant cvGet2D(img, y, x);
Cependant apres un nombre important de pixels, mon programme fait une erreur de segmentation !

L'erreur intervient aux environs 520 000 ème pixel visité ( donc pas du tout sur la première image )

J'ai débugué mon code pas à pas et l'erreur intervient à l'appel de cvGet2D( ).

Quelqu'un aurait'il une idée de ce qui se passe ?
Faut il libérer la variable qui récupère le cvScalar ? J'ai aucune idée de comment je pourrais faire ca !
A voir également:

10 réponses

Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
24 juin 2009 à 11:25
Regarde dans la doc de OpenCv ici
Dans la section :
http://ImAnalyse.free.fr
3
dulbi Messages postés 5 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 4 juillet 2009
25 juin 2009 à 02:16
Après de nombreuses lectures, je suis a peu près sur pour dire que la fonction cvGet2D() n'a pas été pensé pour faire ce genre de choses ! ( elle n'a pas du etre écrite pour etre appeler 200 000 fois à la suite )

Effectivement, il existe d'autres manières de procéder pour "suivre une couleur" avec opencv. Une manière semble de travailler avec l'histogramme de la couleur que l'on souhaite suivre.

Il y a un exemple un peu difficile a comprendre dans le répertoire "opencv/samples/c/camshifdemo.exe" qui traite exactement ce genre de problème pour ceux que ca interesse !
3
dulbi Messages postés 5 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 4 juillet 2009
3 juil. 2009 à 12:54
Après de longues heures de recherche pour avoir le fin mot de l'histoire sur ce cvGet2D() ( de malheur ) j'ai commencé a trouvé des gens qui ont eu exactement le même problème que moi !

une erreur 0xc0000005 qui semble être un problème d'overflow

Hors, il semblerait que ce genre d'erreur n'affecte pas visual, alors qu'elle affecte Codeblocks ! (sympa la surprise !)
Du coup, sois il faut dire adieux a CodeBlocks, sois il faut trouver une autre solution !

Apparement, il est possible de réaliser la même chose (par un accès direct ) :


(((uchar*)(img->imageData+img->widthStep*i))[j]); // qui donne la valeur du pixel i,j de l'image img !

Je peux pas affirmer que ces infos sont vrai a 100% cependant je suis presque sur qu'un jour un lecteur va bénir ce message !
3
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 juin 2009 à 12:46
Salut
Regarde ta consommation mémoire avec le gestionnaire des taches, tu dois peut être libérer la mémoire de certaine structures.
Je pense cependant, qu'il y a bien plus rapide que la fonction cvGet2D(). Tu peux récupérer en une fonction tous les bits de ton image.
A+
____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dulbi Messages postés 5 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 4 juillet 2009
24 juin 2009 à 10:24
Le programme "ne grossit pas en mémoire" ce n'est pas d'où vient le problème.
Je suis intéressé de savoir comment on peux récupérer tous les bits d'une image ( de quel fonction parles tu ? )
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
25 juin 2009 à 08:33
Je pense que pour ton cas, il devait y avoir une autre erreur parce que la fonction cvGet2D() doit être écrite correctement, vu que c'est quand même une fonction importante. Et il met arrivé de lire une image entière avec ce genre de fonction. Si ton image faire 1000px par 1000px, cela fait 1 000 000 appelles à cette fonction. C'est très lent mais ça marche sans problème.

Pour suivre une couleur, essaie l'espace de représentation des couleurs HSL. Il est bien plus proche de la perseption humaine que le RGB.
A+
____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
26 juin 2009 à 16:37
Salut je crois que l'utilisation de la macro CV_IMAGE_ELEM ext plus brève. A mesurer.
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
3 juil. 2009 à 21:13
tu vas arreter d'accepter tes propres réponses données par les autres?
0
dulbi Messages postés 5 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 4 juillet 2009
4 juil. 2009 à 14:03
to katsankat :
Il existe de nombreux sujet de forum ou il n'y a que la question et ou aucune réponse n'est jamais donné ! Du coup, je préfère me répondre a moi même pour aider la prochaine personne qui viendra s'aventurer ici !
Etant donné que c'est ma question, ca semble assez logique que ma réponse, après un certain temps de recherche sois acceptable, non ?

De plus, je n'ai pas accepté que mes réponses, mais les réponses qui font évoluer la question !

Etant donnée que ta réponse ( plus haut ) ne ma pas du tout aidé, ni meme paru interessante (je me trompe peut etre, mais encore une fois c'est MA question) je ne l'ai pas accepté.

Si tu souhaite absolument que j'accepte ta réponse , fait moi signe! :) Pour etre honête, je n'ai pas vraiment compris ta réponse!(c'est certainement ma faute) Mais j'ai la réponse a ma question !

( ton dernier commentaire n'a aucun interet, si j'étais toi je m'en tiendrais la ! )
0
cs_moulzo Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 3 décembre 2014
30 déc. 2009 à 20:43
tulbi tes predictions sont vrai car aujourd'hui je viens bénir ta solution.
j'ai buté pendant 2 semaines sur une erreur de segmentation à cause de Cvget2d()et ton (((uchar*)(img->imageData+img->widthStep*i))[j]) vient de me sauver la vie.
merci
0
Rejoignez-nous