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(¤t_frame); cvReleaseImage(&draw_image); cvReleaseCapture(&source); } }
Partager