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 :

Chaîne complète d'entraînement


Sujet :

OpenCV

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut Chaîne complète d'entraînement
    Bonjour,

    J'aurais besoin de votre aide pour me servir d'opencv.

    J'ai fais mes répertoires d'images négatives et positives.
    Ensuite, j'applique ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    createtrainsamples.pl <positives.dat> <negatives.dat> <vec_output_dir>
    J'obtiens un répertoire contenant des fichiers vec.

    Puis, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createtestsamples.pl <positives.dat> <negatives.dat> <output_dir>
    Je suppose ici que mon output_dir est le meme que mon vec_output_dir? ou pas forcement?

    J'obtiens un répertoire contenant des répertoires au nom de mes images contenant des images ayant des coordonnées en nom (si j'ai bien compris)

    Enfin, je lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    opencv_haartraining -data haarcascade -vec training2/ -bg negatives.dat
    Et j'obtiens une erreur.
    Je ne sais pas quoi mettre dans le -data, ni dans le -vec...

    voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Parent node: NULL
     
    *** 1 cluster ***
    OpenCV Error: Assertion failed (elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1) in icvGetHaarTrainingDataFromVec, file opencv/apps/haartraining/cvhaartraining.cpp, line 1929
    terminate called after throwing an instance of 'cv::Exception'
      what():  opencv/apps/haartraining/cvhaartraining.cpp:1929: error: (-215) elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1 in function icvGetHaarTrainingDataFromVec
    Help^^

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    En changeant ma ligne de commande en ceci :

    opencv_haartraining -data opencv/data/haarcascades/ -vec training/outputImg0.jpg.vec -bg negatives.dat nonsym -mem 512 -mode ALL -npos 18 -nneg 5 -nstages 20 nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5
    J'obtiens l'erreur :

    *** 1 cluster ***
    OpenCV Error: Unspecified error (Vec file sample size mismatch) in icvGetHaarTrainingDataFromVec, file opencv/apps/haartraining/cvhaartraining.cpp, line 1936

    PS : je fais de la detection de voiture.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Salut,

    Pour ta ligne en perl vec est un dossier, pour la ligne de commande de OpenCV c'est un fichier.
    Essais d'utiliser opencv_createsamples puis opencv_haartraining, fournis par OpenCV.
    ou si t'as vraiment besoin de ton script perl y'a ce tutorial qui à l'air bien.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Pour opencv_createsamples, je dois le lancer autant de fois que j'ai d'image positive?

    que dois je mettre dans -vec?

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Non tu ne le lances qu'une seule fois, les paramètres permettent de travailler sur une seule image ou sur un ensemble de nombreuses images.
    En paramètre à -vec tu saisis un nom de fichier, opencv_createsamples va écrire dedans et opencv_traincascade (ou opencv_haartraining) va utiliser ce fichier précédemment initialisé, donc dans les 2 fonctions tu passes la même chose en paramètre.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Merci de ton aide mais j'ai pas tout saisi^^

    ok pour le vec

    quels sont les autres parametres?
    info?
    img?
    bg?

    Merci beaucoup

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Voici ma ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    opencv_createsamples -info positives.dat  -vec samples.vec -bg negatives.dat -h 20 -w 20
    Le résultat :
    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
    Info file name: positives.dat
    Img file name: (NULL)
    Vec file name: samples.vec
    BG  file name: (NULL)
    Num: 1000
    BG color: 0
    BG threshold: 80
    Invert: FALSE
    Max intensity deviation: 40
    Max x angle: 1.1
    Max y angle: 1.1
    Max z angle: 0.5
    Show samples: FALSE
    Width: 24
    Height: 24
    Create training samples from images collection...
    positives.dat(1) : parse errorDone. Created 0 samples


    une idée?

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Tu as mis quoi dans positives.dat et dans negatives.dat ?
    A priori il ne trouve pas ton fichier negatives.dat...

    -> Si c'est le cas merci de faire semblant d'avoir eu une erreur beaucoup plus compliquée.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    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
     opencv_createsamples -info positives.txt  -vec samples.vec -bg negatives.dat
    Info file name: positives.txt
    Img file name: (NULL)
    Vec file name: samples.vec
    BG  file name: negatives.dat
    Num: 1000
    BG color: 0
    BG threshold: 80
    Invert: FALSE
    Max intensity deviation: 40
    Max x angle: 1.1
    Max y angle: 1.1
    Max z angle: 0.5
    Show samples: FALSE
    Width: 24
    Height: 24
    Create training samples from images collection...
    positives.txt(1) : parse errorDone. Created 0 samples
    Il le trouve finalement...
    Voila mon fichier
    more negatives.dat
    NEGATIVE/outputImg3.jpg
    NEGATIVE/outputImg1.jpg
    NEGATIVE/outputImg0.jpg
    NEGATIVE/outputImg2.jpg
    NEGATIVE/outputImg4.jpg

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Jérôme.L
    Tu as mis quoi dans positives.dat et dans negatives.dat ?
    Je voulais voir negatives.dat puisqu'il était manquant dans la sortie.
    Je voulais voir positives.txt parceque je crois confusément que le programme essaie de communiquer lorsqu'il écrit :
    positives.dat(1) : parse errorDone.

    Note : Les erreurs sont presque explicitement écrites dans les textes que tu postes, ce serait bien que tu cherches un peu plus avant de poster.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Voila mon fichier.

    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
     more positives.txt
    POSITIVE/outputImg0.jpg
    POSITIVE/outputImg1.jpg
    POSITIVE/outputImg2.jpg
    POSITIVE/outputImg3.jpg
    POSITIVE/outputImg4.jpg
    POSITIVE/outputImg5.jpg
    POSITIVE/outputImg6.jpg
    POSITIVE/outputImg7.jpg
    POSITIVE/outputImg8.jpg
    POSITIVE/outputImg9.jpg
    POSITIVE/outputImg10.jpg
    POSITIVE/outputImg11.jpg
    POSITIVE/outputImg12.jpg
    POSITIVE/outputImg13.jpg
    POSITIVE/outputImg14.jpg
    POSITIVE/outputImg15.jpg
    POSITIVE/outputImg16.jpg
    POSITIVE/outputImg17.jpg
    Merci de ton aide

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    La syntaxe serait pour chaque image :
    monimage1.jpg int a, int x1, y1, x2, y2
    Le a j'ai oublié ce que c'est dans le doute essai 1.
    x1, y1, x2, y2 définissent un rectangle dans lequel l'objet que tu recherches est définis.
    Les coordonnées sont en pixel, le coin supérieur gauche de ton image est (1, 1)

    donc par exemple écrit img1.jpg 1 0 0 20 20
    Tu peux définir plusieurs zone en écrivant : img1.jpg 1 0 0 20 20 30 20 50 40

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Voila mon nouveau fichier positives.dat
    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
     more positives.dat
    POSITIVE/outputImg0.jpg 1 0 0 26 29
    POSITIVE/outputImg1.jpg 1 0 0 20 20
    POSITIVE/outputImg2.jpg 1 0 0 30 30
    POSITIVE/outputImg3.jpg 1 0 0 50 50
    POSITIVE/outputImg4.jpg 1 0 0 40 35
    POSITIVE/outputImg5.jpg 1 0 0 46 46
    POSITIVE/outputImg6.jpg 1 0 0 34 34
    POSITIVE/outputImg7.jpg 1 0 0 46 32
    POSITIVE/outputImg8.jpg 1 0 0 22 21
    POSITIVE/outputImg9.jpg 1 0 0 50 37
    POSITIVE/outputImg10.jpg 1 0 0 34 35
    POSITIVE/outputImg11.jpg 1 0 0 17 17
    POSITIVE/outputImg12.jpg 1 0 0 36 37
    POSITIVE/outputImg13.jpg 1 0 0 18 18
    POSITIVE/outputImg14.jpg 1 0 0 24 23
    POSITIVE/outputImg15.jpg 1 0 0 24 24
    POSITIVE/outputImg16.jpg 1 0 0 24 24
    POSITIVE/outputImg17.jpg 1 0 0 35 32
    POSITIVE/outputImg18.jpg 1 0 0 55 55
    POSITIVE/outputImg19.jpg 1 0 0 35 35
    POSITIVE/outputImg20.jpg 1 0 0 21 22
    POSITIVE/outputImg21.jpg 1 0 0 59 59
    Le 1 correspond au nombre d'objet recherché dans l'image.
    Toutes les miennes commencent a 0 puisque je les avais extraites.

    Ensuite, je relance le createsamples

    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
    opencv_createsamples -info positives.dat -bg negatives.dat -vec samples.vec -w 24 -h 24
    Info file name: positives.dat
    Img file name: (NULL)
    Vec file name: samples.vec
    BG  file name: negatives.dat
    Num: 1000
    BG color: 0
    BG threshold: 80
    Invert: FALSE
    Max intensity deviation: 40
    Max x angle: 1.1
    Max y angle: 1.1
    Max z angle: 0.5
    Show samples: FALSE
    Width: 24
    Height: 24
    Create training samples from images collection...
    positives.dat(23) : parse errorDone. Created 22 samples
    J'ai toujours cette erreur. Il semble trouvé 23 lignes ou images...
    Il n'y a que 22 images et donc 22 lignes. Une idée?

    De plus, j'ai renseigné le w et h sans trop savoir quoi mettre...
    A priori, c'est la taille des samples en sortie, donc je peux mettre 20;20?

    Merci

    EDIT : le -num est indispensable... avec le nombre de fichier positif

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Le createsample s'execute enfin
    Create training samples from images collection...
    Done. Created 22 samples
    Et le haartraining aussi
    Cascade performance
    POS: 22 22 1.000000
    NEG: 21 5.88881e-07
    BACKGROUND PROCESSING TIME: 221.00
    Il m'a crée 13 répertoire contenant chacun un fichier txt.

    Je suppose que c'est normal? et je n'ai a priori pas le fichier xml...

    Si je veux maintenant faire de la detection de mes objets sur une video, y a t'il un code existant? comment faire?

    Merci beaucoup

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    J'utilisais le traincascade personnellement, c'est pas très différent donc je pense quand même qu'il te manque des paramètres.
    Voici ma ligne fais en ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    opencv_traincascade -data classifier -vec vecteur.txt -bg bg.txt -numPos 143 -numNeg 143 -numStages 20 -w 24 -h 24 -minHitRate 0.999 -maxFalseAlarm 0.5 -mode ALL

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Merci, grâce à toi, j'ai pu obtenir un fichier xml.

    J'ai ensuite récupéré ce code :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    // OpenCV Sample Application: facedetect.c
     
    // Include header files
    #include "cv.h"
    #include "highgui.h"
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
    #include <float.h>
    #include <limits.h>
    #include <time.h>
    #include <ctype.h>
     
    // Create memory for calculations
    static CvMemStorage* storage = 0;
     
    // Create a new Haar classifier
    static CvHaarClassifierCascade* cascade = 0;
     
    // Function prototype for detecting and drawing an object from an image
    void detect_and_draw( IplImage* image );
     
    // Create a string that contains the cascade name
    const char* cascade_name =
        "haarcascade_frontalface_alt.xml";
    /*    "haarcascade_profileface.xml";*/
     
    // Main function, defines the entry point for the program.
    int main( int argc, char** argv )
    {
     
        // Structure for getting video from camera or avi
        CvCapture* capture = 0;
     
        // Images to capture the frame from video or camera or from file
        IplImage *frame, *frame_copy = 0;
     
        // Used for calculations
        int optlen = strlen("--cascade=");
     
        // Input file name for avi or image file.
        const char* input_name;
     
        // Check for the correct usage of the command line
        if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 )
        {
            cascade_name = argv[1] + optlen;
            input_name = argc > 2 ? argv[2] : 0;
        }
        else
        {
            fprintf( stderr,
            "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
            return -1;
            /*input_name = argc > 1 ? argv[1] : 0;*/
        }
     
        printf ("%s\n", cascade_name);
        // Load the HaarClassifierCascade
        cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
     
        // Check whether the cascade has loaded successfully. Else report and error and quit
        if( !cascade )
        {
            fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
            return -1;
        }
     
        // Allocate the memory storage
        storage = cvCreateMemStorage(0);
     
        // Find whether to detect the object from file or from camera.
        if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
            capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );
        else
            capture = cvCaptureFromAVI( input_name ); 
     
        // Create a new named window with title: result
        cvNamedWindow( "result", 1 );
     
        // Find if the capture is loaded successfully or not.
     
        // If loaded succesfully, then:
        if( capture )
        {
            // Capture from the camera.
            for(;;)
            {
                // Capture the frame and load it in IplImage
                if( !cvGrabFrame( capture ))
                    break;
                frame = cvRetrieveFrame( capture );
     
                // If the frame does not exist, quit the loop
                if( !frame )
                    break;
     
                // Allocate framecopy as the same size of the frame
                if( !frame_copy )
                    frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
                                                IPL_DEPTH_8U, frame->nChannels );
     
                // Check the origin of image. If top left, copy the image frame to frame_copy. 
                if( frame->origin == IPL_ORIGIN_TL )
                    cvCopy( frame, frame_copy, 0 );
                // Else flip and copy the image
                else
                    cvFlip( frame, frame_copy, 0 );
     
                // Call the function to detect and draw the face
                detect_and_draw( frame_copy );
     
                // Wait for a while before proceeding to the next frame
                if( cvWaitKey( 10 ) >= 0 )
                    break;
            }
     
            // Release the images, and capture memory
            cvReleaseImage( &frame_copy );
            cvReleaseCapture( &capture );
        }
     
        // If the capture is not loaded succesfully, then:
        else
        {
            // Assume the image to be lena.jpg, or the input_name specified
            const char* filename = input_name ? input_name : (char*)"lena.jpg";
     
            // Load the image from that filename
            IplImage* image = cvLoadImage( filename, 1 );
     
            // If Image is loaded succesfully, then:
            if( image )
            {
                // Detect and draw the face
                detect_and_draw( image );
     
                // Wait for user input
                cvWaitKey(0);
     
                // Release the image memory
                cvReleaseImage( &image );
            }
            else
            {
                /* assume it is a text file containing the
                   list of the image filenames to be processed - one per line */
                FILE* f = fopen( filename, "rt" );
                if( f )
                {
                    char buf[1000+1];
     
                    // Get the line from the file
                    while( fgets( buf, 1000, f ) )
                    {
     
                        // Remove the spaces if any, and clean up the name
                        int len = (int)strlen(buf);
                        while( len > 0 && isspace(buf[len-1]) )
                            len--;
                        buf[len] = '\0';
     
                        // Load the image from the filename present in the buffer
                        image = cvLoadImage( buf, 1 );
     
                        // If the image was loaded succesfully, then:
                        if( image )
                        {
                            // Detect and draw the face from the image
                            detect_and_draw( image );
     
                            // Wait for the user input, and release the memory
                            cvWaitKey(0);
                            cvReleaseImage( &image );
                        }
                    }
                    // Close the file
                    fclose(f);
                }
            }
     
        }
     
        // Destroy the window previously created with filename: "result"
        cvDestroyWindow("result");
     
        // return 0 to indicate successfull execution of the program
        return 0;
    }
     
    // Function to detect and draw any faces that is present in an image
    void detect_and_draw( IplImage* img )
    {
        int scale = 1;
     
        // Create a new image based on the input image
        IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
     
        // Create two points to represent the face locations
        CvPoint pt1, pt2;
        int i;
     
        // Clear the memory storage which was used before
        cvClearMemStorage( storage );
     
        // Find whether the cascade is loaded, to find the faces. If yes, then:
        if( cascade )
        {
     
            // There can be more than one face in an image. So create a growable sequence of faces.
            // Detect the objects and store them in the sequence
            CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                                1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                                cvSize(40, 40) );
     
            // Loop the number of faces found.
            for( i = 0; i < (faces ? faces->total : 0); i++ )
            {
               // Create a new rectangle for drawing the face
                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
     
                // Find the dimensions of the face,and scale it if necessary
                pt1.x = r->x*scale;
                pt2.x = (r->x+r->width)*scale;
                pt1.y = r->y*scale;
                pt2.y = (r->y+r->height)*scale;
     
                // Draw the rectangle in the input image
                cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
            }
        }
     
        // Show the image in the window named "result"
        cvShowImage( "result", img );
     
        // Release the temp image created.
        cvReleaseImage( &temp );
    }
    que j'applique avec mon fichier xml sur une video de route et pourtant, il ne me détecte aucune voiture...

    A quoi cela peut il être du?

    Merci
    Vincent

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Ça peut être dû à plein de chose, la banque d'image utilisé n'est pas représentative, l'objet est mal défini les paramètres de la fonction demande de générer un trop haut niveau de correspondance avec tes images passée en paramètre...

    Mais je pense que le problème le plus important est tout autre, tu essais de détecter des voitures dans une vidéo et l'algorithme n'est pas fait pour ça.
    Tu peux affiner autant que tu veux, je pense que pour ce que tu veux faire tu as choisis le mauvais algo.
    Le haartraining se base sur des caractéristiques minimaliste classé en fonction de leur forme.
    En clair ce que tu cherches à détecter doit regrouper des caractéristique communes, hors non seulement les voiture peuvent être très différentes mais en plus tu cherches à les détecter dans une vidéo dans laquelle je suppose que tu puisse les voir à la fois de coté, de face, de dos, de haut ou d'en bas.

    En affinant au maximum ton classifier tu parviendrais à détecter une majeur partie des voitures, mais uniquement lorsque elles se positionnent de la même manière que dans les images que tu as fournis à ton classifier.

    Pour avoir un classifier précis le genre de dossier image que tu dois utiliser devrais ressembler à celle qu'on peut télécharger sur ce lien

    Dans l'exemple que tu utilises, ce sont les visages qui sont détectés, un visage c'est la face avant de la tête, le système de détecte pas les visages vus de l'arrière, pour te donner une idée OpenCV fournis des classifier pour la détection de corps complet, le classifier a été très bien généré et pourtant si tu films une personne en train de bouger très souvent tu ne pourras pas la détecter.

Discussions similaires

  1. [RegEx] Extraire une chaîne complète contenant un mot particulier
    Par Doc_xhtml dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2011, 10h59
  2. Recherche d'une sous-chaîne complète dans une chaîne de caractères
    Par missmiss89 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 06/07/2011, 16h26
  3. Réponses: 2
    Dernier message: 09/11/2006, 22h53
  4. Réponses: 16
    Dernier message: 24/10/2006, 21h37
  5. [Regex] reconnaitre une chaîne non complète
    Par EdoBvD dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 13/07/2004, 17h14

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