2015-09-24 2 views
0

J'utilise la caméra PS3 avec opencv cela fonctionne avec le type de données PByte.Gives PByte comme résultat de trame.Dans les exemples de SDK ils utilisent IplImage.Je veux utiliser Mat à la place IplImage.But je ne peux pas convertir PByte en Mat. Comment puis-je convertir PByte en Mat? Exemple Dans SDKConvertir PByte en Mat OpenCV

 IplImage *pCapImage; 
    PBYTE pCapBuffer = NULL; 
    cvGetImageRawData(pCapImage, &pCapBuffer); 
    while(_running) 
     { 
      cvGetImageRawData(pCapImage, &pCapBuffer); 
      CLEyeCameraGetFrame(_cam, pCapBuffer, (i==0)?2000:0); 
} 
//Function from SDK 

IMPORT(bool) CLEyeCameraGetFrame(CLEyeCameraInstance cam, PBYTE pData, int waitTimeout = 2000); 

// MyCode // J'utilise 2 caméras.

cv::Mat pCapImage[2]; 
    PBYTE pCapBuffer = NULL; 
    while(_running){ 

     for (int i = 0; i < 2; i++) 
       { 
            //trying convert 
        pCapImage[i] = cv::Mat (cvSize(w, h), 4, &pCapBuffer,IPL_DEPTH_8U).clone(); 

        CLEyeCameraGetFrame(_cam[i], pCapBuffer); 
       } 

       Mat pCapImageMatL = pCapImage[0]; 
       Mat pCapImageMatR = pCapImage[1]; 
       imshow(_windowNameL, pCapImageMatL); 
       imshow(_windowNameR, pCapImageMatR); 
} 

Répondre

1

Étant donné que vous avez converti avec succès PBYTE-IplImage *, vous pouvez continuer à le convertir en cv::Mat comme suit:

IplImage *pCapImage; // this is the IplImage * that you have converted from PBYTE 
cv::Mat pCapImageMat(pCapImage); 
cvReleaseImage(&pCapImage); // free the previous memory 
+0

puis-je faire cela sans l'aide pCapImage. Je veux juste pCapBuffer à Mat directement. Parce que dans la documentation, je vois IplImage besoin de gestion de la mémoire manuel. – user1924375

+0

@ user1924375 Ensuite, libérez juste la mémoire précédente. C'est facile. Veuillez vérifier la réponse mise à jour. – herohuyongtao

1

Si vous utilisez OpenCV 3, IPlImage a été désapprouvée. Donc, la réponse @herohuyongtao ne fonctionnera pas.

Dans ce cas, la solution de contournement est

cv::Mat frame; 
frame = cv::cvarrToMat(pCapImage); 
+0

puis-je faire cela sans utiliser pCapImage. Je veux juste pCapBuffer à Mat directement. Parce que dans la documentation, je vois IplImage besoin de gestion de la mémoire manuel. – user1924375