2012-03-16 59 views
0

我试图实现一个循环缓冲区,用作OpenCV(使用C)的帧缓冲区。C + OpenCV:使用循环缓冲区的IplImage

我无耻地窃取从这个职位的循环缓冲区实现节省重新发明轮子:

编辑:好的,所以我已经重新定义了一些东西。即我实现了我自己的循环缓冲区。现在我收到了一些没有意义的错误。

这里是我使用的循环缓冲区执行:

#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; 

下面是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; 
} 

这里是放功能:

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; 
} 

一切似乎好的。帧出现在缓冲区中,我知道是因为我可以打印大小。但是,当我尝试显示缓冲区中的图像时,它会变得很糟糕。

如果我再试着这样做:

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); 
     } 

} 

我在调用时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 

我,什么是怎么回事相当混乱。希望有人比我更清新的眼睛可以看到发生了什么...

回答

0

你提供的代码片段不会编译,因为cb_init()需要一个指向circular_buffer的指针作为第一个参数。

如果你在cb_init()中得到segfault,那是因为malloc()无法返回请求的大小,并且链接中的实现不能处理错误。

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; 
} 
+0

但它绝对编译虽然...所以这是怎么回事? – NOP 2012-03-16 07:24:13

+0

我更新了我的问题......我无法弄清楚发生了什么,所以我从头开始,但现在我遇到了类似的问题,我似乎无法追查。 – NOP 2012-03-16 17:08:35

+1

在你的结构中,我看到指向IplImage的指针数组IplImage * queue [BUFFER_SIZE];你是否初始化所有这些图像?我的意思是,如果你自己创造它们或从某处获得它们?如果未正确初始化可能会导致cvGetMat()中的错误,那么您可能会遇到分配问题 – snugglo 2012-03-19 19:37:28