Bonjour à tous,
J'ai écrit un petit programme basique qui permet de capturer des images provenant de la webcam et de les enregistrer dans un fichier vidéo. Ce programme devait me permettre de saisir une image lorsque j'appuie sur une touche et de l'ajouter à ma vidéo (stop motion). J'ai remarqué qu'il y a un décalage de 5 images entre l'appuie sur la touche et l'image qui se présente réellement à la webcam. En d'autre terme, si je veux obtenir la bonne image, il me faut appeler 5 fois cvGrabFrame() avant d'appeler cvRetrieveFrame()... Je me rends alors compte que je ne comprend pas vraiment ce que font ces fonctions. cvGrabFrame() demande une image à la webcam mais celle-ci semble en produire 5 par défault. Comment puis-je remédier au problème sachant que ce problème ne se produit certainement pas sur toutes les machines?

Voici le code associé:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
//******************************************************************************
 
//**************  INITIALISATION ***********************************************
 
//******************************************************************************
    const char* window_title = "Titre";	
 
    char key = 'a';
 
    CvSize size_video;
 
 
 
    IplImage *img = NULL;
 
    IplImage *img_temp = NULL;
 
 
 
    CvCapture* capture = cvCaptureFromCAM(0);
 
    if(!capture )return 10;
 
    if(!cvGrabFrame(capture))return 20;
 
    img = cvRetrieveFrame(capture);
 
 
 
    size_video.width = img->width;
 
    size_video.height = img->height;
 
 
 
    CvVideoWriter* writer = cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'), 25, size_video, 1 );
 
 
 
    cvNamedWindow (window_title, CV_WINDOW_AUTOSIZE);
 
    cvShowImage (window_title, img);
 
 
 
    printf("\nCapture de la webcam:\nlargeur: %f\nhauteur:%f\n",cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
 
 
 
//******************************************************************************
 
//**************  BOUCLE PRINCIPALE ********************************************
 
//****************************************************************************** 
 
 
 
while(key != 'q')
 
{  
 
  for(int i=0; i<5; i++) //Problème de quintuplets d'images mises en mémoires
 
{
 
      if(!cvGrabFrame(capture))return 20;
 
}
 
img = cvRetrieveFrame(capture);
 
cvShowImage(window_title, img);
 
cvWriteFrame(writer, img);
 
 
 
 
 
key = cvWaitKey(0);
 
}
 
//******************************************************************************
 
//**************  DESALLOCATIONS ***********************************************
 
//******************************************************************************
 
    cvDestroyAllWindows();
 
    cvReleaseVideoWriter( &writer );
 
 
 
    cvReleaseCapture(&capture);
 
    cvReleaseImage(&img);
 
    cvReleaseImage(&img_temp);