In [3]:
from IPython.display import Image
repere = Image("repere.png")
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 :
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.
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}$
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:
Et la droite D représentant le 'rayon' partant de la camera est définie par:
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} $
In [ ]: