几天来,我一直在努力尝试让循环缓冲区工作,但由于某种原因它只是不打球。我正在用 C 而不是 C++ 编写程序。
我正在尝试在一个线程中缓冲来自相机的图像,以便可以在另一个线程中读取和处理它(我知道如何使用 pthread_mutex_* 进行资源锁定)。到目前为止,我已将缓冲区图像管理到我的缓冲区中,但在检索它们时遇到了问题。这是我的循环缓冲区实现:
#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;
static frame_buffer frbuff;
void buff_init()
{
frbuff.in = &frbuff.queue[0];
frbuff.out = &frbuff.queue[0];
frbuff.num_frames = 0;
frbuff.in_ctr = 0;
frbuff.out_ctr = 0;
frbuff.update_flag = 0;
}
int buff_size()
{
return frbuff.num_frames;
}
int buff_flag_check()
{
return frbuff.update_flag;
}
void buff_flag_set()
{
frbuff.update_flag = 1;
}
void buff_flag_clr()
{
frbuff.update_flag = 0;
}
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;
buff_flag_clr();
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;
}
buff_flag_set();
return 1;
}
我可以 buff_put() 就好了,这似乎工作,因为我看到计数器增加。当我 buff_get() 时,我也得到了一些不为空的东西。当我尝试用它做任何事情时,问题就来了:
IplImage **some_image;
some_image = buff_get();
cvShowImage("some_window_somewhere",some_image);
好吧,显然它对此不满意......
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
我也试过这个(导致分段错误):
cvShowImage("some_window_somewhere",*some_image);
我非常卡住,已经尝试了我能想到的一切。毫无疑问,它最终会变得很明显(我讨厌指针)。任何帮助将不胜感激。