IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Detection des couleurs et suppression de l'arrière plan


Sujet :

OpenCV

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Detection des couleurs et suppression de l'arrière plan
    Bonjour à tous

    1)
    Je suis en train de développer une application qui détecte des véhicules et j'aurais besoins d'aide pour la détection des couleurs.
    Pour la détection j'utilise d'abord la méthode Viola et Jones, puis on voit le véhicule détecte, il faut que je détermine sa couleur.
    J'ai sept véhicule à détecter et a chaque détection, je voudrais pouvoir comparer mon véhicule au sept couleur et ainsi avoir sa teinte.
    Voila ce que j'arrive a faire pour l'instant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      detecteur.detectMultiScale( frame_gray, detect, 1.1,2,0,Size(80,80),Size(800,800)); // On detecte les véhicules.
        for(  unsigned int i = 0; i < detect.size(); i++ )
        {
            rectangle(frame, detect[i], Scalar(0,50,0), 2); // On affiche les rectangles
     
            //Systeme de détection des couleur
     
                couleur=frame.clone();
                couleur = couleur(Rect(detect[i].x, detect[i].y, detect[i].width, detect[i].height)); // on étudie que la zone détecté
                cv::cvtColor(couleur, couleur, CV_BGR2HSV); // On met l'image en HSV
                inRange(couleur, Scalar(teinte-tolerance,saturation-tolerance,0), Scalar(teinte+tolerance,saturation+tolerance,255), couleur); // On recherche la couleur
                dilate( couleur, couleur, getStructuringElement(MORPH_RECT, Size(3, 3)) );  // On lisse les pixels
     
                imshow ("couleur",couleur);
                imshow("frame",frame);
         }
    Ce que je n'arrive pas a faire c'est à analyser l'image binaire pour dire si la couleur est présente ou pas

    2)
    Je me demandais si c'était interresant de séparer mon arrière-plan afin d'avoir juste les véhicules présents a l'écran.
    Est-ce que cela accélérerais mon traitement? Sachant que je travaille a partir d'une caméra fixe.


    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    La suppression de l'arrière plan est primordiale vu que tu te bases sur la couleur (une couleur similaire à celle que tu recherche dans le background et tout est foutu..), donc si tu veux interpréter ton image binaire, t'es obligé de définir 07 Inranges pour chaque frame et le Inrange qui renvoie le plus de blanc ça correspondra à ta couleur recherchée (Inconv :toélrance pour chaque couleur à définir manuellement et en dur..)

    Si non,tu peux faire autrement, genre : une fois que tu détectes par Viola Jones ta voiture, tu calcules un histogramme de couleur sur ton image ! L'histogramme est plus simple à interpréter.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse.

    En fait pour la suppression d’arrière plan, je parlais de la faire avant ma détection Viola et Jones, je voulais savoir si cela optimiserait mon traitement.
    Car je ne pense pas avoir de problème avec des éléments du décor, puisque je fait ma détection des couleurs qu'avec l’élément que je détecte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    couleur = couleur(Rect(detect[i].x, detect[i].y, detect[i].width, detect[i].height));
    Mon problème est de récupérer la valeur que renvoi le inrange.

  4. #4
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    Oui c'est vrai j'avais oublié que tes process se font sur les rectangles de detect.multiscale :/.
    Si t’arrive a supprimer l'arrière plan avant le Viola Jones bein c'est comme si tu faisais le travail du détecteur quoi , bref..
    Donc les valeurs de tes tolérances pour chaque couleur sont définies et discrétisées au préalable ou pas ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je vais définir les valeurs de chaque couleur et leur tolérance, puis je vais faire une boucle qui testera toute les couleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i;i<nombre_couleurs;i++)
    {
           switch(i)
     
            Case1: //vert
     
            Case2: //bleu
     
    etc
    Mais je ne sais pas comment faire pour savoir si ma détection contient une couleur.

  6. #6
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    Tu peux calculer à chaque Inrange le nombre de pixel blanc renvoyé dans le masque, le max correspond à ta couleur recherchée .

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Justement, c'est ce que je n'arrive pas à faire depuis le début.
    Est-ce qu'il serait possible d'avoir un exemple de code.

  8. #8
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    La fonction est simple, j'ai pensé à un truck du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    int calcul_score(Mat &img,Scalar A, Scalar B)
    	{
    		Mat dst;
    		int w = img.rows;
    		int h = img.cols;
    		inRang(img,A,B,dst);
     
                   /*
     
    		Ici tu peux améliorer ton process avec des opérations morphologiques !! 
    		*/
    		// Calcul nombre de pixel blanc:
    		int pixelBlanc = 0 ;
    		for(int i = 0; i<w; ++i)
    			{
    				for(j = 0: j<h; ++j)
    					{
    						if(int(dst.at<uchar>(i,j)) == 255) pixelBlanc++;
    				}
    		}
     
    		return pixelBlanc; 
    }
    Elle renvoie le score pour une seule couleur, pour l'élargir pour plusieurs couleurs, faut définir une relation entre tes paramètres (Scalar A, Scalar B) pour pouvoir intégrer tout dans une boucle finale, ça peur s'écrire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     for (int i = 0 ;i <colorNumber; ++i)
    	{
    		vector<int> scoreFinal;
    		scoreFinal.push_back(calcul(img,A+( cte*i), B-(cte*i),dst); // Essaie de trouver une relation linéaire entre les seuils de tes couleurs !
    		// t'as un vecteur qui contient toute les valeurs renvoyés par tes couleurs :) ! 
    }

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Un grand merci, pour ton exemple, cela m'a permit d'avancer.
    Par contre, il y a quelque chose que je ne comprend pas.
    Par exemple mon objet se trouve sur une zone de 216*162 pixels.
    Ce qui fait 34992 pixel, et mon programme me dit qu'il y a 2080 pixel correspondant a ma couleur.
    Puis j'ai mis 0 en valeur, et il m'a donné 25648.
    Ce qui fait que j'ai 7264 pixels qui ne sont ni des pixels blancs, ni des pixels noirs. Alors que mon image est en noir et blanc.

Discussions similaires

  1. [Images] Suppression d'un arrière-plan
    Par ephelya dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 30/12/2010, 13h16
  2. Problème couleur d'arrière plan des frames sous Firefox
    Par darkazuria dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/05/2008, 11h54
  3. Réponses: 1
    Dernier message: 11/01/2008, 10h27
  4. [TABLE] Couleurs d'arrière-plan des TR alternées
    Par arkienou dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/02/2007, 15h48
  5. Modifier la couleur d'arrière plan des dossiers
    Par FRED.G dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 26/04/2006, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo