2012-03-16 3 views
0

OpenCV에서 프레임 버퍼로 사용할 원형 버퍼를 구현하려고합니다 (C 사용).C + OpenCV : 원형 버퍼가있는 IplImage

편집 :

나는 뻔뻔하게 바퀴를 개혁 저장이 게시물에서 순환 버퍼 구현 도난했습니다 확인을, 그래서 나는 몇 가지를 재정의했습니다. 즉, 내 자신의 원형 버퍼를 구현했습니다. 이제는 말이 안되는 오류가 발생합니다.

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

는 풋 기능입니다 : 여기
#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* 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 * queue [BUFFER_SIZE]; 그 모든 이미지를 초기화합니까? 내 말은, 만약 당신이 직접 만들거나 어딘가에서 얻을 수 있다면? cvGetMat()에서 오류가 발생할 수있는 제대로 초기화되지 않은 경우 할당 문제가있을 수 있습니다. – snugglo

관련 문제