Что вы можете сделать, это использовать библиотеку Boost в сочетании с параллельной очередью. Здесь вы можете найти параллельную очередь , которую я сделал, работая вместе с Boost Threading и OpenCV.
Чтобы использовать параллельную очередь с OpenCV, вы можете сделать что-то вроде этого:
boost::thread_group frame_workers;
concurrent_queue<IplImage* > frame_queue(&frame_workers);
boost::thread * frame_thread = new boost::thread(frame_grabber, &frame_queue);
boost::thread * marker_thread = new boost::thread(marker_handler, &frame_queue);
frame_workers.add_thread(frame_thread);
frame_workers.add_thread(marker_thread);
В функции frame_grabber вы можете захватывать кадры и вставлять их в frame_queue. При этом marker_thread уведомляется о том, что в очереди находится кадр (с wait_and_pop). Короткий пример для захватывающей части может быть примерно таким:
void frame_grabber(concurrent_queue<IplImage* > * frame_queue) {
frame = cvQueryFrame(input_video);
frame_copy = cvCreateImage(cvGetSize(frame), 8, 3);
cvCopy(frame, frame_copy);
frame_queue->push(frame);
}