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++

  1. #21
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Re bonjour à tous!

    Je reviens vers vous car depuis j'ai bien avancé, l'appli c++ n'a pas changé mais j'ai terminé de faire mon site.
    Finalement je l'ai fais avec un mélange de Photoshop + Dreamweaver + Webdev.

    J'ai pris un hébergement pour pouvoir y stocker ce que je veux notamment les images de références (les crop) dont on se sert dans l'appli c++ (celles qui sont listé dans le csv.ext).
    Sur mon serveur j'ai donc les images et le fichier csv.ext qui contient les url de ces images.
    J'aimerai que dans mon code c++ soit lu le csv du serveur (avec l'url des images au lieu de leur chemin sur le disque dur du pc) mais là est le problème, dans le read_csv il est passé en paramètre "images" qui est une image pour lui (vector <> Mat) et bien sur ça ne marche pas des que je met une url dans le fichier csv à la place du chemin direct d'une image puisque pour lui une url n'est pas une image et puisqu'on accède pas de la même façon à une url qu'à une image. Mais je ne sais pas comment faire, une solution?

    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
    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_alt.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 = createLBPHFaceRecognizer();
        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:
     
    		int prediction;
    		vector< Rect_<int> > faces;
    		vector<pair<vector<int>,vector< Rect_<int> >>> label;
     
    		haar_cascade.detectMultiScale(gray, faces);
    		vector<int> pred (faces.size());
            // 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++) {
    			nbFaces=faces.size();
     
    			// Process face by face:
                Rect face_i = faces[i];
     
    			//Tableau[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:
    			prediction = model->predict(face_resized);
    			pred[i]=prediction;
                // 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);
            }
    		label.push_back(make_pair(pred,faces));
    		imwrite("D:\\ImageScanée.jpg", original);
    		namedWindow( "face_recognizer", 0 );
     
    		//Detect click on window and call mouseEvent
    		cvSetMouseCallback("face_recognizer", mouseEvent, (void*)&label);
     
    		// Show the result:
            imshow("face_recognizer", original);
     
            // And display it:
    	   waitKey(0);
     
     
    	   return 0;
    }

    Merci à vous



    EDIT:
    En fouillant sur le net j'ai trouvé une librairie qui fait ce que je veux: Libcurl En gros elle convertit l'url d'une image en image.
    Pour cela je passe donc en paramètre de ma fonction csv non plus un vector<mat> mais un vector <string> qui contient l'url de l'image. Cette url est ensuite convertie en image et mise dans un vector <Mat>.

    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
    static void read_csv(const string& filename, vector<string>& URLimages, 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;
    	CURL *curl;
    	CURLcode res;
    	std::ostringstream stream;
    	curl = curl_easy_init();
     
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if(!path.empty() && !classlabel.empty()) {
     
    			//*******************************************************************************
    			                       //CONVERTIR URL EN IMAGE
        curl_easy_setopt(curl, CURLOPT_URL, URLimages); //the img url
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); // pass the writefunction
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream); // pass the stream ptr when the writefunction is called
    	res = curl_easy_perform(curl); // start curl
    	std::string output = stream.str(); // convert the stream into a string
    	curl_easy_cleanup(curl); // cleanup
    	std::vector<char> data = std::vector<char>( output.begin(), output.end() ); //convert string into a vector
    	cv::Mat data_mat = cv::Mat(data); // create the cv::Mat datatype from the vector
    	image = cv::imdecode(data_mat,1); //read an image from memory buffer
     
    			//***********************************************************************************
     
                image.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
    Problème, le programme plante à l'éxécution "L'application n'a pas réussi à démarrer correctement (0xc0150002)". Après avoir regardé à quoi ça correspondait, il s'agirait d'une simple erreur de lien de dll, il en manque une, ou chose du genre...j'espère trouver ce qui bloque

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Qu'indique l'EventViewer ?

  3. #23
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    L'EventViewer m'indique cela:
    La création du contexte d’activation a échoué pour «*d:\visual studio 2012\Projects\facerec_video\Debug\curllib.dll*». Assembly dépendant Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" introuvable. Utilisez sxstrace.exe pour un diagnostic détaillé.
    Qu'est ce qui peut causer cela ?

  4. #24
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ce que sxtrace te dira?

    L'autre solution, c'est que ta bibliothèque CURL n'est pas la bonne pour ton pc (32bits ou 64bits, bon os?)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #25
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Voici donc ce que me sort notre cher SxsTrace:

    =================
    Début de la génération du contexte d’activation.
    Paramètre d’entrée*:
    Flags = 0
    ProcessorArchitecture = Wow32
    CultureFallBacks = fr-FR;fr
    ManifestPath = d:\visual studio 2012\Projects\facerec_video\Debug\curllib.dll
    AssemblyDirectory = d:\visual studio 2012\Projects\facerec_video\Debug\
    Application Config File =
    -----------------
    Information*: analyse du fichier manifeste d:\visual studio 2012\Projects\facerec_video\Debug\curllib.dll.
    Information*: l’identité de la définition du manifeste est (null).
    Information*: référence*: Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
    Information*: résolution de la référence Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
    Information*: résolution de la référence pour l’architecture ProcessorArchitecture WOW64.
    Information*: résolution de la référence pour la culture Neutral.
    Information*: application de la stratégie de liaison.
    Information*: aucune stratégie de serveur de publication trouvée.
    Information*: aucune redirection de la stratégie de liaison trouvée.
    Information*: début de la recherche d’assemblys.
    Information*: impossible de trouver l’assembly dans WinSxS.
    Information*: tentative de recherche du manifeste sur C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
    Information*: manifeste pour la culture Neutral introuvable.
    Information*: fin de la recherche d’assemblys.
    Information*: résolution de la référence pour l’architecture ProcessorArchitecture x86.
    Information*: résolution de la référence pour la culture Neutral.
    Information*: application de la stratégie de liaison.
    Information*: aucune stratégie de serveur de publication trouvée.
    Information*: aucune redirection de la stratégie de liaison trouvée.
    Information*: début de la recherche d’assemblys.
    Information*: impossible de trouver l’assembly dans WinSxS.
    Information*: tentative de recherche du manifeste sur C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
    Information*: tentative de recherche du manifeste sur d:\visual studio 2012\Projects\facerec_video\Debug\Microsoft.VC90.DebugCRT.DLL.
    Information*: tentative de recherche du manifeste sur d:\visual studio 2012\Projects\facerec_video\Debug\Microsoft.VC90.DebugCRT.MANIFEST.
    Information*: tentative de recherche du manifeste sur d:\visual studio 2012\Projects\facerec_video\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.DLL.
    Information*: tentative de recherche du manifeste sur d:\visual studio 2012\Projects\facerec_video\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.MANIFEST.
    Information*: manifeste pour la culture Neutral introuvable.
    Information*: fin de la recherche d’assemblys.
    Erreur*: impossible de résoudre la référence Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
    Erreur*: échec de la génération du contexte d’activation.
    Fin de la génération du contexte d’activation.
    Y'a l'air de manquer quelque chose ?
    Après des heures à regarder sur internet j'ai essayé plusieurs choses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    J'ai trouvé la solution ! Je vous la donne au cas où quelqu'un tombe sur le même soucis.
     
    En fait, j'ai désinstallé toutes les distributions VC++ de ma machine, et j'ai réinstallé celle-ci : http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c#filelist
     
    Elle s'appelle "Mise à jour de sécurité ATL pour le package redistribuable Microsoft Visual C++ 2008 Service Pack 1 " (http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c#filelist)
    Ce package  ne semble pas inclure les mêmes fichiers que celle que j'avais mise qui s'appelait "Package redistribuable Microsoft Visual C++ 2008 (x86) " et se trouvait ici : http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf
     
    A noter que l'installation que j'avais (et qui posait problème) était ensuite mise à jour automatiquement par Windows Update par le SP1 (mais en posant toujours soucis). Le fameux SP1 étant ici : http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2
     
    Bref, c'est un beau bazar leurs packages de distributions Visual C++ 2008 ! Pourquoi conservent il 36 versions sur le site de Microsoft et n'y en a-t-il pas qu'un seul (incluant éventuellement toutes les versions nécessaire) c'est une grande question...
    D'autres dise qu'il faut inclure des runtime (pas essayé).

    Y'en à vraiment pour tous les goûts mais en ce qui me concerne je sais toujours pas d'où ça vient.

    Et j'ai pris la version: libcurl-7.19.3-win32-ssl-msvc
    Je tourne en Windows 7 64bits

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    curllib.dll contient un manifeste indiquant qu'elle utilise la C-Runtime : Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
    C'est une C-Runtime en Debug, il doit donc avoir VS d'installer sur la machine.
    C'est une version 32bits de la C-Runtime, avez-vous installé cette C-Runtime au moment de l'installation de VS ?
    Si oui au 2, pouvez-vous localiser les "msvcr90d.dll" dans votre machine ? Si oui, pouvez-vous nous indiquer leur chemin ?

    Après, faudra aussi synchroniser les manifestes entre l'exécutable et les dll, ou ne pas mettre de manifestes dans les dll (mais c'est plus cas gueule pour la maintenance).

    EDIT : Après vérification, il s'agit de la version VS2008 de la C-Runtime Debug.
    Il faudrait donc une version de curllib.dll ayant une dépendance avec une C-runtime plus récente, le plus simple étant de la régénérer soi-même.

  7. #27
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    ou, éventuellement, d'en retélécharger une sur le site officiel.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #28
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Je ne m'y connais pas trop en assembly, manifest ^^

    J'ai installé ceci: https://www.google.fr/url?sa=t&rct=j...83640239,d.d2s
    J'ai désinstallé toutes les versions de Microsoft Visual C++ pour installer le Microsoft Visual C++ 2008 Redistribuable 9.0.21022.8
    Je n'ai que lui d'installé.

    Et non, je n'ai pas ces dll sur ma machine. J'ai pu voir que certains de mes programmes ont dans leur répertoire msvcr90.dll (Pas la version debug)

  9. #29
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Les redistribuables ne contiennent que les versions Release des C-Runtime, pas les versions Debug.
    Comme je l'ai déjà dis, il faut installer les VS pour avoir les versions Debug.

    Si vous ne voulez pas trop vous prendre la tête, recompilez la dll avec le VS que vous utilisez pour générer votre exécutable.

  10. #30
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    D'ailleurs, selon les termes de Microsoft on n'est pas censé publier un Exe ou DLL dépendant de la version Debug du runtime.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #31
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Ouf! Tout est rentré dans l'ordre !

    J'avais mal configuré mon projet, une erreur du genre C:\.....\lib au lieu de C:\.....\lib\debug
    Bref, tout se compile sans problème et le programme se lance mais n'affiche rien donc c'est juste que c'est mon code curl qui ne va pas (ça marche très bien quand j'enlève juste mon bout de code).

    Si j'utilise curl c'est parce que dans un fichier csv, j'ai une url qui envoie vers une image et j'aimerai récupérer dans un vector <Mat> toutes images correspondant aux URL sans les télécharger sur le DD (c'est l'avantage de curl en ce qui me concerne). La lecture ligne par ligne j'y arrive très bien puisque ça marche si je met des chemins d'images sur le DD mais j'ai l'impression que dès que je met une url dans le csv il ne récupère pas l'image.


    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
    //curl writefunction to be passed as a parameter
    size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) {
        std::ostringstream *stream = (std::ostringstream*)userdata;
        size_t count = size * nmemb;
        stream->write(ptr, count);
        return count;
    }
     
    //*****************************************************************************************************************************
     
     
     
    static void read_csv(const string& filename, vector<string>& 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()) {
     
    			//*******************************************************************************
    			                       //CONVERTIR URL EN IMAGE
    //function to retrieve the image as Cv::Mat data type
     
    	CURL *curl;
    	CURLcode res;
    	ostringstream stream;
    	curl = curl_easy_init();
    	curl_easy_setopt(curl, CURLOPT_URL, images); //the img url
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); // pass the writefunction
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream); // pass the stream ptr when the writefunction is called
    	res = curl_easy_perform(curl); // start curl
    	string output = stream.str(); // convert the stream into a string
    	curl_easy_cleanup(curl); // cleanup
    	vector<char> data = vector<char>( output.begin(), output.end() ); //convert string into a vector
    	Mat data_mat = Mat(data); // create the cv::Mat datatype from the vector
    	image = cv::imdecode(data_mat,1); //read an image from memory buffe
     
    			//***********************************************************************************
     
                image.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }

  12. #32
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Convertir un flux binaire en std::string, c'est vraiment pas terrible.
    Je pense que le format d'image téléchargée n'est pas le même que le format des images sur le disque.
    Pouvez-vous faire un affichage hexadécimal des 40 premiers octets dans le cas où cela fonction et quand cela ne fonctionne pas ?
    Quel est le type/mime de la réponse HTTP retournée par le serveur ?

  13. #33
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre réponse, si l'image est au format .jpg donc l'url du genre "http:\\......\image.jpg"
    Avec le débogueur, je vois que j'arrive bien à récupérer l'url dans mon string path mais ça bloque au niveau du

  14. #34
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Je suis très dubitatif sur la possibilité pour "imdecode" de correctement décodé un flux d'image .jpg sans lui indiquer la nature de l'encodage.
    Je pense qu'elle ne fonctionne qu'avec le format brut d'opencv.

  15. #35
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Bon finalement j'ai réussi à faire quelque chose !

    Voici le début de mon main:

    Je passe l'url de l'image par la variable "images" (vector <string>).

    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
    vector<string> 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 = image[0].cols;
        int im_height = image[0].rows;
        // Create a FaceRecognizer and train it on the given images:
    	Ptr<FaceRecognizer> model = createLBPHFaceRecognizer();
        model->train(image, labels);

    et voici ma fonction read_csv ainsi que les méthodes qu'elle appelle:
    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
    #define BUF_SIZE	(512 * 1024)
    char recv_buf[BUF_SIZE + 1];
    int  recv_buf_size = 0;
    int nbFaces;
    vector<Mat> image;
     
     
    //*****************************************************************************************************************************
     
    // data receive callback function
    size_t recv_data(void *buffer, size_t size, size_t nmemb, void *userdata)
    {
    	size_t segsize = size * nmemb;
     
    	if (recv_buf_size + segsize > BUF_SIZE) {
    		*(int*)userdata = 1;
    		return 0;
    	}
     
    	memcpy((recv_buf + recv_buf_size), buffer, segsize);
    	recv_buf_size += segsize;	
    	recv_buf[recv_buf_size] = 0;
     
    	return segsize;
    }
     
    cv::Mat get_jpeg_image(const char *url)
    {
    	CURL     *curl = NULL;
    	CURLcode res;
    	int      err = 0;
     
    	curl = curl_easy_init();
    	if (!curl) {
    		printf("curl_easy_init() failed...\n");
    		return cv::Mat();
    	}
     
    	curl_easy_setopt(curl, CURLOPT_URL, url);
    	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&err ); // userdata
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, recv_data); //
     
    	res = curl_easy_perform(curl);
    	printf("res=%d (write_error = %d)\n", res, err);
     
    	if(res != CURLE_OK) {
    		printf("curl_easy_perform() failed...%s\n", curl_easy_strerror(res));
    		return cv::Mat();
    	}
    	curl_easy_cleanup(curl);
     
    	cv::Mat recv_data;
    	recv_data.create(cv::Size(recv_buf_size, 1), CV_8UC1);
    	memcpy(recv_data.data, recv_buf, recv_buf_size);
     
    	return recv_data;
    }
     
    //*****************************************************************************************************************************
     
     
     
    static void read_csv(const string& filename, vector<string>& 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()) {
     
    			//*******************************************************************************
    			                       //CONVERTIR URL EN IMAGE
     
    			cv::Mat recv_data;
    			const char *c=path.c_str();
    	// HTTP
    	recv_data = get_jpeg_image(c);
      cv::Mat raw_jpeg_data(1, recv_buf_size, CV_8UC1, recv_buf);
    	cv::Mat imageURL = cv::imdecode(raw_jpeg_data, -1);
     
     
    		// Show the result:
            imshow("face_recognizer", imageURL);
    			//***********************************************************************************
     
    		image.push_back(imageURL);
            labels.push_back(atoi(classlabel.c_str()));
     
            }
        }
    }
    Et j'arrive à afficher l'image de l'url (imageURL) mais après quand je retourne dans le main la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     model->train(image, labels);
    me fait une erreur
    Expression: vector iterators incompatible
    Je pense que je fais mal le pushback() dans la fonction read_csv() non ? Mais comment résoudre le souci ?
    Surtout que ce qui est bête c'est que l'image s'affiche donc je la récupère bien dans mon
    cv::Mat imageURL
    mais après j'ai ce message d'erreur qui s'affiche pendant que l'image reste affichée.

    Sur le net j'ai trouvé beaucoup d'ajout de cv::Mat dans un std::vector mais pas de cv::Mat dans un cv::vector<Mat>

  16. #36
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Souci toujours d'actualité, j'ai essayé un peu tout ce que j'ai trouvé sur internet (utiliser des références, ...) rien y fait

  17. #37
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Souci toujours d'actualité,
    Alors mes questions sont toujours d'actualité.

  18. #38
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Concernant le type de la réponse du serveur, je vois pas ce que tu veux dire par là, quoi qu'il en soit, l'image (70x70) est bien prise sur le serveur et récupérée dans la fonction read_csv mais le problème est je pense au niveau de la récupération du vecteur dans le main.
    J'ai lu des choses comme quoi il fallait passé une référence du vecteur pour ne pas faire de copie mais bien garder le même vecteur, j'ai essayé mais sans succès.

  19. #39
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Au lieu de faire des suppositions, répondez aux questions !

    Donnez nous le contenu, en hexa ou en binaire, du contenu de la variable "recv_buf" juste après la fin du téléchargement.

  20. #40
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    En hexa, sa valeur est de "0x010655a8".
    J'espère que c'est bien ça que tu voulais

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