Вычислить глобальное движение opencv 2.4.x C++

Вот два изображения, одно снято до того, как хирург сделал действие, а другое — после.

До: введите здесь описание изображения

После: введите здесь описание изображения

Разница: (После - До) + 128. (Добавление 128 просто для лучшего изображения) введите здесь описание изображения

Как указано белыми стрелками, произошло глобальное движение, затронувшее все объекты.

Итак, мне нужно оценить его, чтобы получить более ценную информацию о том, что происходит в сцене.

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


person Maystro    schedule 19.01.2016    source источник
comment
Я поделюсь ссылкой здесь. Это относится к видео, а не к паре изображений до/после, но, возможно, это может дать вам представление. Я бы посоветовал просмотреть другие сообщения в этом блоге, может быть что-то полезное для вас.   -  person Trés DuBiel    schedule 25.01.2016


Ответы (1)


Вам нужен алгоритм плотного оптического потока:

Результат для

cv::calcOpticalFlowFarneback(img1, img2, flowField, 0.5, 3, 10, 5, 5, 1.1)

это следующее поле потока, в котором вы ясно видите изменения: введите здесь описание изображения

Что касается глобального обнаружения движения:

  • Если глобальное движение очень мало (как в вашем примере), вы можете просто ограничить векторы движения: отбросить небольшие значения.
  • Если он больше, найдите доминирующий вектор движения и вычтите его из всех ваших векторов. Затем порог, чтобы отбрасывать небольшие значения
person PhilLab    schedule 27.01.2016
comment
как вы получили именно это изображение? - person Maystro; 27.01.2016
comment
Возможно, используя это - github.com/Itseez/opencv/blob/ мастер/образцы/cpp/fback.cpp - person Prabindh; 28.01.2016
comment
Да. Я думаю, что поменял порядок изображений, но с использованием изображений, размещенных выше, это результат. Конфигурация была cv::calcOpticalFlowFarneback(previousImage, image, flowField, 0.5, 3, 10, 5, 5, 1.1) - person PhilLab; 28.01.2016
comment
но я действительно не могу понять, как вы могли получить это изображение? вот что я получаю - person Maystro; 28.01.2016
comment
ссылка показывает метод разреженного оптического потока (например, поток нескольких ключевых точек). Farneback Optical Flow работает непосредственно с изображением и, таким образом, возвращает вектор потока для каждого пикселя. - person PhilLab; 28.01.2016
comment
Я знаю .. Я просто имел в виду взглянуть на вопрос, а не на ответ, чтобы вы поняли, что я имею в виду, не имея возможности воспроизвести ту же цифру, которую вы получили. - person Maystro; 28.01.2016