Sauvegarder une image dans OpenCV

Je suis nouveau à OpenCV, et j'essaie de capturer une image, puis de la sauvegarder dans un fichier. Je poste le code de votre référence, ci-dessous.

le fichier jpg est sauvegardé, mais il est noir.

// Capture the Image from the webcam
CvCapture *pCapturedImage = cvCreateCameraCapture(0);

// Get the frame
IplImage *pSaveImg = cvQueryFrame(pCapturedImage);

// Save the frame into a file
cvSaveImage("test.jpg". ,pSaveImg); // A JPG FILE IS BEING SAVED
                                    // OF 6KB , BUT IT IS BLACK

toutes les fonctions sont réussies. J'ai essayé le code ci - dessus à la fois dans XP et Vista-le résultat est une image noire sur les deux. S'il vous plaît laissez-moi savoir ce que je suis absent.

24
demandé sur Sujay Ghosh 2009-05-12 12:07:57
la source

15 ответов

si vous utilisez C++, il est préférable de utiliser l'interface c++:

using namespace cv;
// Capture the Image from the webcam
VideoCapture cap(0);

// Get the frame
Mat save_img; cap >> save_img;

if(save_img.empty())
{
  std::cerr << "Something is wrong with the webcam, could not get frame." << std::endl;
}
// Save the frame into a file
imwrite("test.jpg", save_img); // A JPG FILE IS BEING SAVED
19
répondu Barnabas Szabolcs 2012-12-04 22:21:09
la source

parfois le premier appel à cvQueryFrame () renvoie une image vide. À essayer:

IplImage *pSaveImg = cvQueryFrame(pCapturedImage);
pSaveImg = cvQueryFrame(pCapturedImage);

Si cela ne fonctionne pas, essayez de sélectionner un périphérique de capture automatiquement:

CvCapture *pCapturedImage = cvCreateCameraCapture(-1);

Ou vous pouvez essayer de sélectionner d'autres périphériques de capture où n=1,2,3...

CvCapture *pCapturedImage = cvCreateCameraCapture(n);

PS: je crois aussi qu'il y a un malentendu au sujet de l'image capturée en regardant votre nom de variable. La variable pCapturedImage n'est pas une Image, c'est une Capture. Vous pouvez toujours "lire" une image à partir capturer.

5
répondu nimcap 2009-05-13 01:22:30
la source

D'après mon expérience OpenCV écrit une image noire quand SaveImage est donné une matrice avec une profondeur de bits différente de 8 bits. En fait, cela est en quelque sorte documenté:

Seulement 8 bits mono-canal ou 3 canaux (avec l'ordre de canal "BGR") les images peuvent être sauvegardé en utilisant cette fonction. Si l' le format, la profondeur ou l'ordre de canal est différente, utilisez cvCvtScale et cvCvtColor convertir en avant l'enregistrement ou l'utilisation universelle cvSave pour enregistrez L'image en XML ou en YAML format.

dans votre cas, vous pouvez d'abord examiner quel type d'image est capturé, changer les propriétés de capture (je suppose CV_CAP_PROP_CONVERT_RGB peut être important) ou le convertir manuellement par la suite.

Ceci est un exemple pour convertir en représentation 8 bits avec OpenCV. cc voici une matrice originale de type CV_32FC1,cc8u est sa version scalée qui est en fait écrite par SaveImage:

# I want to save cc here
cc8u = CreateMat(cc.rows, cc.cols, CV_8U)
ccmin,ccmax,minij,maxij = MinMaxLoc(cc)
ccscale, ccshift = 255.0/(ccmax-ccmin), -ccmin
CvtScale(cc, cc8u, ccscale, ccshift)
SaveImage("cc.png", cc8u)

(désolé, c'est le code Python, mais il devrait être facile à traduire en C / C++)

5
répondu sastanin 2011-02-22 15:25:58
la source

désolé si cela est trop évident. Êtes-vous sûr que la webcam est correctement vu et détecté par OpenCV en d'autres termes, obtenez-vous une image lorsque vous redirigez le cadre capturé vers une fenêtre "highGui"? Par exemple comme ceci:

 frame = cvQueryFrame( capture );
 cvNamedWindow( "myWindow", CV_WINDOW_AUTOSIZE );
 cvShowImage( "myWindow", frame );
3
répondu david h 2009-05-14 02:28:10
la source

je connais le problème! Vous venez de mettre un point après "test.jpg"!

cvSaveImage("test.jpg". ,pSaveImg);

j'ai peut-être tort, mais je pense que ce n'est pas bon!

3
répondu lf. 2010-04-19 01:50:45
la source

j'ai eu le même problème avec ma WebCam Microsoft. J'ai regardé dans la boîte à outils d'acquisition d'images de Matlab et j'ai trouvé que la résolution maximale supportée est 640*480.

je viens de changer le code dans openCV et ajouté

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 352); 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 288);

avant la fonction cvQueryFrame qui était la prochaine résolution supportée et changée, sauta quelques images initiales avant de sauvegarder l'image et finalement la faire fonctionner.

je partage mon Code de travail

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 



using namespace cv;
using namespace std;

int main() 
{
CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 352); 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 288)


 // Get one frame
IplImage* frame;

for (int i = 0; i < 25; i++) 
{
frame = cvQueryFrame( capture );
}


printf( "Image captured \n" );  
//IplImage* RGB_frame = frame;
//cvCvtColor(frame,RGB_frame,CV_YCrCb2BGR);
//cvWaitKey(1000);
cvSaveImage("test.jpg" ,frame);
//cvSaveImage("cam.jpg" ,RGB_frame);

printf( "Image Saved \n" );

//cvWaitKey(10);

// Release the capture device housekeeping
cvReleaseCapture( &capture );
//cvDestroyWindow( "mywindow" );
return 0;
}

j'utilise le code suivant pour capturer des images:

CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
if(!capture) error((char*)"No Capture");
IplImage *img=cvQueryFrame(capture);

je sais que cela fonctionne pour vous

1
répondu Yogi 2009-05-14 02:16:14
la source

je vous suggère d'exécuter OpenCV sanity check

C'est une série de petits exécutables situés dans le répertoire bin d'opencv.

Il va vérifier si votre appareil est ok

1
répondu Eric 2009-07-07 19:42:06
la source

Désolé de faire remonter un vieux post, mais j'ai voulu donner une autre réponse pour quelqu'un qui vient à travers ce fil.

j'ai eu le même problème. Peu importe ce que j'ai fait, l'image semblait complètement noire. J'ai essayé de faire plusieurs appels consécutifs à cvQueryFrame et j'ai remarqué que lorsque j'en faisais 5 ou plus, je pouvais voir l'image. Alors j'ai commencé à retirer les appels un par un pour voir où était le "point de rupture". Ce que j'ai fini par trouver, c'est que l'image s'est assombrie et plus sombre que j'ai enlevé chaque appel. Faire juste un seul appel a fourni une image qui était presque complètement noire, mais si je regarde de très près, je pourrais distinguer mon image.

j'ai essayé 10 appels consécutifs pour tester ma théorie, et bien sûr, on m'a donné une image très claire, considérant que je suis dans une pièce faiblement éclairée. Heureusement, c'était le même problème que vous rencontrez.

Je ne sais pas grand chose sur l'imagerie, mais il semble que plusieurs appels consécutifs à cvQueryFrame augmente la durée d'exposition de l'appareil photo. Cela résout définitivement le problème, bien qu'il ne semble pas être la solution la plus élégante. Je vais voir si je peux trouver un paramètre qui va augmenter l'exposition, ou peut-être quelques autres paramètre qui va égayer mes images.

Bonne chance!

1
répondu SayntLewis 2011-03-18 02:31:58
la source

SayntLewis a raison. Lorsque vous activez la caméra avec cvCaptureFromCAM, la balance des blancs n'est pas encore ajustée (c'est un processus lent), de sorte que vous pouvez obtenir un blanc ou un noir (dépend de la caméra et de vos conditions de foudre) sur les premières images. La même chose se produit quand il ya un changement soudain de la foudre de la scène. Attendez juste un peu après avoir ouvert la caméra, videz la mémoire tampon et vous êtes prêt à partir.

1
répondu Vitor 2011-06-20 22:51:43
la source

J'ai eu le même problème sur Windows Vista, j'ai juste ajouté ce code avant cvQueryFrame:

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 720);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
1
répondu jmp4281 2012-07-01 15:14:41
la source

D'après mes expériences les premières images qui sont capturées en utilisant:

frame = cvQueryFrame( capture );

tendance à être vide. Vous pouvez attendre un peu(environ 3 secondes) et essayer de capturer l'image.

0
répondu Nexus 2009-07-04 11:54:51
la source

je pense, caméra tout simplement pas initialiser dans la première image. Essayez de sauvegarder l'image après 10 images.

0
répondu chronos 2010-05-15 15:10:54
la source

sur OSX, enregistrer des cadres vidéo et des images fixes ne fonctionnait que pour moi quand j'ai donné un chemin complet vers cvSaveImage:

cvSaveImage("/Users/nicc/image.jpg",img);
0
répondu nicc 2011-04-25 13:15:18
la source

espérons que cela sauvera des images de votre webcam

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
   VideoCapture cap(0);

   Mat save_img;

   cap >> save_img;

   char Esc = 0;

   while (Esc != 27 && cap.isOpened()) {        
    bool Frame = cap.read(save_img);        
    if (!Frame || save_img.empty()) {       
        cout << "error: frame not read from webcam\n";      
        break;                                              
    }
    namedWindow("save_img", CV_WINDOW_NORMAL);  
    imshow("imgOriginal", save_img);            
    Esc = waitKey(1);
}
imwrite("test.jpg",save_img); 
}
0
répondu Haris Hussain 2017-01-26 18:49:58
la source

Autres questions sur