Использование метода кросс-корреляции для определения скоростей


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

Получаемый видеосигнал оценивал состояние тепловых потоков в помещении. Благодаря конвективному теплообмену частицы пыли в помещении совершали вихревое перемещение, которое и отслеживала камера.

Чтобы выделить частицы в помещении использовался лазер с линзой, раскладывающей лазерный луч в вертикальную плоскость. Полученный луч подсвечивал в пространстве частицы водяной пыли(распыляемой спец устройством). Перпендикулярно плоскости частиц устанавливался штатив видеокамеры(таким образом получен кадр выше). Использовалась камера с высокой частотой съемки, чтобы полученные соседние кадры были достаточно последовательны в отношении к скорости движения частиц пыли.

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

Кросс-корреляция

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

Перед тем как воспользоваться методом требуется подготовить полученные кадры:

1. кадр переводиться в градации серого
2. производиться фильтрация

Результатом вышеуказанных действий в идеале должна являться плоскость с расположенными на них точками.
Полученные кадры являются матрицами, которые уже легко можно использовать при кросс-корреляции.

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

Допустим мы имеем два кадра:

Ну а теперь матемагия:
1. производим над обеими матрицами быстрое преобразование Фурье (БПФ или FFT).
2. над базовой матрицей производим комплексное сопряжение (умножаем на «-1» комплексное слагаемое(еще помню:))
3. полученные матрицы перемножаем
4. производим процедуру обратного быстрого преобразования Фурье (Inverse FFT)

Вуаля! Получаем матрицу исходной размерности на которой максимальное значение является концом вектора проведенным от начала координат к текущему положению группы объектов(тут ребята я не помню точно возможно от центра матрицы, даже скорее всего).

Зная время между кадрами можно получить величину скорости.

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

Плюсы:
1.чистая математика, думаю библиотеки имеются в наличие в сети
2.возможность следить за группами объектов
3.группа объектов может перемещаться в пространстве друг относительно друга, это не страшно, фурье проглотит
4.возможность отслеживать объекты распознанные благодаря OpenCV

Минусы:
Для достоверности измерений. В случае достаточно стохастических перемещений, рекомендуется измерять группы от 5 до 12 объектов (пруф-линка не будет, со слов передаю)

Пользуясь случаем выражаю признательность Юрасу Станиславу Федоровичу, за полученные знания.
При желании могу скинуть файл и инструкции, как это чудо запустить в LabView 8.6.


0 комментариев на «“Использование метода кросс-корреляции для определения скоростей”»

  1. Здравствуйте! Очень интересная информация, пишу сейчас исследовательскую работу, очень мало информации по этому методу в исследуемом мной направлении, оказалось очень кстати. Нужны и файл, и инструкция, как запустить, если можно.)

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение