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