おもちゃの銃を表現するために手に持った携帯電話を使用して、それを動かし (「照準」とします)、方向データ (ピッチ、ヨー、ロール) をラップトップに転送します。ウェブカメラのフィードが前方を向いています。
ユーザーが携帯電話を正面に持っている間にラップトップの Enter キーを押すようにして、アプリケーションを開始します。これが最初のキャリブレーション手順であり、最初のヨー/ピッチを参考にして中心を目指します。
次に、十字線を描画するカメラ フィード ループ中に、これらの初期キャリブレーション値に対するピッチ/ヨーの変化を測定し、それらを使用して十字線を左/右/上/下に再描画します。
これは私の現在のコードです:
pitchDiff = initPitch - newPitch #corresponds to Y axis
yawDiff = 0-(initYaw - newYaw) #corresponds to X axis
pitchChangeFactor = 10
yawChangeFactor = 10
xC = int((imgWidth/2) + yawDiff*yawChangeFactor)
yC = int((imgHeight/2) - pitchDiff*pitchChangeFactor)
## THE TARGETING GUI
cR = 40 #circle radius
cv2.circle(img, (xC,yC), cR, (20, 20, 255), 3)
この質問で私が求めているのは、これをより正確かつスムーズに行う方法です。ジャイロ データはノイズが多いため、1 秒あたり 30 フレームごとにサンプリングすると、実際にはピッチ/ヨーについて約 60 のジャイロ読み取り値の中央値を取得します。
また、動的モデルが間違っていると思います。角度の変化に応じて、ターゲットの十字線を画面上で一定量だけ動かしているだけです。三角関数が必要だと思いますが、何を試せばよいかわかりません。カメラを 1 台しか使用していないため、明らかに深度データが不足しています。ただし、狙いたいターゲットは、たとえば、3〜4メートル前方にあると想定して問題ありません。
助けてくれてありがとう