1

J'utilise une caméra BumbleBee 2 de Point Grey et leur SDK. J'ai cette boucle pour saisir les images consécutivement, mais ça ne marche pas. Il attrape la première image ok mais triclopsGetImage() ne semble pas mettre à jour le contenu de refImage (R | L) car les images montrées sont juste de la première image ... N'importe qui a de l'expérience avec les caméras Point Grey ou le triclops SDK ?Point Grey Research Triclops lit seulement 1 image

//There's more code above 

    int nframes = 20; 
    for (int frame = 0; frame < nframes ; frame++) { 

     te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR); 
     te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL); 

     cv::Mat leftIm(cv::Mat::zeros(refImageR.nrows,refImageR.ncols,CV_8UC1)); 
     cv::Mat rightIm(cv::Mat::zeros(refImageR.nrows,refImageR.ncols,CV_8UC1)); 
     int counter = 0; 
     for (int row=0;row<refImageR.nrows;row++) { 
      for (int col=0;col<refImageR.ncols;col++) { 
       leftIm.at<uchar>(row,col) = refImageL.data[counter]; 
       rightIm.at<uchar>(row,col) = refImageR.data[counter]; 
       counter++; 
      } 
     } 

     imshow("LeftIm",leftIm); 
     imshow("RightIm",rightIm); 

     cv::waitKey(1000); 
     cout << "frame = " << frame << endl; 
    } 

EDIT

Ok, ce n'est pas élégant en aucune façon, mais je pense que ça aide. Même en faisant cela, je ne reçois que le contenu de la première image. Je pense que cv :: Mat leftIm et rightIm gardent les données et ne sont pas mises à jour ou il y a quelque chose qui cloche avec les triclops.

TriclopsContext triclops; 

A partir du fichier d'en-tête, il dit « TriclopsContext est un pointeur vers une structure interne qui maintient toutes les informations de l'image et la tenue de livres nécessaires à la bibliothèque Triclops. Il est le conteneur pour tous les paramètres »

for (int frame = 1; frame < nframes ; frame++) { 

     if (frame == 1) { 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR1); 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL1); 
     } else if (frame == 2) { 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR2); 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL2); 
     } else if (frame == 3) { 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR3); 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL3); 
     } else if (frame == 4) { 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR4); 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL4); 
     } else if (frame == 5) { 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR5); 
      te = triclopsGetImage(triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL5); 
     } 

     cv::Mat leftIm(cv::Mat::zeros(refImageR1.nrows,refImageR1.ncols,CV_8UC1)); 
     cv::Mat rightIm(cv::Mat::zeros(refImageR1.nrows,refImageR1.ncols,CV_8UC1)); 
     int counter = 0; 
     for (int row=0;row<refImageR1.nrows;row++) { 
      for (int col=0;col<refImageR1.ncols;col++) { 
       //leftIm.at<uchar>(row,col) = refImageL.data[counter]; 
       //rightIm.at<uchar>(row,col) = refImageR.data[counter]; 
       if (frame == 1) { 
        leftIm.at<uchar>(row,col) = refImageL1.data[counter]; 
        rightIm.at<uchar>(row,col) = refImageR1.data[counter]; 
       } else if (frame == 2) { 
        leftIm.at<uchar>(row,col) = refImageL2.data[counter]; 
        rightIm.at<uchar>(row,col) = refImageR2.data[counter]; 
       } else if (frame == 3) { 
        leftIm.at<uchar>(row,col) = refImageL3.data[counter]; 
        rightIm.at<uchar>(row,col) = refImageR3.data[counter]; 
       } else if (frame == 4) { 
        leftIm.at<uchar>(row,col) = refImageL4.data[counter]; 
        rightIm.at<uchar>(row,col) = refImageR4.data[counter]; 
       } else if (frame == 5) { 
        leftIm.at<uchar>(row,col) = refImageL5.data[counter]; 
        rightIm.at<uchar>(row,col) = refImageR5.data[counter]; 
       } 

       counter++; 
      } 
     } 

     imshow("LeftIm",leftIm); 
     imshow("RightIm",rightIm); 

     cv::waitKey(1000); 
     cout << "frame = " << frame << endl; 
    } 
+0

Que renvoie 'triclopsGetImage'? –

+0

te retourné de triclopsGetImage signale un 0, indiquant que cela fonctionne bien. Drape une valeur non nulle pour une erreur. – Oliver9523

Répondre

1

Si vous regardez l'exemple dans le dossier SDK Triclops il montre leur programme appelant les méthodes suivantes avant d'obtenir l'image:

error = triclopsPreprocess(context, &inputData); 
error = triclopsStereo(context); 

Vous devrez peut-être les appeler à la fin de votre boucle pour indiquer à la caméra de calculer les disparités pour l'image suivante.