Perte du "contenu" d'une image
Bonsoir!
Dans le cadre de mon travail de fin d'études, je suis amené à utiliser la librairie OpenCV.
Mais j'ai un petit souci, probablement du au fait que je ne fait jamais de C++ d'habitude...
J'ai une classe ImageCapture qui me permet de récuperer les images de ma caméra (ou d'une séquence vidéo), et je lui ai fait une méthode pour copier l'image (un pointeur sur IplImage), mais j'ai un souci, je récupère un pointeur pourtant non nul, mais il ne pointe pas sur mon image pour autant. Si je l'évalue dans la méthode qui me la renvoie, elle est affichable, alors pourquoi pas plus loin?
Alors n'étant pas sur si mon problème concerene de OpenCV ou C++, je poste ici.
Merci d'avance de vos réponses
Voici le code (un peu épuré) de ce que j'ai.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| //////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// Main.cpp ////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#include <cassert>
#include <iostream>
#include <OpenCV/OpenCV.h>
#include <ImageCapture.h>
using namespace ImageCaptureNS;
const char * WINDOW_NAME = "Cam View";
int main (int argc, char * const argv[])
{
ImageCapture *imageCapture;
IplImage * display;
//Display window
cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);
imageCapture = new ImageCapture;
//Loop on every key pressed and exit on 'q' pressed
while (cvWaitKey () != 'q')
{
//Asks for a pic
imageCapture->getImage(display);
//Display it
if (!display) return 1;
cvShowImage (WINDOW_NAME, display);
}
//Free mem and close window
cvReleaseImage( &display );
cvDestroyWindow( WINDOW_NAME);
//No error
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| //////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// ImageCapture.h /////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#include <OpenCV/OpenCV.h>
namespace ImageCaptureNS {
class ImageCapture
{
public:
//Constructor
ImageCapture();
//Gets an image from the source (camera, video clip, ...)
void getImage(IplImage* dest);
//Destructor
virtual ~ImageCapture();
};
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| //////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// ImageCapture.cpp ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#include "ImageCapture.h"
#include <OpenCV/OpenCV.h>
#include <cassert>
#include <iostream>
namespace ImageCaptureNS
{
CvCapture * source;
IplImage * current_frame;
IplImage * draw_image;
ImageCapture::ImageCapture()
{
//Source
source = cvCreateCameraCapture (CV_CAP_ANY);
//Test for a source
if (! source)
abort ();
//Get an image for dimension initialization
current_frame = cvQueryFrame (source);
draw_image = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 3);
assert (current_frame && draw_image);
}
//Save current frame to the dest parameter
void ImageCapture::getImage(IplImage* dest)
{
//Ask for a new image
current_frame = cvQueryFrame (source);
// draw image
dest = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 3);
cvFlip(current_frame, dest, 1);
assert(dest);
}
ImageCapture::~ImageCapture()
{
cvReleaseImage(¤t_frame);
cvReleaseImage(&draw_image);
cvReleaseCapture(&source);
}
} |