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 :

OpenNI : problème affichage trop lent


Sujet :

OpenCV

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI : problème affichage trop lent
    Bonjour à tous,

    Je travail actuellement sur l'utilisation de la caméra Kinect de Microsoft (caméra capable de voir en profondeur) sur ordinateur afin de développer une application destinée au tracking de la main.

    J'utilise la bibliothèque OpenNI pour ce qui est de la partie récupération des données de la caméra et la bibliothèque OpenCV pour ce qui est de la partie traitement d'image.

    J'ai cependant un petit problème avec OpenCV. En effet je souhaite dans un premier temps faire un affichage classique de la caméra VGA dans une fenêtre.
    Je récupère alors les données pour ensuite en faire une matrice que j'affiche à l'aide de la fonction cv::imshow.

    L'image apparaît mais l'affichage est saccadé (là est mon problème). J'ai mesuré le temps d'exécution, il est à environ 25ms (ce qui équivaut je croix à approximativement 40 fps). Je ne comprend pas pourquoi l'affichage est aussi lent alors que le traitement semble supérieur à 30 fps.

    Ceci est mon premier poste sur ce forum (et j'espère pas le dernier ) je suis donc débutant en OpenCV (même plus généralement en traitement d'image ).

    Voici le code que j'utilise :
    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
     
            /*
            INITIALISATION DES OBJETS OPENNI
            (ces objets me permettent par la suite de récupérer les données
            de la caméra)
            */
     
        //variable(s) pour test des erreurs
        XnStatus rc;
        //initialise le context
        rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH);
        CHECK_RC(rc, "initialisation du context\n");
        //initialise générateur de profondeur
        rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
        CHECK_RC(rc, "initialisation du générateur de profondeur\n");
        //initialise métadonnées de profondeur
        g_depth.GetMetaData(g_depthMD);
        //initialise générateur d'image
        rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
        CHECK_RC(rc, "initialisation du générateur d'image\n");
        //initialise métadonnées d'image
        g_image.GetMetaData(g_imageMD);
     
     
        //generation des donnees
        rc = g_context.StartGeneratingAll();
        CHECK_RC(rc, "generating all context\n");
     
     
     
            /* j'utilise pour le moment une boucle infinie pour l'affichage */
    while(true){<div style="margin-left:40px">
            //début du timer destiné à calculer le temps d'exécution
            double tt = (double)cvGetTickCount();
     
            //variables
            int nbColone = g_imageMD.XRes();
            int nbLigne = g_imageMD.YRes();
     
            //déclaration , alocation qui pointe sur les future pixels à afficher
    unsigned char* picture = new unsigned char[nbLigne * nbColone * 3];
     
                    //initialisation avec les données récupérées
                    memcpy(picture, (unsigned char*)g_imageMD.RGB24Data(),nbLigne * nbColone * 3);
     
                    //bascule du sens du Rouge et du bleu pour avec le format RGB
            for(int i = 0 ; i < nbLigne * nbColone ; i++){<div style="margin-left:40px">unsigned char temp = picture[i*3];
                picture[i*3] = picture[i*3+2];
                picture[i*3+2] = temp;</div>}
     
            //transfère dans une matrice puis affichage
            cv::Mat couleurMatRes(nbLigne, nbColone, CV_8UC3, picture);     
            cv::imshow("Christophe",couleurMatRes);
     
                    //attente d'une ms
            cvWaitKey(1);
     
            //libération de la mémoire couleur
            delete[] picture;
     
            //fin du timer et calcul du temps écoulé
            tt = (double)cvGetTickCount() - tt;
                    cout << "Temps d'extraction : " << tt/(cvGetTickFrequency()*1000.) << "ms" << endl;</div>}
    J'espère avoir était clair, merci de votre attention .

    Shurtagh

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Salut

    déjà balise code sinon tu vas te faire taper dessus ^^

    ensuite moi j'enlèverais toutes les déclarations de variable d'une boucle infinie (sous openCV générallement tu crée une fonction traitement et tu l'appelle dans ta boucle while pour pas avoir tout dans le while et tu déclares toutes tes variables en global, avec une init dans la fonction)

    //bascule du sens du Rouge et du bleu pour avec le format RGB
    ca, je pense qu'en cherchant un peu tu trouveras la fonction à utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char* picture = new unsigned char[nbLigne * nbColone * 3];
    j'utiliserais plus une Iplimage moi comme ca tu es tranquil pour les traitements derrières, pareil pour le transfert dans ta matrice et l'affichage avec une iplimage les fonctions sont toutes faites.

    Tu es bien à 40 ips mais as tu vérifié ton image. afficher une image dans une fenêtre et vérifier sa validité ?

    (évite une boucle while infini mets plutot une condition de sortie avec un wait key)

    J'ai un vague souvenir d'une tempo dans le while si le traitement est trop rapide, car ton programme n'a pas le temps de traiter ta première image que tu es déjà à la suivante et ainsi de suite.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Salut,

    Tout d'abord merci pour ta réponse, je m'excuse pour le non balisage en code, étant nouveau sur le forum je n'ai pas eu ce reflex c'est noté pour la prochaine fois*.

    Merci pour tes différents conseils, tu as raison c'est beaucoup plus clair de cette manière (éviter la déclaration de variables dans une boucle infinie et utiliser des variables globales), l'utilisation d'un waitKey() simplifie aussi la vie .

    Dans mon programme j'effectue différents traitements, il est plus conséquent et organisé. J'avais fait rapidement ce petit exemple pour montrer mon problème.
    Il m'arrive par exemple de recopier des "bouts" d'image pour en faire d'autres. C'est pourquoi j'étais resté ""bas niveau"" avec un unsigned char*pour mes images (je pouvais facilement recopier des morceaux de mon tableau). Je les basculais en cv::Mat à la fin juste pour l'affichage. Pour les IplImages, je ne sais pas tout ce que l'on peut faire avec, mais j'essayerais de plus les utiliser.

    Est-il mieux d'afficher avec une matrice (imshow) ou avec une IplImage (cvShowImage) ?

    Autrement les images (saccadées) qui s'affiche à l'écran sont pleines et bien formées. Il m'était aussi arrivé de les enregistrer et il n'y avait pas de problème.

    Pour remédier à ce problème je pense que je vais faire un gros buffer de mes images pour les enregistrer en vidéo afin de voir si l'affichage est toujours saccadé (la difficulté est qu'il faudra que je stocke également les données de profondeur fournies par la caméra à l'aide du capteur infra-rouge), je devrais cependant remédier à ce problème d'affichage.

    Je pense que la piste du traitement effectué trop rapidement par rapport à l'affichage peut être une piste effectivement.

    Merci.

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    hum en theorie matrice ou image c'est similaire, mais la theorie a du mal à rejoindre la pratique quelques fois ^^

    pour ca il faudrait s'intéresser à ce qui se passe en couche basse avec une Iplimage chose que je n'ai jamais faite

    L'Iplimage est intéressante car elle permet la récupération d'information sur ton image directement de part sa structure sans traitement, à voir si cela t'es nécessaire.

    essaye les deux si le résultat est similaire ton problème ne vient pas de la. En passant si ton flux vient d'une caméra il est normallement possible de récupérer directement l'image avec un cvgrabframe par exemple (tu trouveras pas mal d'exemple sur le forum)

    Concernant le temps, normallement il faut qu'il soit supèrieur à 10 ms mais ceci avec un grabframe, de ton côté il faudrait que tu vérifie que ton système d'acquisition d'image est robuste à 25 ms par exemple.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Je n'ai pas testé mais effectivement je pense que si il y a une différence elle doit être minime.

    En effet, l'iplimage propose ensuite de nombreuses possibilités, je penserais à plus (+) l'utiliser. Certaines de ces possibilités pourront êtres utiles.

    Pour l'acquisition d'image j'utilise OpenNI, je n'ai pas essayé le cvgrabframe. Cependant avec OpenNI est fourni des applications de test qui utilisent glut32 pour l'affichage et l'intéraction Homme-Machine, il n'y a aucun problème. L'affichage est fluide. J'ai donc pris leur application et j'y ai ajouté OpenCV, dans leur fonction dessin j'ai appelé la mienne (utilisant openCV). L'affichage était bien et sans latence.

    Je ne peux pas cependant garder cette méthode, utiliser deux librairies graphiques pour une même chose n'est pas judicieux. J'utilise quelques fonctions d'OpenCV et je ne peux pas pour le moment refaire leur algo (même si ça pourrait être intéressant) car je n'ai pas le temps et pour certaines pas le niveau. D'autant plus qu'elles doivent être optimisées sur OpenCV.

    Avec glut32 le programme utilise une méthode mainloop qui se charge d'appeler en boucle les différentes fonctions notamment la fonction display.

    J'ai créé un projet vide et j'y ai ajouté OpenNI et OpenCV. Le système d'acquisition marche donc mais peut être que je l'utilise mal avec mon projet (même si il me semble que ce soit bon =/);

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    C'est bon j'ai résolu mon problème ! C'était bien une mauvais utilisation de OpenNI lors de l'acquisition de l'image et le problème ne venait pas de OpenCV.

    En effet, dans ma boucle infinie pour récupérer les données je me contentais de faire :

    //initialisation avec les données récupérées
    memcpy(picture, (unsigned char*)g_imageMD.RGB24Data(),nbLigne * nbColone * 3);
    Je pensais que le g_imageMD.RGB24Data() suffisait pour récupérer la nouvelle image. D'autant plus que mon affichage, même si ça était de façon saccadée, s'actualisait.

    Mais cela ne suffit pas, après une lecture de la documentation je me suis rendu compte qu'il faut mettre à jour le contexte avec un g_context.WaitAnyUpdateAll(); puis ensuite mettre à jour les données de l'image correspondante avec un g_image.GetMetaData(g_imageMD);.

    Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            //MODIFICATION : MISE A JOUR CORRECT DES DONNES
    	// lecture d'une nouvelle image
    	rc = g_context.WaitAnyUpdateAll();
    	CHECK_RC(rc, "Mise à jour de l'image\n");
    	g_image.GetMetaData(g_imageMD);


    Et si je reprends le code précédant cela donne :

    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
    /*VARIABLES GLOBALES*/
    Context g_context;
    DepthGenerator g_depth;
    ImageGenerator g_image;
    DepthMetaData g_depthMD;
    ImageMetaData g_imageMD;
     
     
    /*Debut de la fonction main*/
     
     
    /*
    INITIALISATION DES OBJETS OPENNI
    (ces objets me permettent par la suite de récupérer les données
    de la caméra)
    */
     
    //variable(s) pour test des erreurs
    XnStatus rc;
    //initialise le context
    rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH);
    CHECK_RC(rc, "initialisation du context\n");
    //initialise générateur de profondeur
    rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
    CHECK_RC(rc, "initialisation du générateur de profondeur\n");
    //initialise métadonnées de profondeur
    g_depth.GetMetaData(g_depthMD);
    //initialise générateur d'image
    rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
    CHECK_RC(rc, "initialisation du générateur d'image\n");
    //initialise métadonnées d'image
    g_image.GetMetaData(g_imageMD);
     
     
    //generation des donnees
    rc = g_context.StartGeneratingAll();
    CHECK_RC(rc, "generating all context\n");
     
     
     
    /* j'utilise pour le moment une boucle infinie pour l'affichage */
    while(true){
     
     
        //début du timer destiné à calculer le temps d'exécution
        double tt = (double)cvGetTickCount();
     
        //variables
        int nbColone = g_imageMD.XRes();
        int nbLigne = g_imageMD.YRes();
     
            //MODIFICATION : MISE A JOUR CORRECT DES DONNES
    	// lecture d'une nouvelle image
    	rc = g_context.WaitAnyUpdateAll();
    	CHECK_RC(rc, "Mise à jour de l'image\n");
    	g_image.GetMetaData(g_imageMD);
     
        //déclaration , alocation qui pointe sur les future pixels à afficher
        unsigned char* picture = new unsigned char[nbLigne * nbColone * 3];
     
        //initialisation avec les données récupérées
        memcpy(picture, (unsigned char*)g_imageMD.RGB24Data(),nbLigne * nbColone * 3);
     
        //bascule du sens du Rouge et du bleu pour avec le format RGB
        for(int i = 0 ; i < nbLigne * nbColone ; i++){
     
            unsigned char temp = picture[i*3];
            picture[i*3] = picture[i*3+2];
            picture[i*3+2] = temp;
     
        }
     
        //transfère dans une matrice puis affichage
        cv::Mat couleurMatRes(nbLigne, nbColone, CV_8UC3, picture);
        cv::imshow("Christophe",couleurMatRes);
     
        //attente d'une ms
        cvWaitKey(1);
     
        //libération de la mémoire couleur
        delete[] picture;
     
        //fin du timer et calcul du temps écoulé
        tt = (double)cvGetTickCount() - tt;
        cout << "Temps d'extraction : " << tt/(cvGetTickFrequency()*1000.) << "ms" << endl;
     
    }
    A savoir que si vous utilisez seulement l'image vous pouvez remplacer le g_context.WaitAnyUpdateAll(); par un g_context.WaitOneUpdateAll(g_image);. Le g_context.WaitAnyUpdateAll(); actualise également d'autres données comme la profondeur récupérée avec le capteur infrarouge.

    Bien sur tout ceci est sous réserve d'erreur de compréhension, d'utilisation ou de recopiage . Si il y en a une merci de le signaler.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut Kinect et OpenCV
    Bonjour Christophe

    moi je suis nouveau dans l utilisation de kinect et d opencv

    je veux faire comme toi en utilisant opencv pour demarrer le kinect

    et faire d autres traitements par la suite

    je reste a ton ecoute pour tes explications

    merci d avance

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Salut Adous,

    Je serai ravi de répondre à toutes les questions que tu te poses du moins tant que j'en suis capable.

    Pour faire un petit résumé :

    OpenCV est une bibliothèque qui permet de faire du traitement d'image, je m'en sers pour faire quelques détections de contours, l'affichage etc ... mais je ne m'en sers pas pour récupérer les données de la caméra Kinect.

    Pour récupérer les données de la caméra je me sers de la bibliothèque OpenNI. Mon programme possède donc les deux bibliothèques : OpenNI pour récupérer les données de la caméra et OpenCV pour faire des traitements dessus et afficher le résultat.

    Tu trouves de très bon tutos pour installer OpenCV et OpenNI (il faut bien faire la distinction ce sont deux bibliothèques différentes).

    ***

    A savoir que si tu veux, à la place de OpenNI tu peux utiliser la bibliothèque CLNUI (de Code Laboratories) pour utiliser kinect sur ton ordinateur. Si je ne trompe pas elle permet de récupérer les données de la caméra couleur, les données de la caméra profondeur et de diriger le moteur (pour faire incliner la caméra). Cependant OpenNi propose en plus de cela des outils plus haut niveau implémentés dans leur bibliothèque comme par exemple la détection de personnes et le célèbre skeleton.

    Tu trouve également de très bon tutos pour installer CLNUI si tu le préfère à OpenNI.

    ***

    Pour t'entraîner OpenNI propose des applications en exemple (qui s'installent en même temps que lui). Ces applications vont des choses les plus simples aux un peu plus complexes. Cependant elle n'utilise pas la bibliothèque OpenCV pour l’affichage mais la bibliothèque glut32.

    Je te conseil de partir de ces applications pour comprendre le fonctionnement du OpenNI et ensuite de coupler ton travail avec OpenCV pour faire des traitements par dessus.

    J'espère que mes explications n'étaient pas trop confuses.

    lien utile : http://www.openni.org/documentation

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI et OpenCV
    Salut Christophe,

    merci de votre reponse

    en ce moment je suis parti avec OpenNI

    j ai suivi quelques tutos et j ai installe des drivers pour pouvoir connecter mon kinect a mon pc en ce moment cela marche sauf l audio je ne sais pas pourquoi

    ayant une formation en RESEAU, je ne suis pas top en programmation

    maintenant je veux utiliser un code ou il ya les deux bibliotheques openNI et openCV, mais j ai un probleme pour l implementation

    je ne sais meme pas par ou commencer

    merci d avance pour votre aide

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut openCv et openNI
    quelques precisions

    je pense que je vais faire comme tu as dit travailler avec openNI et apres le coupler avec openCV

    en ce moment j ai installe OpenCV, OpenNI et MS Visual Studio 2008

    pour le tuto j ai fait les etapes de la section page 19 mais je comprends pas quoi faire sur la partie XML

    je mets son lien direct sur le PATH ou bien

    et apres les includes je ne vois pas quelles parties des codes du tuto copier

    merci d avance

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Concernant l'erreur d'installation de la partie audio c'est normale (du moins je croix) il ne fonctionne pas encore.

    Mais te fais pas de soucis, normalement tant que tu as pu installer la caméra, même si son driver audio ne fonctionne pas ce n'est pas grave, tu pourras toujours récupérer les données couleur et profondeur.

    Pour l'installation de OpenCV je peux pas trop t'aider =/ moi même j'ai du bidouiller plusieurs choses avec plusieurs tutos différents. Je ne me souviens plus exactement comment j'avais fais désolé.

    J'avais gardé le lien de cette vidéo, il me semble que c'est ce que j'avais le plus utilisé pour installé OpenCV :


    C'est une vidéo pour la version 2010 mais moi aussi je l'ai installé sur la version 2008, c'est quasiment pareil (si je dis pas de bêtise).

    Pour commencer essayer de lancer une application toute faite de OpenNI pour voir si la caméra fonctionne correctement sur ton ordinateur. Tu vas dans démarrer, tous les programmes, openni, samples et tu lance NiSimpleRead ou NiSimpleViewer par exemple. Si le programme ne se lance pas il peut y avoir un problème d'installation.

    Si cela fonctionne tu vas maintenant pouvoir aller regarder le code de ces applications. Par exemple pour voir le code de l'application NiSimpleViewer (qui affichage la caméra profondeur à l'écran en nuance de jaune) tu vas dans démarrer, tous les programmes, openni, samples, Samples Directories, NiSimpleViewer et tu lance le projet visual 2008 : NiSimpleViewer_2008;

    A ce moment là tu accède au code de l'application avec visual studio 2008 et tu peux le modifier.

    Une petite chose : dans le code il y a une petite erreur de lien qu'il faut corriger. En effet, l'application initialise le context avec un fichier XML et le liens n'est pas le bon.

    il faut remplacer la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     #define SAMPLE_XML_PATH "../../../Data/SamplesConfig.xml"
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     #define SAMPLE_XML_PATH "../../Data/SamplesConfig.xml"
    Il faut juste retirer un ../ . Cependant cela peut dépendre d'un ordinateur à l'autre, ce qui compte c'est que le chemin soit celui du fichier SampleConfig.xml qui est contenu dans le dossier Data où tu as installé openNI.

    Une fois cela corrigé tu peux normalement exécuter le code. L'application se compile et se lance.

    Cette application NiSimpleViewer est déjà configuré pour utiliser OpenNI, libre à toi de modifier le code comme tu le souhaite. Pour l'affichage elle utilise glut32, tu pourras par la suite la configurer pour pouvoir également utiliser OpenCV.

    Tu peux autrement créer un projet de zéro et le configurer pour pouvoir utiliser OpenNi et OpenCV, mais il vaut mieux déjà essayer de comprendre les applications exemple. NiSimpleViewer est vraiment une application simple qui montre comment utiliser la caméra couleur et la caméra profondeur.


    PS : Je viens de me rendre compte que j'utilise OpenCV en version 2.1 (même si j'ai la version 2.2). Tu peux utiliser soit l'une soit l'autre , peux importe. Tu dois également pouvoir trouver des tutos pour installer la version 2.1 notamment sur le site d'OpenCV.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenCV
    Bonjour
    en ce moment j'avais dèjà installé openCV et MS Visual Studio 2008

    il y a une chose que je comprends : comment récupèrer les données couleur et profondeur

    lorse que je lance l'application j'ai deux fenetres qui sortent

    si t'as des explications sur le traitement d'images je suis prenant

    j 'ai pas encore testé glut32 c'est une fenetre qui s'affiche direct lorse que je lancerai le programme oubien

    et pur utiliser openni et opencv comment je peux organiser mon code

    sur quelle base partir

    merci d'avance

  13. #13
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    base toi sur les quelques exemples de code qu'il a linké, d'abord tu récupère ton image sous openNI et après tu fais les modif que tu veux sous openCV, tu retravaille l'image.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI et OpenCV
    Bonjour Christophe

    j espere que vous avez recu le messagee prive que je vous ai envoye

    je voudrais savoir aussicomment faire un affichage classique de la caméra VGA dans une fenêtre avec OpenCV en l incluant dans le code de NiViewer

    merci d avance

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI et OpenCV
    Bonjour Christophe,

    autant pour moi j ai utilise le code de NiSampleNiViewer pas l autre

    en ce moment j ai ajoute les headers cv, cxcore, cvaux et highgui dans ce projet

    et j ai fait les includes et les links necessaires


    maintenant je ne sais pas comment integrer les codes pour que cela fonctionne

    merci d avance

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Ce petit bout de code (que j'avais mis juste au dessus) te permet de faire un affichage simple de ce que la caméra couleur peut voir.

    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
     /*VARIABLES GLOBALES*/
    Context g_context;
    DepthGenerator g_depth;
    ImageGenerator g_image;
    DepthMetaData g_depthMD;
    ImageMetaData g_imageMD;
     
     
    /*Debut de la fonction main*/
     
     
    /*
    INITIALISATION DES OBJETS OPENNI
    (ces objets me permettent par la suite de récupérer les données
    de la caméra)
    */
     
    //variable(s) pour test des erreurs
    XnStatus rc;
    //initialise le context
    rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH);
    CHECK_RC(rc, "initialisation du context\n");
    //initialise générateur de profondeur
    rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
    CHECK_RC(rc, "initialisation du générateur de profondeur\n");
    //initialise métadonnées de profondeur
    g_depth.GetMetaData(g_depthMD);
    //initialise générateur d'image
    rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
    CHECK_RC(rc, "initialisation du générateur d'image\n");
    //initialise métadonnées d'image
    g_image.GetMetaData(g_imageMD);
     
     
    //generation des donnees
    rc = g_context.StartGeneratingAll();
    CHECK_RC(rc, "generating all context\n");
     
     
     
    /* j'utilise pour le moment une boucle infinie pour l'affichage */
    while(true){
     
     
        //début du timer destiné à calculer le temps d'exécution
        double tt = (double)cvGetTickCount();
     
        //variables
        int nbColone = g_imageMD.XRes();
        int nbLigne = g_imageMD.YRes();
     
            //MODIFICATION : MISE A JOUR CORRECT DES DONNES
    	// lecture d'une nouvelle image
    	rc = g_context.WaitAnyUpdateAll();
    	CHECK_RC(rc, "Mise à jour de l'image\n");
    	g_image.GetMetaData(g_imageMD);
     
        //déclaration , alocation qui pointe sur les future pixels à afficher
        unsigned char* picture = new unsigned char[nbLigne * nbColone * 3];
     
        //initialisation avec les données récupérées
        memcpy(picture, (unsigned char*)g_imageMD.RGB24Data(),nbLigne * nbColone * 3);
     
        //bascule du sens du Rouge et du bleu pour avec le format RGB
        for(int i = 0 ; i < nbLigne * nbColone ; i++){
     
            unsigned char temp = picture[i*3];
            picture[i*3] = picture[i*3+2];
            picture[i*3+2] = temp;
     
        }
     
        //transfère dans une matrice puis affichage
        cv::Mat couleurMatRes(nbLigne, nbColone, CV_8UC3, picture);
        cv::imshow("Christophe",couleurMatRes);
     
        //attente d'une ms
        cvWaitKey(1);
     
        //libération de la mémoire couleur
        delete[] picture;
     
        //fin du timer et calcul du temps écoulé
        tt = (double)cvGetTickCount() - tt;
        cout << "Temps d'extraction : " << tt/(cvGetTickFrequency()*1000.) << "ms" << endl;
     
    }
    Dans cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            //MODIFICATION : MISE A JOUR CORRECT DES DONNES
    	// lecture d'une nouvelle image
    	rc = g_context.WaitAnyUpdateAll();
    	CHECK_RC(rc, "Mise à jour de l'image\n");
    	g_image.GetMetaData(g_imageMD);
    je me mets à jour les données en attendant des nouvelles données avec la méthode WaitAnyUpdateAll() du contexte puis en mettant à jour mon générateur d'image depuis ce contexte.

    (La variable rc et la méthode CHECK_RC sont utilisées pour tester une erreur de mise à jour, elle quitte le programme en cas d'erreur)

    Si tu veux également utiliser la profondeur il faudra que tu mettes à jour le générateur de profondeur depuis le contexte de la façon suivante.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            //MODIFICATION : MISE A JOUR CORRECT DES DONNES
    	// lecture d'une nouvelle image
    	rc = g_context.WaitAnyUpdateAll();
    	CHECK_RC(rc, "Mise à jour de l'image\n");
            //pour l'image : 
    	g_image.GetMetaData(g_imageMD);
            //pour la profondeur : 
            g_depth.GetMetaData(g_depthMD);

    Comme objet j'ai le contexte, deux générateurs (couleur et profondeur) et deux objets métadonnées qui dépendent de leur générateur. A l'initialisation les générateurs sont liés au contexte. Pour chaque nouvelle image tu mets à jour ton contexte puis les métadonnées. Tu les utilises par la suite pour faire tes traitements.

    Dans le code montré précédemment je mets à jours la couleur et utilise celle-ci par la suite pour en faire un affichage classique avec OpenCV.

    PS: Je m'excuse du décalage je n'ai pas beaucoup de temps.

    (PS²: sous réserve d'erreur)

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenCV
    Bonjour Christophe,

    merci pour ta réponse

    j'ai essayé tes codes mais ça marche pas

    car mon problème est comment mettre ensemble tout ceci pour que ça marche

    je dois créer un autre programme oubien

    oubien je dois mettre tout ceci dans le code de NiViewer oubien

    je comprends pas

    merci d'avance

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI et OpenCV
    Bonjour

    j ai pris le code que tu as linke appele je reprends tout

    j ai cree un nouveau projet j ai enleve la fonction main qu il genere automatiquement

    dans votre code je ne vois pas de fonction main

    j ai fait un include de stdafx.h

    et quand je compile j ai des erreurs de ce genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Error    1    error C2146: syntax error : missing ';' before identifier 'g_context'    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    7    Chris
    Error    2    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    7    Chris
    Error    3    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    7    Chris
    Error    4    error C2146: syntax error : missing ';' before identifier 'g_depth'    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    8    Chris
    Error    5    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    8    Chris
    Error    6    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    8    Chris
    Error    7    error C2146: syntax error : missing ';' before identifier 'g_image'    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    9    Chris
    Error    8    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    9    Chris
    Error    9    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    9    Chris
    Error    10    error C2146: syntax error : missing ';' before identifier 'g_depthMD'    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    10    Chris
    Error    11    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    10    Chris
    Error    12    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    10    Chris
    Error    13    error C2146: syntax error : missing ';' before identifier 'g_imageMD'    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    11    Chris
    Error    14    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\real_miti\documents\visual studio 2008\projects\chris\chris\chris.cpp    11    Chris
    y en a 57

    j attends votre reponse

    merci d avance

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut OpenNI et OpenCV
    Bonjour Christophe,

    peut etre que ces temps vous etes un peu pris

    mais une fois que vous serez connecte merci de me donner un coup de main pour les explications

    car je veux venir cette partie


    merci de votre comprehension

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Bonjour,

    Tout d'abord désolé pour le retard j'étais effectivement très pris.

    Le code précédemment montre comment utiliser la caméra, il ne suffit cependant pas de faire un copier coller.

    Ne voulant pas faire un lien vers la totalité de mon code (car d'autres choses sont effectuées) j'ai pris seulement les parties qui pouvaient être utiles.

    Normalement il suffit de mettre ce que j'ai mis en dessous de :
    en tant que variables de classe
    et le code que j'ai mis en dessous de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*Debut de la fonction main*/
    dans la fonction main de ton programme.

    Les erreurs que tu as sont dues à des oublis de ";" vérifie qu'il y en a un au bout de chaque ligne.

Discussions similaires

  1. [Débutant] ProgressBar: affichage trop lent
    Par peltiarn dans le forum VB.NET
    Réponses: 7
    Dernier message: 30/01/2014, 18h57
  2. Affichage trop lent de Compte(reg) après 1 filtre dans un formulaire
    Par Drarack dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/08/2008, 18h09
  3. Problème de requete trop lente , je cherche une alternative
    Par mobscene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/05/2007, 10h39
  4. [JDialog] Affichage trop lent.
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 26/07/2006, 15h04
  5. [Tsockets]Problème : trop lent !
    Par manu5794 dans le forum Delphi
    Réponses: 2
    Dernier message: 10/06/2006, 14h22

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