【问题标题】:C + OpenCV: IplImage with circular bufferC + OpenCV:带有循环缓冲区的 IplImage
【发布时间】:2012-03-17 01:07:56
【问题描述】:

我正在尝试使用 OpenCV(使用 C)实现一个循环缓冲区,用作帧缓冲区。

我无耻地从这篇文章中窃取了循环缓冲区的实现,以节省重新发明轮子:

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

这是我正在使用的循环缓冲区实现:

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

这里是 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;
}

似乎一切正常。帧出现在缓冲区上,我知道这是因为我可以打印出尺寸。但是当我尝试显示缓冲区上的图像时,一切都变糟了。

如果我再尝试这样做:

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

我对这里发生的事情感到很困惑。希望比我更新鲜的人能看到发生了什么......

【问题讨论】:

    标签: c opencv


    【解决方案1】:

    您提供的代码的 sn-p 不会编译,因为 cb_init() 将指向循环缓冲区的指针作为第一个参数。

    如果您在 cb_init() 中遇到段错误,那是因为 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;
    }
    

    【讨论】:

    • 但它确实可以编译...那么这是怎么回事?
    • 我已经更新了我的问题...我无法弄清楚发生了什么,所以我从头开始,但现在我遇到了我似乎无法追踪的类型问题.
    • 在您的结构中,我看到了指向 IplImages IplImage* queue[BUFFER_SIZE]; 的指针数组你初始化所有这些图像吗?我的意思是,如果您自己创建它们还是从某个地方获取它们?如果它们没有正确初始化,您可能会遇到分配问题,这可能导致 cvGetMat() 中的错误
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多