Как определить угол поворота координат на изображении

Я пытаюсь оценить простой эксперимент с вращающимся колесом. У меня есть несколько видео о вращающемся колесе (около 60 - слишком много, чтобы обработать их вручную). Я хочу определить угол поворота колеса в каждом кадре. Итак, моя идея заключалась в следующем: разделив их на отдельные кадры, я запустил функцию обнаружения объектов на изображении, чтобы получить движение объектов изображения:

Движущееся колесо

Сейчас есть три группы координат:

  • Те, в круговом движении (это означает: часть колеса)
  • Те, что на заднем плане (едва двигаются - но могут быть использованы для исправления координат других)
  • И те, которые неправильно обнаружены (например, координата сверху стрелки, скользящая вниз) - те, которые должны быть отсортированы.

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

4 ответа

Используйте RANSAC. Пусть ваша модель будет сочетать вращение и горизонтальное / вертикальное смещение.

Аффинная трансформация будет работать (у нее немного больше степеней свободы, но она хорошо описана). Пусть A_i = [x1 y1 0 0 1 0; 0 0 x1 y1 0 1] для каждой точки i. пусть b_i = [x2; у2]. Это дает вам A и b размерности 2n на 6 и 2n на 1, где n - количество точек.

Затем решите Ax=b для x, используя наименьшие квадраты. Ваше аффинное преобразование T тогда

[x1 x2 x5
 x3 x4 x6
 0  0  1]. 

х5, х6 - это сдвиг, который тебя не волнует. Другие от x1 до x4 описывают матрицу вращения (предостережение, если у вас есть немного увеличения или нет, это не просто вращение, для этого нормализуйте, чтобы сделать строки орто-нормальными!).

Во всяком случае, все это хорошо описано. Реализация должна существовать как в OpenCV, так и в Matlab.

Обновить

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

Вот изображение, показывающее вкладыши, идентифицированные RANSAC. Матчи (только вкладыши

Вывод 1

  1. Метод 1: Определите стрелку, используя сопоставление, и определите, что преобразование (аффинный будет делать).
  2. Метод 2: Не обращайте внимания на легкое движение камеры (или снимайте сначала) и используйте чисто вращательную модель.

Способ 1

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

Обновленная информация о методе 1

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

Способ 2

Пусть чисто вращательная модель будет x' = R x где x и x'- двумерные векторы, а R a - матрица вращения 2x2.

Мы могли бы решить это, используя LS, как упомянуто выше в аффинном случае. (А именно A = [x y 0 0; 0 0 x y]) Однако, если x и y находятся в координатах изображения (в пикселях), то модель явно неверна, поскольку она дает вращение вокруг начала координат. Автоматическое определение источника невозможно изнутри модели (возможно, сначала сделав аффинное преобразование и зная центр для первого кадра и, таким образом, экстраполируя его на каждый кадр).

Предполагая для простоты, что центр вращения одинаков на каждом изображении. Пусть это будет описано вектором t, Тогда нам просто нужно вычесть t из x и x', прежде чем оценивать модель вращения.

Реализация на самом деле немного сложнее, потому что вышеупомянутое не навязывает I = R' R на матрице вращения. Прочитайте https://math.stackexchange.com/a/77466 алгоритм Кабша для получения дополнительной информации.

Обновленная информация о методе 2

Проблема остается в том, что практически неподвижные точки должны быть классифицированы как выбросы (три группы точек, которые вы упоминаете в своем вопросе). Я попытался сначала удалить точки из перевода, а затем оценить вращение для остальных. Это не сработало.

Обновление 2

Я отправил код в хранилище Github MatlabRotationEsvaluation. Для дальнейшего прогресса, я думаю, нужны входные файлы с более высоким разрешением. Также было бы интересно узнать, нужна ли вам скорость вращения кадра за кадром или достаточно агломерационной информации.

Метод взаимной корреляции, чтобы найти вращение колеса (между двумя различными изображениями, извлеченными из видео)

1) Найдите центр колеса. Порог и обнаружить центр (как обнаружение зрачка). Вы можете добавить искусственные маркеры на ступицу / ось.

2) Использование ROI в центре культур (только для спиц)

3) Используйте лог-полярное преобразование (от центра ступицы / оси). Вы можете получить полосу пикселей (пончик) или линию пикселей (кольцо).

4) Повторите (1)-(3) для второго изображения

5) взаимно коррелируйте две полосы из двух изображений (как описано выше)

6) Расположение максимума в корреляции даст вам знать, сколько вращений испытало колесо. Середина длины массива корреляции - это где у вас 0 вращений.

Решение с БПФ.

Обработка изображений для опорного кадра и каждый последующий (захваченного) кадра:

1) БПФ 2D.

2) log-> полярное преобразование БПФ 2D.

3) Обрезать результирующее изображение с шага 2 до 0:90 дг по оси Y. По оси X вы можете выполнять полосовую фильтрацию по результатам обрезки в соответствии с вашими требованиями.

4) ссылка кросс-коррелирует изображение после обработки изображений с каждым последовательным кадром после обработки изображения. Смещение по Y обозначает вращение, а X обозначает масштаб.

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

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

Любая область изображения, которая не изменилась, будет равна нулю, поскольку два кадра будут отменены. Части, которые немного сместились, будут иметь небольшую разницу, а части, которые сместились, будут иметь большую.

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

Если мы возьмем пиксель как функцию времени, х и у (I(x,y,t)) тогда взять производную по времени так же, как:

dI(x,y,t)/dt = dI/dx * dx/dt + dI/dy * dy/dt

Мы можем рассчитатьdI(x,y,t)/dtкак описано выше, принимая разность двух кадров во времени для каждой точки изображения. Точно так же мы можем рассчитатьdI/dxа также dI/dy принимая числовые различия между пикселями в (x, y) а также (x+1, y) для dI/dx случай и (x, y) а также (x, y+1) для dI/dy дело.

Как только мы имеемdI/dxа такжеdI/dyградиент просто < dI/dx, dI/dy>. Вы можете использовать метод наименьших квадратов, чтобы определить центральную точку, а затем направление движения. Помните: большинство градиентов будут маленькими или нулевыми, так как большинство пикселей на изображении будут отменены, поэтому вам придется использовать те, которые превышают определенный порог.

Обратите внимание, если вы хотите отобразить этиdI'sвам придется их нормализовать, так как у вас будут отрицательные пиксели.

Другие вопросы по тегам