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 :

Haartraining ou corrélation de phase (FFTW)


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut Haartraining ou corrélation de phase (FFTW)
    Bonjour à vous tous,

    Pour mon stage, je dois concevoir un programme qui détecte, sur des disques, des défauts, dont des bulles ( de taille, de forme [ parfois un peu elliptique ], d'intensité différentes ). Voilà quelques détails supplémentaires:
    Je travaille sur Visual Studio 2008 C++ avec OpenCV 2.4. Mes images sont en .tif.
    Les photos sont en niveau de gris.
    Les photos sont prises par des caméras différentes: donc l'éclairage, l'inclinaison et l'usure différent.

    J'ai déjà procédé à un découpage de l'image pour ne travailler que sur la région d'intérêt, le disque.
    [ Avant tout, je ne vous demande pas des pavés, mais un lien ou une piste de travail peut me suffire dans un premier temps ]

    Arrive maintenant la détection de ces bulles. On pourrait penser à une détection de contour et les compter grâce à findContours et à son deuxième argument ( qui est un vecteur dont on peut savoir la taille ). Cependant, le réglage du seuil des filtres à utiliser ( Sobel, Canny,... ) est associé à une caméra, qui, de plus, peut être changé.

    Solution 1: Le seuil doit donc dépendre des caractéristiques de l'image. Mais comment le choisir?

    Solution 2: utiliser le haartraining. J'ai déjà regardé beaucoup de sites ( j'applaudis celui qui m'en indique un que je ne connais pas ) et c'est alors que je me pose pleins de questions.
    1) Je pense pouvoir recueillir 100 photos cadrées serrées de mes défauts. Pourrais-je obtenir un temps de détection raisonnable ( <5min par photo )?
    2) Pourquoi un fichier XML est-il nécessaire? ( j'ai essayé de regarder ce qu'est le XML, mais je n'en vois pas l'intérêt dans mon cas )
    3) Comment est lu ce fichier XML par la fonction LoadCascadeClassifier?
    4) Avez-vous un site qui présente simplement un moyen pour obtenir un tel fichier? Je suis sur Windows et Visual Studio 2008 C++ ( Là, je suis à genoux devant vous ).

    Solution 3: utiliser la corrélation de phase. Et là, c'est fftw que je ne parviens pas à compiler la librairie sur VS2008: le compilateur cherche des .c dans un dossier codelets, qui n'existe pas.
    A ce propos, j'ai téléchargé ces trois fichiers:
    - fftw-3.2.2-vs2008.zip
    - fftw-3.3.2.tar.gz
    - fftw-3.3.2-dll32.zip
    et j'ai créé un dossier FFTW où j'ai mis tout ça.

    D'une manière générale, je suis perdu: je ne sais pas quelle piste je dois privilégier.

    Merci d'avance,
    N'hésitez pas pour les critiques!

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut
    Tu pourrais nous montrer un exemple de photo de disque ?

    Peut être une piste : HoughCircle.
    Comme tu connais la taille approximatif (min / max) de tes bulles, tu pourras affiner avec plus de précision les paramètres de HoughCircle.

    Sinon l'idée ce sera de traiter un peu ton image avant, appliquer un gradient (Sobel, Canny) ça pourrait quand même être utile pour améliorer HoughCircle (qui ne détectera plus le bruit).

    De la même façon que findContour, HoughCircle te fournira un vecteur, la taille correspond au nombre de bulle (si tes paramêtres sont bons).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    Avant tout, merci pour ta rapidité.

    Voilà un exemple d'image à traiter.

    J'avais déjà pensé à HoughCircles. Cependant, je ne maîtrise pas du tout cette fonction: je ne comprends pas quel est l'influence des variables:
    minRadius – Minimum circle radius.
    maxRadius – Maximum circle radius.

    http://docs.opencv.org/modules/imgpr...int maxRadius)

    En effet, les résultats n'étaient vraiment pas bons: des cercles dont les rayons dépassaient les deux limites étaient tout de même tracés.
    On peut voir dans l'exemple proposé dans la doc:
    "HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 2, gray->rows/4, 200, 100 );" Donc,
    minRadius: 200
    maxRadius: 100 o_O
    Pour moi, mettre ces valeurs-ci ne devrait aboutir à rien, mais cela fonctionne.
    J'ai essayé, pour ExempleDeBulle.png ( le rayon est à peu près de 350 pixels ), d'utiliser HoughCircles avec
    minRadius: 400 ( resp 300 )
    maxRadius: 300 ( resp 400 )
    et aucun cercle n'est détecté.

    Si vous pouvez m'expliquer comment bien utiliser cette fonction, je suis preneur.

    Pour détecter le disque, j'ai fait un seuillage grâce à la moyenne des pixels et j'ai appliqué ensuite un filtre de Canny. Si je mets alors minRadius = 200 et maxRadius = 100, je trouve deux cercles un à 370 et un autre à 120. Certes, je peux garder uniquement le plus grand et j'obtiendrais alors ma région d'intérêt.

    Mais, c'est pour les bulles que cela se corse. Sobel et/ou Canny me permettent bien de détecter, dans un premier temps, la grosse bulle ( qui est plutôt elliptique ), mais se pose alors le problème des seuils. Il me faudrait un moyen pour que ces seuils se ré-ajustent tout seul selon certains critères, car les photos peuvent voir leur intensité changer par exemple. J'avais laissé tomber ces techniques, car il est souvent répété qu'il n'y a pas de méthodes miracles pour trouver le bon seuil.
    Mais, je veux bien croire que non.
    Images attachées Images attachées  

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut
    sinon tu ne pourrais pas avoir une approche colorimétrique en étudiant les zones de couleurs similaire; on voit bien sur ton image que les bulles n'ont pas la même couleur que le fond (en imaginant que le disque est correctement isolé)
    Si tu constate que les bulles ont une couleur plus clair que le disque (quelque soit la luminosité), tu pourrais déterminé la valeur moyenne, la valeur max (clair) et la valeur min (foncé).
    Avec un certain taux d'acceptation, tu ne garde que les pixels ayant une intensité supérieur à taux * valeur max (ex : 0.8 pour 80%); tu obtient une image binaire.
    Tu auras surement du bruit que tu peux éliminer en faisant des ouvertures (érosion puis dilatation).
    Ensuite je pense qu'il sera intéressant pour toi de déterminer si la tache détecté est vraiment une bulle, pour cela tu peux déterminer un nombre minimum de pixel en dessous duquel ce ne peut pas être une bulle car trop petite (c'est du bruit).

    Après je pense quand même qu'un Sobel est la meilleure approche : ton pseudo dégradé qui forme ton fond va disparaitre et tu vas voir apparaitre uniquement les frontières entre tes bulles et le fond.
    Même si le niveau lumineux change, il changera sur l'ensemble de ton image : ça n'affecte pas Sobel.
    Perso, je n'utilise pas le Sobel d'openCV, je préfère le recoder pour agir directement sur mes paramètres. (c'est pas trop compliqué, si t'as besoin du code je peux te l'envoyer par mp).

    Voici un exemple de HoughCircle extrait d'un de mes projets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cv::HoughCircles(imgGS, circles, CV_HOUGH_GRADIENT,
    		2,
    		150,
    		300,
    		80,
    		20, 80);
    avec std::vector<cv::Vec3f> circles;
    et imgGS un cv::Mat (CV_8UC1) de grande taille (5000*3000).
    Je l'utilise pour détecter des mires circulaires dans une photo.


    cv::HoughCircles(imgGS, circles, CV_HOUGH_GRADIENT,
    2,
    150, // prend environ 2 fois ton rayon max
    300, // ajuste s'il faut
    80, // agit sur ce parametre s'il détecte trop de cercle (+ = moins de cercle)
    20, 80); // ajuste les tailles de rayon minimum et maximum

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    L'approche colorimétrique est très intéressante: je vais essayer tout ça dès demain et je te tiens au courant. Par la même occasion, je préfère essayer de coder Sobel avant de te demander ton code: cela ne peut que me faire du bien!
    Merci aussi pour HoughCircles!

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    Voilà ce que j'obtiens avec ton expression de HoughCircles:
    Pour ExempleDeBulle
    HoughCircles( *img, circles, CV_HOUGH_GRADIENT,
    2,
    800,
    150, //MinDistBetweenCenters
    80,
    200, 500);
    Pour ExempleDeBulle2
    HoughCircles( *img, circles, CV_HOUGH_GRADIENT,
    2,
    800,
    80, //MinDistBetweenCenters
    80,
    200, 500);

    Je dois à chaque réajuster à chaque fois. Pour ExempleDeBulle2, on détecte un cercle pour des minDistBetweenCenters inférieurs à 80:
    Est-ce raisonnable ( en terme de temps et d'éthique^^ ) de diminuer MinDistBetweenCenters tant que HoughCircles n'a pas détecté de cercle ( les vraies conditions sont: au moins un cercle détecté et son centre se trouve vers le milieu de l'image [ on ajoute une variable de tolérance ] )?^

    Sinon, pour l'approche colorimétrie, je me suis rappelé de mon prof de traitement d'images qui nous avait dit qu'il ne fallait jamais faire confiance à ses yeux!
    L'intensité est maximale au centre et non dans la bulle. J'ai tout de même codé qqs fonctions:
    int DetectMax( Mat img )
    int DetectMin( Mat img )
    void FindAverageMax( Mat* img, float openness );
    Cette dernière fonction colorie en blanc les pixels supérieurs à DetectMax( img ) * openness.
    Voici deux résultats pour openness = 0,4

    J'ai choisi de conserver la même valeur de openness, car mon application doit être indépendante de l'éclairage.
    Je vais donc continuer Sobel!
    Images attachées Images attachées     

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. corrélation de phase
    Par dudux dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 22/03/2011, 08h49
  2. corrélation de phases( phase only correlation)
    Par annabiste dans le forum Images
    Réponses: 1
    Dernier message: 29/05/2010, 20h23
  3. Corrélation de phase
    Par widwid82 dans le forum OpenCV
    Réponses: 2
    Dernier message: 28/07/2009, 04h00
  4. Fitter une fonction (méthode Corrélation de phase)
    Par Programmeur_Aladdin dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 10/03/2008, 17h46
  5. Augmenter la précision avec la méthode de corrélation de phase
    Par Programmeur_Aladdin dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 28/02/2008, 15h59

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