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 :roll:).
Voici le code que j'utilise :
Code:
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