J'ai capturé des positions de voiture à différentes images de la vidéo . Supposons que le centre de gravité de la voiture (voiture latérale qui vient vers nous dans les images) à l'image vidéo1 est P (x1, y1) et Q (x2, y2) à l'image vidéo4.
Est-il possible de représenter des points P et Q en 3D? afin que je puisse calculer la distance de pixel correcte d (PQ) et enfin calculer la distance réelle
Remarque: u peut supposer que la caméra est stationnaire, placée à une hauteur de 10 m du niveau du sol .u peut également supposer toutes les données appropriées si vous le souhaitez, vous pouvez également consulter la figure suivante.
Réponses:
[EDITÉ] Voici comment c'est fait.
Étapes: 1. Isolez la pièce Road Divider.
Ensuite, à l'aide de Houghlines, recherchez les lignes les plus longues dans Image. Découvrez les points d'extrema qui traversent la frontière de l'image. Vous avez obtenu les points quadilatéraux. J'ai sauté cette partie en les choisissant manuellement. Dans mon cas, la largeur de la route en haut de l'image est de 10 et en bas de 60.
Maintenant, pour la destination, nous devons Image afin que le diviseur quadilatéral ait une largeur uniforme de 60, donc nous enregistrons dans un autre tableau de nouveaux points, qui ont les mêmes points inférieurs, mais les points supérieurs sont modifiés car ils forment un rectangle avec une hauteur identique à l'image (ou plus grand, vous pouvez ajuster comme il vous convient après l'avoir exécuté une fois et voir les résultats), mais largeur 60. N'oubliez pas, nous transformons notre image de telle sorte que le séparateur s'insère dans cette zone rectangulaire. L'image changera automatiquement.
Maintenant, en utilisant
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
d'ouverture sur les points quadilatéraux initiaux et de destination, nous obtenons une matrice de transformation que nous appliquons à notre image de test.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Vous verrez que beaucoup de zones sont recadrées pour s'adapter à la sortie dans la taille de l'image d'entrée. Cependant, vous remarquerez que l'image est transformée pour obtenir un diviseur parallèle, comme nous l'espérions. En effectuant des traductions et des trucs et en prenant une image de sortie de plus grande taille, vous obtiendrez cela. Nous ne pouvons jamais obtenir une image de sortie parfaitement enveloppée, car sa taille peut être très grande. Mais nous atteindrons une contrainte qui remplira notre tâche. Voici la dernière image:
la source
Cela ressemble à une sorte de problème de lancer de rayons . Si vous connaissez la position et l'orientation de votre caméra, vous devriez pouvoir calculer la matrice de projection 3x4 et son inverse.
Cela devrait vous permettre de convertir des points d'image en position 3D (sur la route). Cette discussion http://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.html pourrait contenir des informations plus utiles.
Quant à l'appliquer en matlab. Il existe un affine3d que vous pouvez utiliser pour stocker la transformation. Il peut également y avoir des choses utiles pour les projections / ray-tracing dans l'échange de fichiers comme http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracer mais je n'ai pas cherché en détail pour trouver ce qui est pertinent pour quoi tu veux.
la source
Si vous pouvez calibrer votre caméra et si vous pouvez détecter certains points de référence sur la surface de la route, vous pouvez obtenir les coordonnées 3D des points d'image qui se trouvent sur la route. Cela suppose que la route est dans un avion. En d'autres termes, si vous pouvez détecter une voiture, vous pouvez calculer les coordonnées 3D du bas de la voiture. Voir cet exemple dans MATLAB à l'aide de la boîte à outils du système de vision par ordinateur.
la source