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

Langage C++ Discussion :

Zone cliquable dans image


Sujet :

Langage C++

Vue hybride

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Par défaut Zone cliquable dans image
    Bonjour,

    Je développe actuellement un projet de détection et reconnaissance faciale. J'utilise donc Visual studio et code en C++ avec la librairie opencv.
    La détection et la reconnaissance marchent mais maintenant j'aimerai pouvoir traiter la reconnaissance d'un visage.


    Ma question est la suivante, j'obtiens par exemple cette image:


    Comment afficher "cliqué" lorsque je fais un clique gauche uniquement dans le rectangle ?
    Sachant que je connais les coordonnés et la taille de ce rectangle ?

    Tous les cliques à détecter seront uniquement dans des rectangles.
    J'ai déjà fais des recherches à droite à gauche mais j'ai pas trouvé ça très clair.

    Merci à vous

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Soir,

    Cela dépend de la bibliothèque graphique utilisé pour afficher l'image.
    Donc, quelle bibliothèque est utilisée ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Par défaut
    Bonjour,
    Comme indiqué, j'utilise la librairie opencv.

    Voici l'extrait du code qui crée un rectangle pour chaque visage détecté:

    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
                // Process face by face:
                Rect face_i = faces[i];
                // Crop the face from the image. So simple with OpenCV C++:
                Mat face = gray(face_i);
     
                // Resizing the face is necessary for Eigenfaces and Fisherfaces. You can easily
                // verify this, by reading through the face recognition tutorial coming with OpenCV.
                // Resizing IS NOT NEEDED for Local Binary Patterns Histograms, so preparing the
                // input data really depends on the algorithm used.
                //
                // I strongly encourage you to play around with the algorithms. See which work best
                // in your scenario, LBPH should always be a contender for robust face recognition.
                //
                // Since I am showing the Fisherfaces algorithm here, I also show how to resize the
                // face you have just found:
                Mat face_resized;
     
                cv::resize(face, face_resized, Size(im_width, im_height), 1.0, 1.0, INTER_CUBIC);
                // Now perform the prediction, see how easy that is:
                int prediction = model->predict(face_resized);
                // And finally write all we've found out to the original image!
                // First of all draw a green rectangle around the detected face:
                rectangle(original, face_i, CV_RGB(0, 255,0), 1);

    Les dimensions du rectangle sont contenues dans face_i.
    Comment donc, détecter un clic dans le rectangle ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans la fonction callback fixée avec cv::setMouseCallback, il suffit de vérifier si les coordonnées (x,y) en paramètre sont bien dedans.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Par défaut
    Merci, à toi, j'ai pu utiliser cette fonction et j'arrive à traiter un clic dans l'image mais pas encore le clic uniquement dans un rectangle.

    J'ai bien compris que la fonction MouseEvent récupérait la position du curseur c'est pour ça que j'ai fais quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((x >=xRect && x <= xRect + WidthRect) && (y >=yRect && y <= yRect + HeightRect){
    		////CODE/////
    		}
    Je remplace par les valeurs brutes et ça marche, ça ne fait le code que lors d'un clic dans le rectangle dont les paramètres sont dans la condition.
    Mais faudrait faire ça pour chaque rectangle donc c'est un peu lourd surtout que le nombre de rectangle sur les images varie et leurs dimensions ne sont pas les mêmes pour tous.
    Faudrait faire quelque chose d'un peu plus dynamique.
    J'ai une boucle qui crée n rectangle(s) et dans cette boucle j'ai un objet face_i de type Rect qui contient les coordonnées et dimensions du rectangle à créer (x,y,width,height). Je pense que je pourrai m'en servir mais je ne vois pas comment ? Tableau ? Mais comment le réutiliser après?

    Afin de vous éclaircir au maximum, voici mon 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
    /*
     * Copyright (c) 2011. Philipp Wagner <bytefish[at]gmx[dot]de>.
     * Released to public domain under terms of the BSD Simplified license.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *   * Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *   * Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *   * Neither the name of the organization nor the names of its contributors
     *     may be used to endorse or promote products derived from this software
     *     without specific prior written permission.
     *
     *   See <http://www.opensource.org/licenses/bsd-license>
     */
    #include <opencv2\opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/contrib/contrib.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/objdetect/objdetect.hpp>
    #include <windows.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
     
    using namespace cv;
    //using namespace cv::face;
    using namespace std;
     
    static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
        std::ifstream file(filename.c_str(), ifstream::in);
        if (!file) {
            string error_message = "No valid input file was given, please check the given filename.";
            CV_Error(CV_StsBadArg, error_message);
        }
        string line, path, classlabel;
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if(!path.empty() && !classlabel.empty()) {
                images.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
     
     
    void mouseEvent(int evt, int x, int y, int flags, void* param) {                    
        Mat* rgb = (Mat*) param;
        if (evt == CV_EVENT_LBUTTONDOWN) { 
     
    		//if ((xCurseur >=x && xCurseur <= x + WidthRect) && (yCurseur >=y && xCurseur <= y + HeightRect){
    		////CODE/////
    		//}
       ShellExecute(0, 0, L"http://www.google.com", 0, 0 , SW_SHOW );
        }         
    }
     
    //extern "C"__declspec(dllexport) 
     
    int main(int argc, const char *argv[]) {
        // Check for valid command line arguments, print usage
        // if no arguments were given.
      /* if (argc != 4) {
            cout << "usage: " << argv[0] << " </path/to/haar_cascade> </path/to/csv.ext> </path/to/device id>" << endl;
            cout << "\t </path/to/haar_cascade> -- Path to the Haar Cascade for face detection." << endl;
            cout << "\t </path/to/csv.ext> -- Path to the CSV file with the face database." << endl;
            cout << "\t <device id> -- The webcam device id to grab frames from." << endl;
            exit(1);
        }
        // Get the path to your CSV:
        string fn_haar = string(argv[1]);
        string fn_csv = string(argv[2]);
        int deviceId = atoi(argv[3]); */
     
    	string fn_haar="D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml";
    	string fn_csv = "D:\\opencv\\csv.ext";
    	int deviceId = 0;
        // These vectors hold the images and corresponding labels:
        vector<Mat> images;
        vector<int> labels;
        // Read in the data (fails if no valid input filename is given, but you'll get an error message):
        try {
            read_csv(fn_csv, images, labels);
        } catch (cv::Exception& e) {
            cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
            // nothing more we can do
            exit(1);
        }
        // Get the height from the first image. We'll need this
        // later in code to reshape the images to their original
        // size AND we need to reshape incoming faces to this size:
        int im_width = images[0].cols;
        int im_height = images[0].rows;
        // Create a FaceRecognizer and train it on the given images:
        Ptr<FaceRecognizer> model = createFisherFaceRecognizer();
        model->train(images, labels);
        // That's it for learning the Face Recognition model. You now
        // need to create the classifier for the task of Face Detection.
        // We are going to use the haar cascade you have specified in the
        // command line arguments:
        //
        CascadeClassifier haar_cascade;
        haar_cascade.load(fn_haar);
     
    	Mat original;
    	original= imread("D:\\hugh.jpg", CV_LOAD_IMAGE_COLOR);
            // Convert the current frame to grayscale:
            Mat gray;
            cvtColor(original, gray, CV_BGR2GRAY);
            // Find the faces in the frame:
            vector< Rect_<int> > faces;
            haar_cascade.detectMultiScale(gray, faces);
            // At this point you have the position of the faces in
            // faces. Now we'll get the faces, make a prediction and
            // annotate it in the video. Cool or what?
            for(unsigned int i = 0; i < faces.size(); i++) {
                // Process face by face:
                Rect face_i = faces[i];
                // Crop the face from the image. So simple with OpenCV C++:
                Mat face = gray(face_i);
                // Resizing the face is necessary for Eigenfaces and Fisherfaces. You can easily
                // verify this, by reading through the face recognition tutorial coming with OpenCV.
                // Resizing IS NOT NEEDED for Local Binary Patterns Histograms, so preparing the
                // input data really depends on the algorithm used.
                //
                // I strongly encourage you to play around with the algorithms. See which work best
                // in your scenario, LBPH should always be a contender for robust face recognition.
                //
                // Since I am showing the Fisherfaces algorithm here, I also show how to resize the
                // face you have just found:
                Mat face_resized;
                cv::resize(face, face_resized, Size(im_width, im_height), 1.0, 1.0, INTER_CUBIC);
                // Now perform the prediction, see how easy that is:
                int prediction = model->predict(face_resized);
                // And finally write all we've found out to the original image!
                // First of all draw a green rectangle around the detected face:
                rectangle(original, face_i, CV_RGB(0, 255,0), 1);
                // Create the text we will annotate the box with:
                string box_text = format("Prediction = %d", prediction);
                // Calculate the position for annotated text (make sure we don't
                // put illegal values in there):
                int pos_x = max(face_i.tl().x - 10, 0);
                int pos_y = max(face_i.tl().y - 10, 0);
                // And now put it into the image:
                putText(original, box_text, Point(pos_x, pos_y), FONT_HERSHEY_PLAIN, 1, CV_RGB(0,255,0), 2);
            }
     
     
     
    		imwrite("D:\\ImageScanée.jpg", original);
    		namedWindow( "face_recognizer", 0 );
     
    		//Detect click on window and call mouseEvent
    		 cvSetMouseCallback("face_recognizer", mouseEvent,0);
     
    		// Show the result:
            imshow("face_recognizer", original);
     
            // And display it:
    	   waitKey(0);
     
     
    	   return 0;
    }

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Par défaut
    Bon je n'y arrive toujours pas mais j'ai précisé l'idée !

    Je pense qu'il faudrait que je passe mon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector< Rect_<int> > faces;
    ...en paramètre de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvSetMouseCallback("face_recognizer", mouseEvent,faces);
    puis le définir comme cela dans la mouseEvent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mouseEvent(int evt, int x, int y, int flags, vector< Rect_<int> >tableau) {
    Mais ça ne marche pas, j'arrive pas à récupérer ce vecteur dans ma méthode mouseEvent car il me dit ce que je sais déjà: que ce n'est pas un void*
    Une idée ?

Discussions similaires

  1. Zone cliquable dans une image
    Par rad_hass dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/11/2010, 12h00
  2. Zone cliquable dans bandeau cliquable ?
    Par frmars dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/05/2010, 20h18
  3. Delimiter zone cliquable sur image
    Par SebastianPx dans le forum 2D
    Réponses: 6
    Dernier message: 28/02/2009, 19h29
  4. Positionnement zones cliquables sur image background mise en image map
    Par triblonto dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 22/01/2008, 15h42
  5. [gtkmm] Zone cliquable dans une fenetre?
    Par Valkirion dans le forum GTK+
    Réponses: 9
    Dernier message: 13/04/2007, 03h43

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