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
我,什么是怎么回事相当混乱。希望有人比我更清新的眼睛可以看到发生了什么...
但它绝对编译虽然...所以这是怎么回事? – NOP 2012-03-16 07:24:13
我更新了我的问题......我无法弄清楚发生了什么,所以我从头开始,但现在我遇到了类似的问题,我似乎无法追查。 – NOP 2012-03-16 17:08:35
在你的结构中,我看到指向IplImage的指针数组IplImage * queue [BUFFER_SIZE];你是否初始化所有这些图像?我的意思是,如果你自己创造它们或从某处获得它们?如果未正确初始化可能会导致cvGetMat()中的错误,那么您可能会遇到分配问题 – snugglo 2012-03-19 19:37:28