Flux optique approximatif rapide / décalage d'image


9

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?

Réponses:


3

Probablement, si vous cherchez une méthode simple , c'est d'appliquer les algorithmes standard d'estimation de mouvement qui sont très mûris dans la classe MPEG des codecs de compression. Ils sont faciles à comprendre et je suppose que vous obtiendrez beaucoup de codes prêts à l'emploi. Cet algorithme produit un vecteur de mouvement bloc par bloc - puis vous pouvez trouver le cluster le plus important et prendre la direction et l'amplitude moyennes du vecteur de mouvement.

MPEG4 - a un autre concept clé appelé " compensation de mouvement global ", une technique qui tente d'abord d'estimer et de compenser le mouvement et le panoramique de la caméra. La beauté est que ces méthodes peuvent être plus simples ou exhaustives selon la complexité. Voici un exemple de papier et un autre papier pour le même.

En général, le panoramique de la caméra et l'estimation du mouvement sont un domaine de recherche bien établi. voici une référence: papier et un autre papier .

À propos de ce sujet. Vous y trouverez à la fois rigueur et algorithme précis ainsi que des algorithmes simples et rapides.


Si je peux facilement me connecter à une bibliothèque MPEG, ce serait bien, je me souviens que GMC dans Mpeg avait des critiques. Je pensais que ce serait un domaine commun en raison des algorithmes de stabilisation de la caméra
Martin Beckett

Vous pouvez certainement accrocher (ou plutôt extraire) des algorithmes MPEG. Vous pouvez utiliser FFMPEG comme bibliothèque et l'extraire - mais cela pourrait devenir délicat. Alternativement, vous pouvez lire le code soigné de MSSG à extraire.
Dipan Mehta

En ce qui concerne les critiques sur GMC - il s'agit plutôt d'une promesse excessive de réduire considérablement le débit binaire et de créer un encodage basé sur les objets . Cependant, il n'est pas vraiment difficile d'estimer les paramètres de mouvement de la caméra.
Dipan Mehta

merci, je vais jeter un oeil à MSSG. J'utilise ffmpeg mais ce n'est pas une bibliothèque facile à extraire!
Martin Beckett

3

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


Merci, il est facile de supposer que la FFT est lente, mais je peux faire une petite fenêtre de 2 ^ n. ps. Juste pour la recherche stackoverflow.com/questions/1100100/…
Martin Beckett

3

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:

  1. Obtenez une fenêtre de pixels au centre de l'image, par exemple 20x20
  2. Calculez les gradients Ix et Iy.
  3. Divisez la fenêtre de dégradé en quatre parties, par exemple 4x10x10.
  4. Résolvez les quatre équations des moindres carrés linéaires avec l'image suivante.
  5. Moyenne des quatre vecteurs vitesse.

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.


0

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.


Cela peut fonctionner, mais si le panoramique est en diagonale, cela ne fonctionnera pas bien, même si c'est juste un peu de gigue de haut en bas lors du panoramique latéral. Je pense qu'une sous-région rectangulaire au centre de l'image serait mieux.
endolith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.