2012-02-27 4 views
3

Я пытаюсь реализовать круговой буфер для своей программы. Буфер используется для обмена данными между двумя потоками, как показано ниже. Я использую OpenCV для захвата видеокадров с камеры (Thread 1). Затем я хотел бы сохранить эти данные в круговом буфере, так что Thread 2 может получить данные из буфера.Как реализовать круговой буфер объектов cv :: Mat (OpenCV)?

enter image description here

Как реализовать кольцевой буфер для сорта :: объекты Mat в C++? Я знаю, как создать круговой буфер для стандартных объектов C++ (например, integer или char), но я не могу заставить его работать с объектами типа cv :: Mat. Какие-либо предложения?

+2

Какие трудности вы имея с ЦВ :: Mat часть проблемы? Как этот тип данных изменяет задачу записи кругового буфера? –

+0

@RobKennedy Я включил код, с которым у меня проблемы. Я использовал http://en.wikipedia.org/wiki/Circular_buffer в качестве примера и модифицировал его для хранения данных типа cv :: Mat (вместо типа 'int'), но теперь код выдает ошибку во время выполнения. Спасибо. – Alexey

+1

Сам код кругового буфера отлично подходит для меня (MSVC 2010 Ultimate SP1), что означает, что ваш сбой вызван тем, что связано с OpenCV, что вам, вероятно, лучше всего использовать отладчик для поиска. – Necrolis

ответ

3

Что-то не так с вектором и индексом для следующего слота для записи и для следующего процесса?

Все, что вам нужно, это обернуть вокруг, когда вы дойдете до конца, и если вы используете силу 2 в векторном размере, вы можете использовать для этого простую маску.

+0

Спасибо. Я рассмотрю это завтра. – Alexey

+1

@Alex, используя вектор, безусловно, упростит код, но я не думаю, что он исправит вашу ошибку. Обязательно определите размер вектора для емкости кругового буфера до пытаясь использовать его. –

1

Круглый буфер является потокобезопасным, когда только поток письма обновляет указатель end, и только поток чтения обновляет указатель start, и доступ к этим указателям является атомарным. У вас есть место в cbWrite, которое обновляет start, что приведет к состоянию гонки.

+0

Образец кода (это сбой) еще не имеет потоков. Спасибо за подсказку; реализация потоков будет моим следующим шагом. – Alexey

Смежные вопросы