2011-03-23 5 views
7

Lorsque nous avons un IplImage, comment pouvons-nous l'enregistrer pour que nous puissions l'utiliser plus tard, ou l'afficher en tant qu'image en dehors de notre code (comme via png, ou jpeg)?Comment enregistrer une image IplImage?

Comme un exemple de code, je donne les résultats suivants:

void SaveImage() 
{ 
    CvSize size; 
    IplImage *rgb_img; 
    int i = 0; 

    size.height = HEIGHT; 
    size.width = WIDTH; 

    rgb_img = cvCreateImageHeader(size, IPL_DEPTH_8U, 3); 
    rgb_img->imageData = my_device.ColorBuffer; 
    rgb_img->imageDataOrigin = rgb_img->imageData; 

    /*for (i = 2; i < rgb_img->imageSize; i+= 3) 
    { 
     // confirming all values print correctly 
     printf("%d, ", rgb_img->imageData[i]); 
    }*/ 

    cvSaveImage("foo.png",rgb_img); 
} 

J'imprimé toutes les valeurs dans la boucle en commentaire, et il semble que les données dans la mémoire tampon correctement. L'utilisation de cvShowImage pour afficher l'image fonctionne également correctement, il semble donc que la structure de l'image est correcte.

+0

Si vous avez une image à 3 canaux (IPL_DEPTH_8U, 3), comment est-ce que l'impression du premier canal comme dans votre boucle for vous montre toutes les valeurs dans votre tampon? –

+0

C'est un bon point. Je faisais des tests pour m'assurer que l'affectation rgb_img-> imageData n'échouait pas. – vapo

+0

Cependant, maintenant que vous l'avez mentionné, il y a plusieurs valeurs négatives dans l'imageData. Cela ne semble pas possible. Aucune des valeurs dans ColorBuffer sont négatives (je viens de cocher) – vapo

Répondre

5
void SaveImage() 
{ 
    CvSize size; 
    IplImage *rgb_img; 
    int i = 0; 

    size.height = HEIGHT; 
    size.width = WIDTH; 

    rgb_img = cvCreateImageHeader(size, IPL_DEPTH_8U, 3); 
    rgb_img->imageData = my_device.ColorBuffer; 

    // You should NOT have the line below or OpenCV will try to deallocate your data 
    //rgb_img->imageDataOrigin = rgb_img->imageData; 

    for (i = 0; i < size.height; i++) 
    { 
     for (j = 0;j < size.width; j++) 
     { 
     // confirming all values print correctly 
     printf("%c, ", rgb_img->imageData[i*width + j]); 
     } 
    } 

    cvSaveImage("foo.png",rgb_img); 
} 

En cours d'exécution, cela ne devrait pas planter.

Quelques problèmes avec votre code

  • Vous utilisez% f pour imprimer mais IPL_DEPTH_8U est 1 octet uchar
+0

Est-ce que cela fonctionne avec IplImage * au lieu d'un CvArr *? J'ai essayé ceci, en réglant le nom de fichier à "foo.png" et cela a donné une violation de mémoire. – vapo

+0

Bien sûr que oui. CvArr * signifie IplImage * ou CvMat *. Puisque vous obtenez une erreur de violation de mémoire, vous devriez mettre plus de code dans votre message. Vous devez avoir fait une erreur en manipulant l'image. –

+0

Je vais mettre à jour immédiatement. Merci. – vapo

1

Pour enregistrer:

cvSaveImage(outFileName,img) 

Si vous voulez vérifier avait enregistré, vous pourriez faire ce qui suit:

if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n",outFileName); 

Extrait de http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00052000000000000000 - le meilleur résultat sur Google pour «opencv write iplimage».

+0

Cela ne semble pas fonctionner. J'ai vérifié ce site à l'avance. Il me donne une violation d'accès à la mémoire. "Violation d'accès lecture emplacement 0x00000280." – vapo

Questions connexes