Optical Flow — гистограммы движения

В настоящее время я работаю над оптическим потоком с OpenCV С++. Я использую calcOpticalFlowPyrLK с сеткой точек (= одна точка интереса для каждого квадрата 5 * 5 пикселей).

Как лучше всего:

1) Вычислить гистограмму вычисленных значений (ориентация и расстояние) для каждого кадра

2) Вычислите гистограмму значений (ориентация и расстояние), которые данный пиксель принимал в течение нескольких кадров (например, 100)

Адаптированы ли функции OpenCV для этой работы? Как я могу использовать их простым способом в сочетании с calcOpticalFlowPyrLK?


person DouglasAdams    schedule 13.04.2014    source источник
comment
гистограммы для значений float ? как это будет работать?   -  person berak    schedule 13.04.2014
comment
Квантованием или линейной интерполяцией.   -  person Blaz Bratanic    schedule 13.04.2014
comment
Правильно. Но как насчет моего вопроса?   -  person DouglasAdams    schedule 13.04.2014
comment
см. также этот ответ: title="создание ограничивающей рамки вокруг поля путей оптического потока"> stackoverflow.com/questions/42176120/   -  person koshy george    schedule 21.02.2017
comment
Я тоже искал такой же. Есть ли у вас или в состоянии реализовать этот алгоритм.   -  person PrasadHeeramani    schedule 01.05.2020


Ответы (2)


Я искал те же инструменты OpenCV пару месяцев назад. К сожалению, OpenCV не включает реализацию гистограммы движения. Вместо этого вам нужно запустить calcOpticalFlowPyrLK для каждого кадра и вычислить ориентацию/длину каждого смещения. Затем вы должны сами создать/заполнить гистограммы. Не так сложно, как кажется, поверьте :)

person Яois    schedule 14.04.2014
comment
В порядке. Это то, что я просто делаю. Но я искал красивую реализацию с несколькими дополнительными функциями. Спасибо за ваш пост. Это ответ на мой вопрос. - person DouglasAdams; 14.04.2014

Реализация OpenCV для первой части HOOF может быть такой, как показано ниже:

const int rows = flow1.rows;
const int cols = flow1.cols;

for (int y = 0; y < rows; ++y)  
for (int x = 0; x < cols; ++x)
{
    Vec2f flow1_at_point = flow1.at<Vec2f>(y, x);
    float u1 = flow1_at_point[0];
    float v1 = flow1_at_point[1];
    magnitudeImage += sqrt((u1*u1) + (v1 + v1));
    orientationImage += atan2(u1, v1);
}
person Farshid PirahanSiah    schedule 30.06.2016