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 :

Détection du plus grand rectangle dans un polygone


Sujet :

OpenCV

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut Détection du plus grand rectangle dans un polygone
    Salut à tous,

    Sur l'image ci-dessous, j'ai appliqué quelques filtres pour isoler un objet de forme rectangulaire. Cet objet n'est pas "parfaitement" rectangulaire, et je cherche donc à estimer le plus grand rectangle "parfait" (en rouge) qu'il peut contenir.

    Connaissant très peu OpenCV, quelle est le meilleur moyen de traiter ce problème ?


  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 72
    Points : 104
    Points
    104
    Par défaut
    Salut,
    Bein moi personnellement je traiterai ce genre de problème en se basant sur la superficie du rectangle (ou tout polyligne convex avec 4 segment), en gros je récupère tous les rectangles détectés sur l'image et je garde celui ayant la grande superficie, j'utiliserai cvfindcountour pour détecter les contours des rectangle et cvContourArea pour le calcul de la supérifice, d'ailleurs tu peux regarder l'exemple livré avec opencv "Squares.c".

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Salut ehkhalid et merci pour ta réponse.

    Le problème, c'est qu'en utilisant cvFindContours, aucun rectangle n'est détecté. Je me suis basé sur squares.c ...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    N'ayant pas trouvé de solution dans les fonctions d'OpenCV, j'ai procédé ainsi:

    - Parcours de chaque ligne verticale de l'image
    - Calcul de la hauteur moyenne de toutes les lignes
    - Sauvegarde de la position de la première ligne trouvée

    A partir de ces données, je peux obtenir un rectangle qui part de la première ligne, dont la largeur est égale à la somme de toutes les lignes trouvées et dont la hauteur est égale à la moyenne des hauteurs de toutes les lignes...

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    int posX = 0, posY = 0;
    int totalHeight = 0;
    int totalLines = 0;
    int totalTop = 0;
     
    for(int i = 0; i < binImage->width; i++)
    {
    	int lineHeight = 0;
    	int lineTop = 0;
     
    	for(int j = 0; j < binImage->height; j++)
    	{
    		CvScalar pixel = cvGet2D(binImage, j, i);
     
    		if (pixel.val[0] == 255)
    		{
    			if (lineTop == 0) lineTop = j;
    			lineHeight++;
    		}
    	}
     
    	if (lineHeight >= 2 * (binImage->height / 3)) // Hauteur au moins égale aux 2/3 de l'image
    	{
    		if (posX == 0)
    		{
    			posX = i;
    			posY = lineTop;
    		}
     
    		totalTop += lineTop;
    		totalHeight += lineHeight;
    		totalLines++;
    	}
    }
     
    int top = totalTop / totalLines;
    int height = totalHeight / totalLines;
     
    CvPoint pt1 = cvPoint(posX, top);
    CvPoint pt2 = cvPoint(posX + totalLines, top + height);
     
    cvRectangle(image, pt1, pt2, cvScalar(0, 0, 255));
    J'obtiens d'assez bon résultats avec mes filtres basics de preprocessing.

Discussions similaires

  1. Plus grand carré dans un rectangle
    Par patoskull dans le forum Débuter
    Réponses: 1
    Dernier message: 23/09/2013, 10h38
  2. [WD14] recuperer le plus grand nombre dans une table
    Par devalender dans le forum WinDev
    Réponses: 6
    Dernier message: 03/11/2010, 20h16
  3. cherche la plus grande valeur dans une matrice
    Par thtghgh dans le forum MATLAB
    Réponses: 9
    Dernier message: 28/12/2009, 19h35
  4. plus grand élément dans un tableau
    Par shaku dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 09/04/2009, 20h28
  5. Réponses: 6
    Dernier message: 09/10/2007, 12h19

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