2013-10-11 3 views
4

Я использую createOptFlow_DualTVL1() для расчета оптического потока, который дает мне именно то, что я хочу, но он очень медленный. Есть ли способ немного ускорить его или есть ли какая-либо другая функция оптического потока, которая даст мне тот же результат с меньшим временем обработки? Я использовал calcOpticalFlowFarneback(), cvGoodFeaturesToTrack(), но качество не очень хорошее. пожалуйста помоги.Ускорение оптического потока (createOptFlow_DualTVL1)

Спасибо заранее Ниже, как я применяю createOptFlow_DualTVL1()

Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1(); 
tvl1->calc(Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow); 

ответ

9

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

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

  2. Уменьшить количество перекосов (параметр: warps) по шкале. Это немного повредит точность, но если у вас не очень сложные шаблоны движения (например, когда все пиксели изображения движутся в разных направлениях или когда вы очень быстро перемещаетесь внутри изображения), результат должен быть приемлемым. Алгоритмы выполняют процедуру минимизации warps раз за уровень в пирамиде изображения, поэтому даже небольшое изменение в warps даст вам заметное ускорение.

  3. Уменьшить количество уровней на изображении пирамиды (параметр: scales). Это может существенно повлиять на точность, поэтому будьте осторожны и много экспериментируйте с ней. В литературе было найдено, что хороший (для точности) масштабный коэффициент между уровнями равен 0,8, поэтому вы должны соответственно вычислить свое количество уровней. До 0,8, стандарт в эксперименте с оптическим потоком был масштабным коэффициентом 0,5, поэтому вы можете попытаться спуститься до этого значения.

  4. Скорость конвергенции: внутренняя процедура минимизации L1 стабильна для этапов времени (параметр: tau) до 1/8 (0,125) в теории, но на практике значения 1/4 (0,25) известны еще Работа.

+0

Благодаря sansuiso, но я не вижу, где настроить эти параметры в creatOptFlow_DualTVL1() это только позвольте мне только эти аргументы tvl1-> известково (Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow); или вы рекомендуете мне вашу другую функцию? – Dave

+0

Эти параметры являются членами структуры, которая создается при вызове cv :: createOptFlow ... Используйте, например, tvl1-> theta = 0.125; и т. д. – sansuiso

+2

Спасибо за помощь. если я могу добавить некоторую поправку: tvl1-> getDouble («theta»); // для получения значения tvl1-> set ("theta", 0.125); // для установки значения – Dave

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