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]
의 첫 번째 (정면) 이미지와 버퍼가 가득 찼을 때 마지막 (뒷면) 이미지를 확인했으며 모두 동일하며 스트림에서 마지막으로 캡처 한 이미지와 동일합니다. 마치 버퍼가 마지막으로 캡처 한 이미지 만 보유하고 호출 된 슬롯에 대해 검색하는 것과 같습니다. 버퍼가 왜 모든 이미지를 저장하지 않는지에 대한 아이디어가 있습니까?
OpenCV rigth를 사용하고 있습니까? – Rama
['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'보다 빨리 푸시된다면 프레임을 잃을 것입니다. 버퍼가 꽉 찬 경우 자체를 스로틀하기 위해 제작자가 사용할 수있는 메커니즘을 구현해야합니다. –
@SeanCline 네,하지만 버퍼의 처음과 마지막 프레임은 여전히 달라야합니다. 나는 UHD 비디오 스트림을 사용하고 느린 처리로 버퍼를 의도적으로 채 웁니다. 일반적으로 버퍼는 비어 있습니다. – arvids