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

15 réponses

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 18:21:09

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-12 21:22:30

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 12:25:58

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-13 22:28:10

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-18 21:50:45

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;
}