58 votes

Comment puis-je déterminer la distance d'un objet dans une vidéo ?

Je dispose d'un fichier vidéo enregistré depuis l'avant d'un véhicule en mouvement. Je vais utiliser OpenCV pour la détection et la reconnaissance d'objets mais je suis bloqué sur un aspect. Comment puis-je déterminer la distance d'un objet reconnu.

Je peux connaître ma vitesse actuelle et ma position GPS réelle, mais c'est tout. Je ne peux faire aucune supposition sur l'objet que je suis en train de suivre. J'ai l'intention d'utiliser ce système pour suivre des objets sans entrer en collision avec eux. Idéalement, je voudrais utiliser ces données pour déduire la position réelle de l'objet, ce que je pourrais faire si je pouvais déterminer la distance entre la caméra et l'objet.

0 votes

En fin de compte, je pense que vous devrez faire au moins une hypothèse sur les objets que vous suivez : leur taille. Avec tout ce que vous avez (pas de radar, par exemple), vous devrez deviner la taille des objets afin d'évaluer leur distance.

1 votes

Avec une seule caméra et sans connaître leur taille réelle, ce n'est pas possible.

1 votes

@BlueJRaja - "Une seule caméra" n'a pas d'importance dans ce cas. La vidéo est en mouvement, donc deux images successives peuvent être utilisées pour obtenir les deux points de vue différents. Parallaxe temporelle : stackoverflow.com/questions/2135116/

60voto

Jacob Points 22306

Votre problème est tout à fait standard dans le domaine.

Tout d'abord,

vous devez calibrer votre appareil photo. Cela peut être fait hors ligne (rend la vie beaucoup plus simple) ou en ligne par l'auto-calibrage.

Calibrez-le hors ligne - s'il vous plaît.

Deuxièmement,

Une fois que vous avez la matrice d'étalonnage de la caméra K déterminez la matrice de projection de la caméra dans une scène successive (vous devez utiliser la parallaxe comme mentionné par d'autres). Ceci est bien décrit dans ce Tutoriel OpenCV .

Vous devrez utiliser les informations du GPS pour trouver l'orientation relative entre les caméras dans les scènes successives (ce qui peut être problématique en raison du bruit inhérent à la plupart des unités GPS), c'est-à-dire l'orientation de la caméra. R y t mentionné dans le tutoriel ou la rotation et la translation entre les deux caméras.

Une fois que vous aurez résolu tout cela, vous aurez deux matrices de projection --- des représentations des caméras à ces scènes successives. En utilisant l'une de ces matrices dites de caméra, vous pouvez "projeter" un point 3D M de la scène à l'image 2D de la caméra en coordonnées de pixel m (comme dans le tutoriel).

Nous allons l'utiliser pour trianguler le point 3D réel à partir des points 2D trouvés dans votre vidéo.

Troisièmement,

utiliser un détecteur de points d'intérêt pour suivre le même point dans votre vidéo qui se trouve sur l'objet d'intérêt. Il existe plusieurs détecteurs disponibles, je recommande SURF puisque vous avez OpenCV qui a aussi plusieurs autres détecteurs comme Angles de Shi-Tomasi , Harris , etc. .

Quatrièmement,

Une fois que vous avez suivi les points de votre objet dans la séquence et obtenu les coordonnées des pixels 2D correspondants, vous devez trianguler pour trouver le point 3D le mieux adapté compte tenu de votre matrice de projection et des points 2D. Triangulation

L'image ci-dessus illustre bien l'incertitude et la façon dont le point 3D le mieux adapté est calculé. Bien sûr, dans votre cas, les caméras sont probablement en face l'une de l'autre !

Enfin,

Une fois que vous avez obtenu les points 3D sur l'objet, vous pouvez facilement calculer la distance euclidienne entre le centre de la caméra (qui est l'origine dans la plupart des cas) et le point.

Note

Ce n'est évidemment pas facile, mais ce n'est pas si difficile non plus. Je vous recommande l'excellent livre de Hartley et Zisserman. Géométrie à vues multiples qui a décrit tout ce qui précède de manière explicitement détaillée, avec un code MATLAB à la clé.

Amusez-vous bien et continuez à poser des questions !

5 votes

+1 pour être la seule bonne réponse. Mentionner MVG/Zisserman vaut presque un vote positif en soi.

9 votes

@Amro&Kigurai : Ce ne serait pas génial si nous avions un computervisionoverflow comme mathoverflow habité par des experts en vision dans le monde universitaire/industriel ?

4 votes

@Jacob +1 pour computervisionoverflow

39voto

Robert Cartaino Points 12173

Lorsque vous avez une vidéo en mouvement, vous pouvez utiliser la parallaxe temporelle pour déterminer la distance relative des objets. Parallaxe : ( définition ).

L'effet serait le même que celui que nous obtenons avec nos yeux qui peuvent acquérir une perception de la profondeur en regardant le même objet sous des angles légèrement différents. Comme vous êtes en mouvement, vous pouvez utiliser deux images vidéo successives pour obtenir votre angle légèrement différent.

En utilisant les calculs de parallaxe, vous pouvez déterminer relatif la taille et la distance des objets (les uns par rapport aux autres). Mais, si vous voulez que le absolu la taille et la distance, vous aurez besoin d'un point de référence connu.

Vous devrez également connaître la vitesse et la direction du déplacement (ainsi que la fréquence d'images de la vidéo) afin d'effectuer les calculs. Vous pouvez consulter le site pourrait être en mesure de déduire la vitesse du véhicule à l'aide des données visuelles, mais cela ajoute une autre dimension de complexité.

La technologie existe déjà. Les satellites déterminent proéminence topographique (hauteur) en comparant plusieurs images prises sur une courte période de temps. Nous utilisons la parallaxe pour déterminer la distance des étoiles en prenant des photos du ciel nocturne à différents moments de l'orbite de la terre autour du soleil. J'ai pu créer des images en 3 dimensions à partir d'un hublot d'avion en prenant deux photos en courte succession.

La technologie et les calculs exacts (même si je les connaissais par cœur) sont les suivants chemin en dehors de la portée de la discussion ici. Si je peux trouver une référence décente, je la posterai ici.

1 votes

J'y ai pensé, mais j'avais un sérieux souci, à savoir que cela ne fonctionnerait que si les objets ne bougeaient pas beaucoup entre les images. C'est une hypothèse raisonnable si vous regardez un paysage depuis un avion, mais une mauvaise lorsqu'il s'agit d'autres véhicules.

1 votes

Les objets en mouvement le rendent chemin plus compliqué. Cela pourrait être fait, mais ce projet semble déjà chemin en dehors du champ d'action de la plupart des programmeurs.

0 votes

Je suppose que vous avez raison de dire que c'est possible en principe, mais vous avez également raison quant à la portée. Franchement, même la parallaxe spatiale ne semble pas si facile à réaliser en pratique. La suggestion de Pontiac6000fan d'utiliser un capteur de distance (ultrasonique ou radar ou autre) commence à me sembler bonne. Je vais aller leur donner un upvote.

5voto

ravenspoint Points 8840

Vous devez identifier les mêmes points du même objet sur deux images différentes prises à une distance connue. Puisque vous connaissez l'emplacement de la caméra dans chaque image, vous avez une ligne de base (le vecteur entre les deux positions de la caméra). Construisez un triangle à partir de la ligne de base connue et des angles des points identifiés. La trigonométrie vous donne la longueur des côtés inconnus du trapèze pour la longueur connue de la ligne de base et les angles connus entre la ligne de base et les côtés inconnus.

Vous pouvez utiliser deux caméras, ou une caméra qui prend des photos successives. Ainsi, si votre véhicule se déplace à une vitesse de 1 m/s et que vous prenez des photos toutes les secondes, les images successives vous donneront une ligne de base de 1 m, ce qui devrait être suffisant pour mesurer la distance d'objets jusqu'à 5 m, par exemple. Si vous avez besoin de mesurer des objets plus éloignés, les images utilisées doivent être plus espacées, mais les objets plus éloignés resteront visibles plus longtemps.

L'observateur en F1 voit la cible en T avec un angle a1 par rapport au vecteur vitesse. L'observateur se déplace de la distance b vers F2. Il voit la cible en T avec un angle a2.

Nécessaire pour trouver r1, distance de la cible à F1

L'identité trigonométrique pour le cosinus donne

Cos( 90 - a1 ) = x / r1 = c1

Cos( 90 - a2 ) = x / r2 = c2

Cos( a1 ) = (b + z) / r1 = c3

Cos( a2 ) = z / r2 = c4

x est la distance à la cible orthogonale au vecteur vitesse de l'observateur

z est la distance entre F2 et l'intersection avec x

En résolvant pour r1

r1 = b / ( c3 - c1 . c4 / c2 )

0 votes

La portée que j'observe est beaucoup plus grande, peut-être de l'ordre de plusieurs kilomètres. De plus, les objets que je regarde peuvent être en mouvement. Cela semble fonctionner parfaitement pour les courtes distances et les objets stationnaires, mais malheureusement, je ne pense pas que cela fonctionnera dans cette situation. +1 quand même :)

1 votes

Les objets éloignés nécessitent une ligne de base plus longue, il faut donc utiliser des cadres plus espacés pour les objets qui se calculent à l'infini. Pour les objets en mouvement, utilisez deux paires de cadres. La différence de position calculée entre les deux paires, moins la différence de votre position, donne le mouvement de l'objet observé.

4voto

Steven Sudit Points 13793

Deux caméras pour pouvoir détecter la parallaxe. C'est ce que font les humains.

modifier

Veuillez consulter la réponse de ravenspoint pour plus de détails. N'oubliez pas non plus qu'une seule caméra avec un séparateur suffirait probablement.

0 votes

Lorsque la caméra est en mouvement, vous pouvez obtenir "deux vues" en comparant deux images successives (images prises depuis une position légèrement différente) : stackoverflow.com/questions/2135116/

0 votes

@Robert : ne faut-il pas connaître l'emplacement des deux positions différentes ?

0 votes

@Jon Saunders - Bien sûr. Deux vues de la caméra vous donnent une relatif la taille et la distance entre les objets. Pour pousser les calculs plus loin, vous devez connaître votre vitesse, votre fréquence d'images (et éventuellement l'angle de la caméra). Cela vous donne la distance entre vos vues.

4voto

Egon Points 1268

Utilisez des cartes de disparité stéréo. De nombreuses implémentations sont en cours, voici quelques liens : http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html

http://www.ece.ucsb.edu/~manj/ece181bS04/L14(morestereo).pdf

Dans votre cas, vous n'avez pas de caméra stéréo, mais la profondeur peut être évaluée à l'aide de la vidéo. http://www.springerlink.com/content/g0n11713444148l2/

Je pense que ce qui précède sera ce qui vous aidera le plus.

la recherche a tellement progressé qu'il est possible d'évaluer la profondeur (mais pas de manière satisfaisante) à partir d'une seule image monoculaire http://www.cs.cornell.edu/~asaxena/learningdepth/

0 votes

Je pense qu'il a une séquence monoculaire et que l'article que vous avez cité ne donnera pas la réel profondeur, seulement jusqu'à un facteur d'échelle

0 votes

Vous avez raison. mais vous pouvez toujours l'utiliser pour pointer vers quelque chose sur le véhicule lui-même, qui est à une distance connue ; vous avez donc le facteur d'échelle !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X