2012-03-16 23 views
0

OpenCVでフレームバッファとして使用する循環バッファを実装しようとしています(Cを使用)。C + OpenCV:循環バッファ付きIplImage

私は臆面もなく車輪の再発明保存するには、この記事から循環バッファの実装を盗まれました:

EDIT:OK、私はいくつかのことを再定義しました。すなわち私自身の循環バッファーを実装しました。今、私は意味をなさないエラーを受けています。ここで

は、私が使用している循環バッファの実装です:ここで

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

すべてがそうですOKに行く。私はサイズを印刷することができますので、私が知っているバッファは、フレームが表示されます。しかし、バッファにあるイメージを表示しようとすると、すべてがうまくいかなくなります。

私はこれをしようとした場合

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

+0

私の質問を更新しました...何が起こっているのか分からないので、最初から始めましたが、今は追跡できないタイプの問題があります。 – NOP

+1

あなたの構造体では、IplImages IplImage *キュー[BUFFER_SIZE]へのポインタの配列を参照してください。これらの画像をすべて初期化しますか?私はあなたがそれらを自分で作成するか、どこかからそれらを得るかどうか? cvGetMat()でエラーが発生する可能性のある、適切に初期化されていないと、割り当て問題が発生する可能性があります。 – snugglo