2017-01-05 11 views
2

C++ 코드에서 부스트 순환 버퍼 Mat을 사용하여 비디오 스트림을 처리하고 있습니다. 하나 개의 스레드는 Mat 개체를 밀어 :순환 버퍼가 <Mat>보다 적습니다.

void* capture(void* arg){ 
    boost::circular_buffer<Mat> cb(2000); 
    Mat frame; 
     while ((VideoCapture >> frame), !frame.empty()) { 
       pthread_mutex_lock(&mtx); 
       cb.push_back(frame); 
       pthread_mutex_unlock(&mtx); 
     } 
} 

다른 스레드 프로세스를하고 팝 :

void* process(void* arg){ 
    while (1){ 
     Mat frame; 
     pthread_mutex_lock(&mtx); 
     frame =cb.front(); 
     cb.pop_front(); 
     pthread_mutex_unlock(&mtx); 
     scan(frame);   
    } 
} 

은 그러나, 전체 버퍼, 비디오 스트림에 비해 지연이 없습니다. 버퍼 cb[1]의 첫 번째 (정면) 이미지와 버퍼가 가득 찼을 때 마지막 (뒷면) 이미지를 확인했으며 모두 동일하며 스트림에서 마지막으로 캡처 한 이미지와 동일합니다. 마치 버퍼가 마지막으로 캡처 한 이미지 만 보유하고 호출 된 슬롯에 대해 검색하는 것과 같습니다. 버퍼가 왜 모든 이미지를 저장하지 않는지에 대한 아이디어가 있습니까?

+0

OpenCV rigth를 사용하고 있습니까? – Rama

+0

['circular_buffer :: push_back'] (http://www.boost.org/doc/libs/1_63_0/doc/html/circular_buffer/implementation.html#circular_buffer.implementation.writing_to_a_full_buffer) 버퍼가있을 때 이전 데이터를 덮어 씁니다. 완전한. 제작자 스레드 인'capture'가 소비자 스레드 인'process'보다 빨리 푸시된다면 프레임을 잃을 것입니다. 버퍼가 꽉 찬 경우 자체를 스로틀하기 위해 제작자가 사용할 수있는 메커니즘을 구현해야합니다. –

+0

@SeanCline 네,하지만 버퍼의 처음과 마지막 프레임은 여전히 ​​달라야합니다. 나는 UHD 비디오 스트림을 사용하고 느린 처리로 버퍼를 의도적으로 채 웁니다. 일반적으로 버퍼는 비어 있습니다. – arvids

답변

1

Sean Cline 덕분에이 문제를 해결할 수있었습니다.

void* capture(void* arg){ 
    boost::circular_buffer<Mat> cb(2000); 
    Mat frame; 
     while ((VideoCapture >> frame), !frame.empty()) { 
       pthread_mutex_lock(&mtx); 
       cb.push_back(frame); 
       pthread_mutex_unlock(&mtx); 
     } 
} 

에 : 나는에서 내 캡처 스레드를 변경했다

void* capture(void* arg){ 
    boost::circular_buffer<Mat> cb(2000); 
    Mat frame; 
     while ((VideoCapture >> frame), !frame.empty()) { 
       Mat image; 
       frame.copyTo(image); 
       pthread_mutex_lock(&mtx); 
       cb.push_back(image); 
       pthread_mutex_unlock(&mtx); 
     } 
} 

버퍼에 밀려있는 Mat 객체가 같은 while 루프에 선언되도록. 루프 while의 조건에서 Mat 프레임이 사용되었으므로 copyTo()을 사용했습니다. 이렇게하면 Mat image의 모든 인스턴스가 하나의 인스턴스를 공유하는 대신 자체의 버퍼를 갖게됩니다.

+1

정확히 내가 필요한 것! 제한된 RAM 크기로 매력처럼 작동합니다. –