J'ai besoin de détecter la vitesse à laquelle une caméra panoramique (horizontale / verticale) pour avertir l'opérateur de ralentir.
L'image entière se déplace comme un bloc, je n'ai pas besoin d'une direction réelle (bien que H ou V serait un bonus) et j'ai seulement besoin d'une magnitude approximative - c'est-à-dire. déclencher si plus de «N» pixels se déplacent entre les images.
Les images sont de grandes scènes généralement à faible contraste uniforme, je n'ai pas de hautes lumières évidentes à suivre. Je dois le faire en temps réel (60fps) et sans utiliser tout le CPU.
La solution Niave consiste à choisir un RoI au centre, à trouver des bords, à calculer la similitude entre des paires d'images, à décaler l'une des images vers la gauche / droite / haut / bas d'un pixel, à répéter - à trouver des minima.
Je me demandais s'il y avait une solution plus intelligente?
la source
Cela peut être une solution lente et terrible, mais vous pouvez effectuer une corrélation croisée basée sur FFT des images suivantes, puis trouver le pic pour identifier le décalage entre les images. Peut-être ne le faites que sur un petit sous-ensemble de l'image pour économiser les cycles du processeur.
Cela ne fonctionnerait pas avec une rotation ou des changements de scène drastiques d'une image à l'autre, et il existe probablement de meilleures méthodes. C'est une sorte de solution "J'ai un marteau donc tout ressemble à un clou". Je suppose que c'est exactement comme votre solution naïve, sauf qu'il n'y a pas besoin de détection de bord et la FFT le rend beaucoup plus rapide que de déplacer explicitement un pixel à la fois.
Cette question est similaire, et personne ne suggère autre chose que la corrélation croisée, alors ce n'est peut-être pas si mal: utiliser MATLAB pour calculer le décalage entre les images successives
la source
Une façon d'estimer la vitesse et la direction serait de faire une estimation de flux "locale", par exemple de quatre fenêtres au centre de l'image. La méthode différentielle de Lucas – Kanade suppose que le déplacement est approximativement constant et qu'il est donc possible de le résoudre comme une équation.
Mon guide étape par étape serait donc:
Cela détermine la direction et la vitesse, mais vous pouvez utiliser une fenêtre pondérée pour la rendre plus robuste. Regardez la méthode Lucas-Kanade pour ses extensions.
la source
Je pense que la corrélation croisée est une bonne approche pour trouver le décalage, mais si vous voulez le faire très rapidement, vous pouvez essayer de le restreindre à une seule verticale et à une seule ligne de balayage horizontale (c'est-à-dire au centre de l'image). Le calcul de la corrélation croisée entre les lignes de balayage dans les deux images devrait vous donner une approximation du décalage horizontal et vertical.
la source