как я должен использовать информацию velX, velY, чтобы получить смещение по X и Y между текущим кадром и предыдущим кадром?

Я использую алгоритм Lucas Kanade Optical Flow из библиотеки openCV на С#; Есть серии кадров, в которых в каждых двух я хочу узнать какой был оптический поток и показать его в pictureBox.

Я мог бы получить velX и velY из следующей функции:

Emgu.CV.OpticalFlow.LK(imGrayCurrent, imGrayNext, windSize, velX, velY);

Теперь, как я должен использовать эти два для отображения потока между двумя кадрами? или, другими словами, как мне получить смещение пикселей?

Tnx


person farzin parsa    schedule 04.04.2012    source источник


Ответы (1)


Распространенным способом является преобразование HSV в RGB, см. набор данных потока Миддлбери. Следовательно:

  1. Преобразуйте векторы движения в полярные координаты:

    длина = sqrt (velx² + vely²)

    угол = acos(vely/длина) [Внимание, дополнительные проверки, например. бесконечность должна быть сделана]

  2. Нормируйте угол до [0,360] (для OpenCV или [0,1] в зависимости от функции, которую вы будете использовать позже) и длину до [0,1]. Создайте пространство hsv (3-канальное изображение с первым каналом H (оттенок), вторым каналом S (насыщенность) и третьим каналом V (значение)) и установите: H = угол, S = длина и V = 1.

  3. Преобразование цветового пространства HSV в RGB, например. с помощью cv::cvtColor(hsv, rgb, HSV2BGR);

Полученное изображение теперь показывает поле вектора движения (velx, vely), где цвет передает направление вашего движения, а насыщенность — длину или скорость вашего движения.

person Tobias Senst    schedule 10.02.2013