ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】正弦定理でカメラに映った2点から平面上の座標を計算する。

成果物

www.youtube.com
今回は、あらかじめわかっているaの長さと、カメラの画像と、カメラの向き、視野角から、視点を特定するプログラムを作りました。x,yとpredX,predYを比べるとおおよそ正確に予測できていることがわかります。スマホなどのセンサーが付いているデバイスで、水平方向のみ動いている場合は位置が特定できるはずです。

コード

今回は、バーチャル上のでのテストなので、飾りのコードがたくさん書いてあります。実際に実装する際は、もっと短く書くことができるはずです。

仕組み

この式を使って、カメラ画像上の位置からカメラ中心軸からの角度を求めます。L2は画面横のピクセル数の半分です。角度はラジアンです。fovはカメラの視野角です。(普通は60°ぐらい?)
 \begin{array}{l}
fov2=atan2\left(\frac{-l2}{\tan\frac{fov}{2}} ,\ ( l1-l2)\right) +\frac{PI}{2}\\
fov1=atan2\left(\frac{-l2}{\tan\frac{fov}{2}} ,\ ( l3-l2)\right) +\frac{PI}{2}
\end{array}
ここで求めたfovをもとに、三角形の内角A、B、Cが求められます。
 \begin{array}{l}
A=abs( fov1-fov2)\\
B=\frac{PI}{2} -fov1+angle\\
C=\frac{PI}{2} +fov2-angle
\end{array}
A、B、Cと辺BC(a)から、残りの二辺を求めることができ、それをもとに現在の視点を求めることができます。
 \begin{array}{l}
b=\frac{a\sin B}{\sin A}\\
c=\frac{a\sin C}{\sin A}\\
predX=-c\cos B\\
predY=c\sin B
\end{array}