C + OpenCV: IplImage avec tampon circulaire

J’essaye d’implémenter un tampon circulaire pour l’utiliser comme un tampon de trame avec OpenCV (en utilisant C).

J’ai volé sans vergogne la mise en œuvre du tampon circulaire de ce billet pour ne pas avoir à réinventer la roue:

EDIT: OK, alors j’ai redéfini certaines choses. À savoir j’ai implémenté mon propre tampon circulaire. Maintenant, je reçois des erreurs qui n’ont pas de sens.

Voici l’implémentation du tampon circulaire que j’utilise:

#define BUFFER_SIZE 100 typedef struct { IplImage* queue[BUFFER_SIZE]; IplImage *in; IplImage *out; int num_frames; int in_ctr; int out_ctr; int update_flag; } frame_buffer; 

Voici la fonction get:

 IplImage* buff_get() { IplImage* nextfr; if(frbuff.num_frames == 0) { return NULL; } nextfr = frbuff.out++; if(++frbuff.out_ctr == BUFFER_SIZE) { frbuff.out = &frbuff.queue[0]; frbuff.out_ctr = 0; } --frbuff.num_frames; return nextfr; } 

Voici la fonction put:

 int buff_put(IplImage* nextfr) { if(++frbuff.num_frames > BUFFER_SIZE) { return 0; } frbuff.in++; frbuff.in = nextfr; if(++frbuff.in_ctr == BUFFER_SIZE) { frbuff.in = &frbuff.queue[0]; frbuff.in_ctr = 0; } return 1; } 

Tout semble aller bien. Des frameworks apparaissent sur le tampon, ce que je sais car je peux imprimer la taille. Mais tout va mal quand j’essaie de montrer l’image qui est sur le tampon.

Si j’essaie alors de faire ceci:

 IplImage* curr_frame = cvCreateImage(cvSize(640,480),8,3); cvNamedWindow("proc_window",CV_WINDOW_AUTOSIZE); cvShowImage("proc_window",curr_frame); while(1) { if(buff_size() > 0) { if(buff_flag_check()) curr_frame = buff_get(); if(curr_frame != NULL) { cvShowImage("proc_window",curr_frame); } } 

Je reçois l’erreur suivante en appelant cvShowImage ():

 OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /home/fagg/src/OpenCV-2.3.1/modules/core/src/array.cpp, line 2482 terminate called after throwing an instance of 'cv::Exception' what(): /home/fagg/src/OpenCV-2.3.1/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat 

Je suis assez confus quant à ce qui se passe ici. Espérons que quelqu’un avec des yeux plus frais que moi puisse voir ce qui se passe …

Le fragment de code que vous avez fourni ne sera pas compilé car cb_init () prend un pointeur sur un circular_buffer comme premier argument.

et si vous obtenez une erreur de segmentation dans cb_init (), c’est parce que malloc () ne parvient pas à renvoyer la taille demandée et que l’implémentation dans le lien ne gère pas les erreurs.

 void cb_init(circular_buffer *cb, size_t capacity, size_t sz) { cb->buffer = malloc(capacity * sz); if(cb->buffer == NULL) // handle error cb->buffer_end = (char *)cb->buffer + capacity * sz;//segfault when using cb->buffer which is null in case of malloc() failure cb->capacity = capacity; cb->count = 0; cb->sz = sz; cb->head = cb->buffer; cb->tail = cb->buffer; }