Open CV detection de couleur sur un flux vidéo [Résolu]

Signaler
Messages postés
5
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
4 juillet 2009
-
Messages postés
3
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
3 décembre 2014
-
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 !

10 réponses

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Regarde dans la doc de OpenCv ici
Dans la section :
http://ImAnalyse.free.fr
Messages postés
5
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
4 juillet 2009

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 !
Messages postés
5
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
4 juillet 2009

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 !
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
5
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
4 juillet 2009

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 ? )
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut je crois que l'utilisation de la macro CV_IMAGE_ELEM ext plus brève. A mesurer.
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
tu vas arreter d'accepter tes propres réponses données par les autres?
Messages postés
5
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
4 juillet 2009

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 ! )
Messages postés
3
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
3 décembre 2014

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