J'utilise C++, bibliothèque OpenCV et dans mon logiciel, j'ai estimé le flux optique dans une vidéo. Maintenant, je veux regrouper certains objets en mouvement, par ex. voitures en mouvement. J'ai utilisé un algorithme de flux optique dense (Farneback). Mes premières réflexions jusqu'à présent sont d'utiliser l'algorithme "k means" pour faire le clustering.Segmentation d'image basée sur le flux optique
j'ai pensé à utiliser les résultats du flux optique Farneback pour calculer le déplacement des trames dans chaque direction comme suit:
Par ex :
Soit Dx le déplacement dans la direction x (positive ou négative) et Dy le déplacement dans la direction y (positif ou négatif). Puis je passe le tableau [Dx, Dy] comme une entrée à k signifie avec k = 2 clusters. J'espère que cela donnera une arrière-plan rugueuse/soustraction au premier plan.
Cependant, je suis confronté à des problèmes dans le calcul du displacemet car la sortie de calcOpticalFlowFarneback est un flux InputOutputArray. Dois-je accéder à ce tableau en utilisant une fonction comme celle par exemple? :
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);
}
Que avez-vous déjà essayé? – VKatz
J'ai déjà utilisé des kmeans qui fonctionnent je suppose et retourne un tableau bestLabels. Cependant, je n'ai pas réussi à montrer le résultat en tant qu'image. Je travaille aussi sur un autre code utilisant la soustraction d'arrière-plan qui fonctionne également. Devrais-je les combiner? Ou utiliser par exemple la soustraction d'arrière-plan en premier et k signifie plus tard? –
Quel algorithme de flux optique dense avez-vous utilisé? – ChronoTrigger