In [3]:
from IPython.display import Image
repere = Image("repere.png")

Triangulation d'une image 2D en 3D

Cette méthode consiste à convertir une image 2D ne possédant que les tracés des lasers en points dans un repère tri-dimensionnel sur base de l'unique connaissance de :

  • l'angle de vision de la camera,
  • l'orientation (angle) du laser,
  • la distance entre le laser et l'oeil de la camera.

Notions

Avant tout chose, posons le repère avec l'origine correspondant à la position de l'oeil de la camera. Un dessin vaut mieux qu'un long discours :


In [4]:
repere


Out[4]:

d = point illuminé par un rayon du laser (pixel étudié).

L = largeur de l’image. l = distance (perpendiculaire) du milieu de l’image au point d.

H = hauteur de l’image. h = distance (perpendiculaire) du bas de l’image au point d.

α = angle ouverture de la camera. γ = angle inclinaison du laser (plan horizontal).

P = plan dessiné par le laser. D = rayon (droite) de la camera produisant le pixel sur l’image.

Rappels

L'équation d'une $\textbf{droite}$ est définie par 2 points (ou 1 point et 1 vecteur directeur) :

$ D \equiv p_{0} + (p_{1}-p_{0})*\rho $

autrement dit,

$ D \equiv p_{0} + \overrightarrow{d}*\rho $

L'équation d'un $\textbf{plan}$ est définie par 3 points (ou 1 point et 2 vecteurs directeurs) :

$ P \equiv p_{0} + (p_{1}-p_{0})*\lambda + (p_{2}-p_{0})*\mu $

autrement dit,

$ P \equiv p_{0} + \overrightarrow{a}*\lambda + \overrightarrow{b}*\mu $

L'intersection du plan P et de la droite D donne donc l'équation suivante :

$ p_{d0} + \overrightarrow{d}*\rho = p_{p0} + \overrightarrow{a}*\lambda + \overrightarrow{b}*\mu $

$ p_{d0} - p_{p0} = \overrightarrow{a}*\lambda + \overrightarrow{b}*\mu - \overrightarrow{d}*\rho $

$ \begin{pmatrix} p_{dx}-p_{px} \\ p_{dy}-p_{py} \\ p_{dz}-p_{pz} \end{pmatrix} = \begin{pmatrix} a_{x} & b_{x} & d_{x} \\ a_{y} & b_{y} & d_{y} \\ a_{z} & b_{z} & d_{z} \end{pmatrix} * \begin{pmatrix} \lambda \\ \mu \\ \rho \end{pmatrix} $

$ \begin{pmatrix} \lambda \\ \mu \\ \rho \end{pmatrix} = \begin{pmatrix} a_{x} & b_{x} & d_{x} \\ a_{y} & b_{y} & d_{y} \\ a_{z} & b_{z} & d_{z} \end{pmatrix}^{-1} * \begin{pmatrix} p_{dx}-p_{px} \\ p_{dy}-p_{py} \\ p_{dz}-p_{pz} \end{pmatrix} $

où,

$ \begin{pmatrix} a_{x} & b_{x} & d_{x} \\ a_{y} & b_{y} & d_{y} \\ a_{z} & b_{z} & d_{z} \end{pmatrix}^{-1} = \frac{1}{det} \begin{pmatrix} b_{y}*d_{z}-b_{z}*d_{y} & b_{z}*d_{x}-b_{x}*d_{z} & b_{x}*d_{y}-b_{y}*d_{x} \\ a_{z}*d_{y}-a_{y}*d_{z} & a_{x}*d_{z}-a_{z}*d_{x} & a_{y}*d_{x}-a_{x}*d_{y} \\ a_{y}*b_{z}-a_{z}*b_{y} & a_{z}*b_{x}-a_{x}*b_{z} & a_{x}*b_{y}-a_{y}*b_{x}\end{pmatrix}$

Mise en équation du problème

Comme nous travaillons avec un laser linéaire, nous allons faire l'hypothèse que celui-ci dessine un plan P vertical défini par:

  • le vecteur directeur vertical $\overrightarrow{a} = \begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix}$ ,
  • le vecteur directeur défini par l'orientation du laser $\overrightarrow{b} = \begin{pmatrix} -cos(\gamma) \\ sin(\gamma) \\ 0 \end{pmatrix}$
  • le point de fixation du laser $p_{p} = \begin{pmatrix} k \\ 0 \\ 0 \end{pmatrix}$

Et la droite D représentant le 'rayon' partant de la camera est définie par:

  • le point correspondant à la position de la camera $p_{d} = \begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix}$
  • le vecteur directeur défini par la position obsolue du pixel dans l'image $\overrightarrow{d} = \begin{pmatrix} l \\ \frac{L}{2*tg(\frac{\alpha}{2})} \\ h \end{pmatrix}$ (en supposant les pixels carrés)

L'équation du problème devient donc la suivante :

$ \begin{pmatrix} \lambda \\ \mu \\ \rho \end{pmatrix} = \begin{pmatrix} 0 & -cos(\gamma) & l \\ 0 & sin(\gamma) & \frac{L}{2*tg(\frac{\alpha}{2})} \\ 1 & 0 & h \end{pmatrix}^{-1} * \begin{pmatrix} -k \\ 0 \\ 0 \end{pmatrix} $

$ \begin{pmatrix} \lambda \\ \mu \\ \rho \end{pmatrix} = \frac{1}{\frac{-L*cos(\gamma)}{2*tg(\frac{\alpha}{2})}- l*sin(\gamma)}* \begin{pmatrix} sin(\gamma)*h & cos(\gamma)*h & -\frac{-L*cos(\gamma)}{2*tg(\frac{\alpha}{2})}-l*sin(\gamma) \\ \frac{L}{2*tg(\frac{\alpha}{2})} & -l & 0 \\ -sin(\gamma) & -cos(\gamma) & 0 \end{pmatrix}* \begin{pmatrix} -k \\ 0 \\ 0 \end{pmatrix} $

Seul $\rho$ est nécessaire (et l'équation de la droite D). Nous allons également isoler le l de la fraction afin de grouper au maximum les constantes,

$ \rho = \frac{-k*sin(\gamma)}{\frac{L*cotg(\gamma)}{2*tg(\frac{\alpha}{2})}+l} = \frac{-k}{\frac{L}{2*tg(\gamma)*tg(\frac{\alpha}{2})}+l} $

En résumé,

$ c = \frac{L}{2*tg(\frac{\alpha}{2})} $

$ \rho = \pm \frac{k}{\frac{c}{tan(\gamma)} + l} $

$ \begin{pmatrix} x \\ y \\ z \end{pmatrix} = \rho* \begin{pmatrix} l \\ c \\ h \end{pmatrix} $

Résolution


In [ ]: