Стабилизация видео с помощью OpenCV

Я провел несколько испытаний решений, которые не только решают массив, но и делают его копию. Вот тестовый код. Метод reverse2 является самым быстрым в Chrome, но в Firefox метод reverse является самым быстрым.

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

var reverse1 = function() {
  var reversed = array.slice().reverse();
};

var reverse2 = function() {
  var reversed = [];
  for (var i = array.length - 1; i >= 0; i--) {
    reversed.push(array[i]);
  }
};

var reverse3 = function() {
  var reversed = [];
  array.forEach(function(v) {
    reversed.unshift(v);
  });
};

console.time('reverse1');
for (var x = 0; x < 1000000; x++) {
  reverse1();
}
console.timeEnd('reverse1'); // Around 184ms on my computer in Chrome

console.time('reverse2');
for (var x = 0; x < 1000000; x++) {
  reverse2();
}
console.timeEnd('reverse2'); // Around 78ms on my computer in Chrome

console.time('reverse3');
for (var x = 0; x < 1000000; x++) {
  reverse3();
}
console.timeEnd('reverse3'); // Around 1114ms on my computer in Chrome
36
задан Rui Marques 15 February 2013 в 14:56
поделиться

2 ответа

Я могу предложить одно из следующих решений:

  1. Использование локальных функций высокого уровня: OpenCV включает SURF, поэтому: для каждого кадра извлекайте функции SURF. Затем создайте функцию Kd-Tree (также в OpenCV), затем сопоставьте каждые два последовательных кадра, чтобы найти пары соответствующих функций. Загрузите эти пары в cvFindHomography, чтобы вычислить гомографию между этими кадрами. Деформируйте рамы в соответствии с (комбинированными ..) аналогами для стабилизации. Насколько мне известно, это очень надежный и сложный подход, однако извлечение и сопоставление SURF могут быть довольно медленными
  2. . Вы можете попытаться сделать это с «менее надежными» функциями, если вы ожидаете лишь незначительного перемещения между двумя кадрами, например используйте определение углов Харриса и создайте пары ближайших друг к другу углов в обоих кадрах, затем подайте в cvFindHomography, как указано выше. Возможно, быстрее, но менее надежно.
  3. Если вы ограничите перемещение переводом, вы можете заменить cvFindHomography чем-то более ... простым, чтобы просто получить перевод между парами функций (например,г. среднее)
  4. Используйте фазовую корреляцию (ссылка http://en.wikipedia.org/wiki/Phase_correlation ), если вы ожидаете только трансляцию между двумя кадрами. OpenCV включает в себя DFT / FFT и IFFT, см. Связанную статью в Википедии о формулах и объяснениях.

ИЗМЕНИТЬ Три замечания, которые мне лучше упомянуть явно, на всякий случай:

  1. Подход, основанный на гомографии, вероятно, очень точен, поэтому стационарный объект останется неподвижным. Однако омографии включают искажение перспективы и масштабирование, поэтому результат может выглядеть немного… необычным (или даже искаженным для некоторых быстрых движений). Хотя это точно, это могло бы быть менее визуально приятным; так что используйте это скорее для дальнейшей обработки или, например, криминалистической экспертизы. Но вам стоит попробовать, это может быть очень приятно для некоторых сцен / движений.
  2. Насколько мне известно, по крайней мере несколько бесплатных инструментов для стабилизации видео используют фазовую корреляцию. Если вы просто хотите «расшатать» камеру, это может быть предпочтительнее.
  3. В этой области ведутся некоторые исследования. В некоторых документах вы найдете более сложные подходы (хотя они, вероятно, требуют большего, чем просто OpenCV).
39
ответ дан 27 November 2019 в 05:36
поделиться

Это непростая проблема, но я могу предложить несколько простую ситуацию, которая мне не подходит.

  1. Сдвиг / поворот next_frame на произвольную величину
  2. Используйте порог вычитания фона (abs (prev_frame-next_frame_rotated)) , чтобы найти статические элементы. Вам придется поиграть с тем, какое пороговое значение использовать.
  3. Найдите мин (template_match (prev_frame_background, next_frame_rotated_background))
  4. Запишите сдвиг / поворот ближайшего совпадения и примените его к next_frame

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

3
ответ дан 27 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: