Я пишу диплом, в котором мне надо расчитывать расстояния до движущихся объектов по картинкам с двух камер.
На данный момент имею следующие наработки, работающие с кадрами видео (пока без камер):
- Анализируются два идущих подряд кадра - "предыдущий" и "текущий".
- Каждый кадр предварительно обрабатывается - вычисляется разность его цвета с цветами всех его четырёхсвязных соседей (отдельно считается по каждой цветовой компоненте, затем складывается).
*: это слегка обработаные изображения - чтобы было лучше видно, что получается. - Затем расчитывается "разница кадров". Кадры попиксельно сравниваются, и строится новая картинка (или матрица, если угодно):
- Если разница цветов между текущим и предыдущим кадрами (в этом пикселе) меньше порогового значения, в "разницу" идёт чёрная точка.
- Если цвет (разница цветов с соседями) на предыдущем кадре больше, то на "разницу кадров" ставится синяя точка.
- Иначе - красная.
- Далее можно сделать пару операций бинарной морфологии - наращивание и эррозию. Они воспринимают красные и синие точки как белые (или как белые они воспринимают точки того цвета (кроме чёрного), к пикселю которого в данный момент применяется структурирующий элемент).
- На этапе вычисления "разницы" кадров, запоминать синие и красные точки в специальных списках, чтобы потом не искать их полным сканированием изображения.
- Списки синих и красных точек применить в операциях бинарной морфологии для поиска пикселей, к которым надо применить структурирующий элемент.
- После окончания "издевательств" над "разницей" кадров при помощи бинарной морфологии, объединить точки, находящиеся близко друг к другу (отдельно синие - отдельно красные):
- Перебираем точки списка.
- Для каждой точки вычисляем расстояние до всех остальных точек (вложенный цикл идёт не от нуля, а от номера текущей точки+1).
- Если расстояние меньше некоторого критического, помечаем точку, как подготовленную к объединению. Если точка уже так помечена, то смотрим к кому она ближе - к той точке, с которой её планировалось объединить ранее, или к текущей. И "делаем выводы"
- Затем все помеченые точки объединяем. Координаты - среднее арифметическое.
- Получаем уменьшенные списки красных и синих точек.
- Перебираем окресности синих точек и сравниваем их с окресностями красных точек (на "производных" предыдущего и текущего кадров соответственно) и вычисляем коэффициенты схожести.
- Смотрим - где коэффициент схожести больше - туда точка и перешла с предыдущего на текущий кадр.
И ещё, как мне кажется, он должен зависеть от расстояния между сопоставляемыми точками. Конечно, найти признаки, инвариантные к искажениям можно, но вероятно, мне надо будет ещё производить какие-то манипуляции, потому что я буду сравнивать не выделенные полностью объекты, а какие-то их части. И некоторые части, вероятно, будут сравниваться неоднократно (если расстояние между объединяемыми точками будет равно радиусу окресностей для сравнения, то эти окресности будут пересекаться у соседних объединённых точек).
*: Картинки пока удалил. Потом вставлю из другого видео.