J'ai un fichier vidéo enregistré à l'avant d'un véhicule en mouvement. Je vais utiliser OpenCV pour la détection et la reconnaissance d'objets mais je suis coincé 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 dans le monde réel, mais c'est tout. Je ne peux faire aucune hypothèse sur l'objet que je suis en train de suivre. Je prévois de l'utiliser pour suivre et suivre des objets sans entrer en collision avec eux. Idéalement, je voudrais utiliser ces données pour dériver la position réelle de l'objet, ce que je pourrais faire si je pouvais déterminer la distance de la caméra à l'objet.
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 nous obtenons avec nos yeux qui peuvent gagner une perception de profondeur en regardant le même objet sous des angles légèrement différents. Puisque vous vous déplacez, vous pouvez utiliser deux images vidéo successives pour obtenir votre angle légèrement différent.
En utilisant des calculs de parallaxe, vous pouvez déterminer la taille et la distance relative des objets (les uns par rapport aux autres). Mais, si vous voulez la taille et la distance absolue, vous aurez besoin d'un point de référence connu.
Vous aurez également besoin de connaître la vitesse et la direction parcourues (ainsi que la fréquence d'images vidéo) pour effectuer les calculs. Vous pourrait être capable de dériver la vitesse du véhicule en utilisant les 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 points de l'orbite terrestre autour du Soleil. J'ai pu créer des images 3D à partir d'une fenêtre d'avion en prenant deux photographies en une courte succession.
La technologie et les calculs exacts (même si je les connaissais du haut de ma tête) sont façon en dehors du cadre de discussion ici. Si je peux trouver une référence décente, je la posterai ici.
Votre problème est assez standard dans le domaine.
vous devez calibrer votre appareil photo. Cela peut être fait hors ligne (rend la vie beaucoup plus simple) ou en ligne grâce à l'auto-étalonnage.
Calibrez-le hors ligne - s'il vous plaît.
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 autres). Ceci est bien décrit dans ce tutoriel OpenCV .
Vous devrez utiliser les informations GPS pour trouver l'orientation relative entre les caméras dans les scènes successives (qui pourrait être problématique en raison du bruit inhérent à la plupart des unités GPS), à savoir le [~ # ~] r [~ # ~] et t mentionnés dans le tutoriel ou la rotation et la translation entre les deux caméras.
Une fois que vous avez résolu tout cela, vous aurez deux matrices de projection - des représentations des caméras sur ces scènes successives. En utilisant l'une de ces matrices de caméras, vous pouvez "projeter" un point 3D [~ # ~] m [~ # ~] sur la scène vers l'image 2D de la caméra sur coordonnée pixel m (comme dans le tutoriel).
Nous l'utiliserons pour trianguler le vrai point 3D à partir des points 2D trouvés dans votre vidéo.
utilisez 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 y a plusieurs détecteurs disponibles, je recommande SURF puisque vous avez OpenCV qui a également plusieurs autres détecteurs comme coins Shi-Tomasi , - Harris , etc .
Une fois que vous avez suivi les points de votre objet à travers la séquence et obtenu les coordonnées de pixels 2D correspondantes, vous devez trianguler pour le point 3D le mieux adapté à votre matrice de projection et à vos points 2D.
L'image ci-dessus capture bien l'incertitude et la façon dont un point 3D le mieux adapté est calculé. Bien sûr, dans votre cas, les caméras sont probablement face à face!
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 dans la plupart des cas l'origine) et le point.
Ce n'est évidemment pas facile mais ce n'est pas si difficile non plus. Je recommande l'excellent livre de Hartley et Zisserman Multiple View Geometry qui a décrit tout ce qui précède en détail explicite avec du code MATLAB pour démarrer.
Amusez-vous et continuez à poser des questions!
Vous devez identifier les mêmes points dans le 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 disposez d'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 aux points identifiés. La trigonométrie vous donne la longueur des côtés inconnus de les traînées 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 prenant des photos successives. Donc, si votre véhicule se déplace à 1 m/s et que vous prenez des fameuses à chaque seconde, les cadres successifs vous donneront une ligne de base de 1 m qui devrait être bonne pour mesurer la distance des objets jusqu'à, disons, 5 m de distance. Si vous devez éloigner des objets plus loin que les cadres utilisés doivent être plus éloignés - cependant des objets plus éloignés seront visibles plus longtemps.
L'observateur à F1 voit la cible à T avec un angle a1 par rapport au vecteur vitesse. L'observateur déplace la distance b vers F2. Voir la cible en T avec l'angle a2.
Requis pour trouver r1, distance de la cible à F1
L'identité trigonométrique du 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 de vitesse de l'observateur
z est la distance de F2 à l'intersection avec x
Résolution pour r1
r1 = b/(c3 - c1. c4/c2)
Deux caméras pour détecter la parallaxe. C'est ce que font les humains.
modifier
Veuillez consulter la réponse de ravenspoint pour plus de détails. Gardez également à l'esprit qu'une seule caméra avec séparateur suffirait probablement.
utilisez des cartes de disparité stéréo. beaucoup d'implémentations sont à flot, 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 en utilisant la vidéo http://www.springerlink.com/content/g0n11713444148l2/
Je pense que ce qui précède sera ce qui pourrait vous aider le plus.
la recherche a progressé jusqu'à présent que la profondeur peut être évaluée (mais pas de manière satisfaisante) à partir d'une seule image monoculaire http://www.cs.cornell.edu/~asaxena/learningdepth/
Quelqu'un, s'il vous plaît, corrigez-moi si je me trompe, mais il me semble que si vous utilisez simplement une seule caméra et que vous comptez simplement sur une solution logicielle, tout traitement que vous pourriez faire serait sujet à de faux positifs. Je doute fortement qu'il existe un traitement qui pourrait faire la différence entre des objets qui sont vraiment à la distance perçue et ceux qui ne semblent l'être qu'à cette distance (comme la "perspective forcée") dans les films.
Avez-vous des chances d'ajouter un capteur à ultrasons?
vous devez d'abord calibrer votre caméra afin de pouvoir obtenir la relation entre les positions des objets dans le plan de la caméra et leurs positions dans le plan du monde réel, si vous utilisez une caméra, vous pouvez donc utiliser la "technique du flux optique" si vous utilisez deux caméras, vous utilisez simplement un simple triangulatio pour trouver la position réelle (il sera facile de trouver la distance des objets) mais le problème avec ce deuxième méthose est la correspondance, ce qui signifie comment pouvez-vous trouver la position d'un objet 'x' dans camera2 si vous connaissez déjà sa position dans camera1 et ici vous pouvez utiliser l'algorithme 'SIFT'. je viens de vous donner quelques mots clés souhaitant que cela puisse vous aider.
Mettre et objet de taille connue dans le champ de vision des caméras. De cette façon, vous pouvez avoir une métrique plus objective pour mesurer les distances angular. Sans un deuxième point de vue/caméra, vous serez limité à l'estimation de la taille/distance mais au moins ce ne sera pas une supposition complète .