Est-il possible de convertir une forme 2D en forme 3D?

8

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, voiture se déplaçant sur route vous pouvez également consulter la figure suivante.

vue latérale et vue de face

Sagar
la source
1
Marquer 50% de vos questions en gras n'aide vraiment pas.
jojek
1
@jojek monsieur j'ai ajouté une figure pour référence
sagar

Réponses:

4

[EDITÉ] Voici comment c'est fait.

Étapes: 1. Isolez la pièce Road Divider.

Image recadréeIsolez les bandes jaunes

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.

Le quadilatéral à transformer

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());

Image transformée

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:

Image finale transformée

shreelock
la source
1
@Un monsieur Matlabber dans Matlab existe-t-il une fonction pour convertir la projection 2D en 3D?
sagar
Votre problème n'est pas un problème de projection 2D à 3D. C'est un problème de transformation homographique et de cartographie en perspective, puis de traitement ultérieur qui vous aidera à calculer la distance (ce que vous essayez d'accomplir en créant un «3d»). Peut - être que cette discussion peut vous aider.
shreelock
1
@Un Matlabber monsieur sa devient difficile à comprendre la transformation homographique et Perspective Mapping.i recherché sur google, mais sans avoir idée à ce sujet ..
sagar
Vous pouvez rechercher sur Google plusieurs exemples de transformation homographique et de cartographie en perspective. Il s'agit d'un sujet d'introduction, qui est enseigné dans de nombreux cours en ligne sur la vision par ordinateur. Je suis assez occupé en ce moment, sinon je vous aurais donné quelques références à leur sujet. Essayez de rechercher des cours sur le traitement d'image / vision par ordinateur, ils ont rarement des exercices de démonstration / programmation sur ce type de problèmes.
shreelock
@A Matlabber ok, je ferai ce que tu dis.Merci u.
sagar
3

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.

nivag
la source
Monsieur, il devient difficile de comprendre la transformation homographique et le mappage de perspective.i recherché sur google, vous liez également u donné, mais vous ne vous en faites pas une idée ..
sagar
1
@sagar Recherchez "Géométrie à vues multiples en vision par ordinateur" de Hartley & Zisserman. C'est LE livre expliquant l'homographie de manière naturelle (en utilisant des coordonnées homogènes, dans lesquelles la transformation est linéaire).
Libor
1

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.

Dima
la source