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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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(&current_frame);
      cvReleaseImage(&draw_image);
      cvReleaseCapture(&source);
	}
 
}