Я использую C++, библиотеку OpenCV и в своем программном обеспечении, я оценил оптический поток в видео. Теперь я хочу сгруппировать некоторые движущиеся объекты, например. движущихся автомобилей. Я использовал алгоритм плотного оптического потока (Farneback).Сегментация изображения на основе оптического потока
Мои первые мысли до сих пор - использовать алгоритм «k означает» для кластеризации.
Я подумал, используя результаты оптического потока Farneback вычислить смещение кадров в каждом направлении следующим образом:
Е.Г. :
Пусть Dx - смещение в направлении x (положительное или отрицательное) и Dy смещение в направлении y (положительное или отрицательное).
Затем я передаю массив [Dx, Dy] в качестве входа в k с k = 2 кластерами. Надеюсь, это даст грубую предпосылку/переднюю часть.
Однако я столкнулся с проблемами при вычислении смещения, потому что выход calcOpticalFlowFarneback представляет собой поток InputOutputArray. Должен ли я обращаться к этому массиву с помощью такой функции, как например? :
findDisplacements(const Mat& flow, int step) {
const Point2f& Dx,Dy;
const Point2f& fxy = flow.at<Point2f>(y, x);
Dx=Point(cvRound(x+fxy.x))-Point(x,y);
Dy=Point(cvRound(y+fxy.y))-Point(y,x);
}
Какие вещи вы уже пробовали? – VKatz
Я уже использовал kmeans, который работает, я думаю, и возвращает массив bestLabels. Однако мне не удалось показать результат как изображение. Я также работаю над другим кодом, использующим фоновое выражение, которое также работает. Должен ли я объединить их? Или использовать, например, базовую субтракцию, а k означает позже? –
Какой плотный алгоритм оптического потока вы использовали? – ChronoTrigger