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

SL & STL C++ Discussion :

Erreur "vector subscript out of range" - OpenCV


Sujet :

SL & STL C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Erreur "vector subscript out of range" - OpenCV
    Bonjour,

    J'ai crée un programme permettant de détecter un feutre fluo avec la webcam et je suis confronté à un problème. Une partie du programme permet de détecter les contours de mon image correspondant à une couleur voulue, et, afin de supprimer les petits contours qui ne sont pas parti avec la fonction cvErode, je fais une boucle permettant de sauvegarder dans un vecteur de contour (un vector de vector de points) le contour ayant la plus grande aire (qui doit correspondre à celle de mon stylo). Toute cette partie se trouve donc dans une boucle while(true) permettant de faire la détection en temps réel de contour.

    Lorsque j'exécute mon programme en pas à pas, j'arrive à trouver le bon contour sur au moins 3 itérations de la boucle while. Cependant lorsque je décide de lancer le programme normalement ("Démarrer le débogage"), un message d'erreur s'affiche m'indiquant "vector subscript out of range". D'après ce que j'ai lu ça apparaîtrait lorsqu'on essaie de lire une certaine valeur contenue dans vector mais qui n'existe pas. Je n'arrive pas à voir d'où peut venir ce problème.

    J'espère que vous pourrez m'aider à résoudre mon problème.

    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
    Mat masqueMat(masque);
    Mat frameBGRMat(frameBGR);
    vector<vector<Point>> contours;
    vector<vector<Point>> contourMax(1);
    cv::findContours(masqueMat, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point());
     
    if(contours.size()!=1)
    {
    	contourMax[0]=contours[0];
    	for(int i=1;i<contours.size();i++)
    	{
    		if(abs(contourArea(contours[i]))>abs(contourArea(contourMax[0])))
    		{
    			contourMax[0]=contours[i];
    		}
    		else
    		{
    		}
    	}
    }
    else
    {
    	contourMax[0]=contours[0];
    }
    cv::drawContours(frameBGRMat, contourMax, -1, cvScalar(255,0,0));
    cvShowImage("Original en BGR", frameBGR);
    Merci !

    Baptiste

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Avant d'exécuter la ligne 9, tu ne fais pas de vérification de taille.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    contours.size()!=1 que se passe-t-il si contours a une taille nulle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=1;i<contours.size();i++)
    	{
    		if(abs(contourArea(contours[i]))>abs(contourArea(contourMax[0])))
    Les index d'un tableau, et vector est un tableau, vont de 0 à size-1 inclus.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci !

    J'ai rajouté une vérification de la taille de contours. J'ai aussi modifié ma déclaration de contourMax pour le déclarer en disant que ce sera une vecteur de taille 1.

    Voici le code fonctionnel :
    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
     
    Mat masqueMat(masque);
    Mat frameBGRMat(frameBGR);
    vector<vector<Point>> contours;
    vector<vector<Point>> contourMax(1);
    cv::findContours(masqueMat, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point());
     
    if(contours.size()!=0)
    {
    	contourMax[0]=contours[0];
    	for(int i=1;i<contours.size();i++)
    	{
    		if(contourArea(contours[i])>contourArea(contourMax[0]))
    		{contourMax[0]=contours[i];}	
    	}
    	cv::drawContours(frameBGRMat, contourMax, -1, cvScalar(255,0,0));
     
    	cvShowImage("Original en BGR", frameBGR);
    	//cvShowImage("Masque binaire", masque);
    	cout << "La plus grande aire est de : " << contourMax[0].size() << endl;
    }
    Merci encore !

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

Discussions similaires

  1. Erreur subscript out of range dans un tableau
    Par lola06 dans le forum AIX
    Réponses: 1
    Dernier message: 04/09/2013, 11h43
  2. vector subscript out of range: qu'est-ce ?
    Par sa.mh dans le forum C++
    Réponses: 15
    Dernier message: 22/05/2008, 16h47
  3. Réponses: 1
    Dernier message: 23/04/2008, 10h37
  4. vector subscript out of range
    Par nightwar dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/03/2008, 18h35
  5. error9 subscript out of range
    Par tomy7 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/03/2008, 12h25

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