EVM: ускорение вычисления

Рейтинг: 3Ответов: 1Опубликовано: 02.05.2015

Для повторения эффекта Eulerian Video Magnification можно воспользоваться более простой техникой, нежели чем об этом говорится в соответствующей документации. Достаточно просто взять полосный фильтр, например, Баттерворта и подобрать к конкретному видео нижнюю и верхнюю частоты среза. Остаётся только применять этот фильтр к каждому из пикселей каждого кадра в кольцевом буфере. Всё это без необходимости разложения кадров на пирамиду изображений, а затем, перед воспроизведением, производить обратную сборку в одно целое.

Но мой вопрос заключается в том, каким образом авторы EVM достигают такой скорости обработки данных, как это представлено на их демонстрационном видео?

Там показан ролик с вагоном метро достаточно высокого разрешения, пользователь крутит ползунки параметров, и всё в режиме реального времени, как если бы применялись простейшие расчёты. Ведь как минимум необходимо собрать кольцевой буфер размером, скажем, кадров в 30, и по каждому пикселю центрального в этом буфере кадра и основываясь на значениях пикселей других кадров в кольце, применять на них в отдельности полосный фильтр. Это огромная работа с учётом того, что изображение ещё и в цвете, то есть три канала.

Вопрос - как так у них это получается? Просто хотя бы чисто теоретически.

Update:

Максимум, что удалось добиться для воспроизведения в реальном времени - это разрешение в 320х240 пикселей, без применения пирамид Гаусса, а затем Лапласа (только один единственный проход на 3-х каналах по всем пикселям с применением полосного фильтра), на восьмиядерной машине, с параллелизацией через OpenMP, 25 кадров/сек.

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

Делаю вывод, что возможная неоптимизированность моего кода не является причиной невозможности наложения EVM в реальном времени. Значит авторы метода используют или некий хитрый подход, позволяющий избавиться от части вычислений, либо задействуют целый кластер машин. Впрочем, может быть ещё использование GPU... Одно из двух: либо вычисляют иначе, чем описывают в своей документации, либо используют "железо" по полной программе.

Ответы

▲ 3Принят

Подобные задачи лучше решать с использование GPU, т.к. CPU не заточен под SIMD задачи. Могу предложить примерный алгоритм решения с использование Qt/QML:

  1. На форме размещаем Image, в который мы будем отрисовывать наш кадр.
  2. На имеющийся Image натравливаем ShaderEffect с шейдером прописанным в fragmentShader.

Вуаля!

Шейдер будет состоять из той математики, которую нужно применить к каждому пикселю. Чтобы написать такой шейдер нужно просто посмотреть пару примеров, можно даже в документации Qt. Для таких базовых вещей и при известной математике, в этом нет ничего сложного.