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

dulbi 5 Messages postés mardi 5 février 2008Date d'inscription 4 juillet 2009 Dernière intervention - 23 juin 2009 à 11:13 - Dernière réponse : cs_moulzo 3 Messages postés mardi 26 décembre 2000Date d'inscription 3 décembre 2014 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Pistol_Pete 1055 Messages postés samedi 2 octobre 2004Date d'inscription 9 juillet 2013 Dernière intervention - 24 juin 2009 à 11:25
3
Merci
Regarde dans la doc de OpenCv ici
Dans la section :
http://ImAnalyse.free.fr

Merci Pistol_Pete 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Pistol_Pete
Meilleure réponse
dulbi 5 Messages postés mardi 5 février 2008Date d'inscription 4 juillet 2009 Dernière intervention - 25 juin 2009 à 02:16
3
Merci
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 !

Merci dulbi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de dulbi
Meilleure réponse
dulbi 5 Messages postés mardi 5 février 2008Date d'inscription 4 juillet 2009 Dernière intervention - 3 juil. 2009 à 12:54
3
Merci
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 !

Merci dulbi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de dulbi
Pistol_Pete 1055 Messages postés samedi 2 octobre 2004Date d'inscription 9 juillet 2013 Dernière intervention - 23 juin 2009 à 12:46
0
Merci
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
Commenter la réponse de Pistol_Pete
dulbi 5 Messages postés mardi 5 février 2008Date d'inscription 4 juillet 2009 Dernière intervention - 24 juin 2009 à 10:24
0
Merci
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 ? )
Commenter la réponse de dulbi
Pistol_Pete 1055 Messages postés samedi 2 octobre 2004Date d'inscription 9 juillet 2013 Dernière intervention - 25 juin 2009 à 08:33
0
Merci
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
Commenter la réponse de Pistol_Pete
katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 26 juin 2009 à 16:37
0
Merci
Salut je crois que l'utilisation de la macro CV_IMAGE_ELEM ext plus brève. A mesurer.
Commenter la réponse de katsankat
katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 3 juil. 2009 à 21:13
0
Merci
tu vas arreter d'accepter tes propres réponses données par les autres?
Commenter la réponse de katsankat
dulbi 5 Messages postés mardi 5 février 2008Date d'inscription 4 juillet 2009 Dernière intervention - 4 juil. 2009 à 14:03
0
Merci
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 ! )
Commenter la réponse de dulbi
cs_moulzo 3 Messages postés mardi 26 décembre 2000Date d'inscription 3 décembre 2014 Dernière intervention - 30 déc. 2009 à 20:43
0
Merci
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
Commenter la réponse de cs_moulzo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.