速度計をタンクに固定する方法

画像



昔、男性が特定のカーシミュレーターをプレイしていて、テーブルに2つの大きなダイヤルインジケーター(間違っていない場合は電圧計)があり、スピードメーターとタコメーターの役割を果たすビデオを見ました。 数年後、私は似たようなことを繰り返すことにしました。



私はWorld of Tanksでしかプレイしていませんでした(そして、10レベルに達することなくずっと前に放棄しました)ので、私はタンクですべてを強化することにしました。 デバッグを除くすべての開発はLinux上で行われ、PCで実行されるコードはpythonで書かれていることをすぐに言わなければなりません。 はい、遅いです。コードを見せてくれるのは恥ずかしいので、それなしでもできます。



スピードメーター



スピードメーターとして、私は矢印のあるものを使用することも決めました。この役割は、矢印表示のある古くて安価な中国のマルチメーターに落ちました。



必要なすべてのハーネスが搭載されたデバッグボードがあるため、ATMEGA16が速度計を制御することが決定されました。 通信PC-> MKは、シリアルポートを介して構成されます。



ディスプレイとMK








ファームウェアはプリミティブであり、アルゴリズムは次のようなものです。

  1. 無限ループで、USARTを聴きます。
  2. 速度データを受信すると、有効性が確認され、PWMを使用して必要な電圧レベルが設定されました。




これは最も単純な部分であり、速度値を取得する必要がありました。 すぐに2つのアイデアが生まれました。ゲームプロセスからデータを取得する(求められているアドレスを見つけるためのウールメモリ)か、インターフェイス自体から直接値をスキャンして認識します。 私にとって最後の1つは完全に暗い森で、面白そうでした。



大切なスピードを手に入れる



まず、ゲームのスクリーンショットを取得します。問題はないと単純に信じていましたが、結局のところ、DirectXモードで画面をキャプチャすることは最も簡単なことではありませんが、もちろん解決できます。 ゲームインターフェースの代わりに、マレビッチの長方形が得られました。 役に立たない画像を、二度と考えずに、ウィンドウモードに切り替えてゲームウィンドウを全画面に拡大しました。全画面モードと情報コンテンツの違いはわずかですが、画面が著しくキャプチャされ始めました。



私は画面全体をキャプチャしませんでしたが、約200x200ピクセルの小さな領域で、すでにそれを使用していました。



ゲームインターフェイスのスクリーンショットとダメージパネル








それから、OpenCVのようなすばらしいものを自分で発見しました。それによって、画像を漂白し、色を反転しました(最初は背景が暗く、数字が明るい)。



速度は最大2桁の数値で、等幅フォントで、これも満足です。ビットが厳密に定義された場所を占有し、速度の値が変わってもシフトしなかったからです。 これらの2つのポジションを選択して認識するだけでした。







認識


価値の認識私は標準との比較に縮小しました。 比較は、イメージハッシュの違いに基づいていました。差が小さいほど、これが正確な数である確率が高くなります。 私はすべての数字の多くの標準を作成し(たとえば、1番目と2番目のカテゴリから50個の数字3)、自分の位置をキャプチャし、番号を付け、顔の値に応じてフォルダーに手動で並べ替えました。 そして、彼は1つの名目(つまり、ユニットとユニットなど)の内側のハッシュを比較して、同じ値がどれだけ互いに異なるかを見つけました。 その後、彼は同様のスタイル(たとえば、3〜8)でミックスし、再び違いを考慮しました。 この情報は、精度を判断する上で重要でした。 しかし、判明したように、境界値がありました。 時々ではありませんが、心地よくはありませんが、3と8と9がすべて混同されることもありました。 この理由は、半透明の背景と数字自体の非常に小さなサイズでした。



クライアントに入り、標準のダメージパネルをカスタムパネルに変更する必要がありました。カスタムパネルでは、フォントを2倍にし、背景色を変更し、透明度を完全にオフにしました。 私は新しいパネルでテストを実施しましたが、予想どおり、認識の精度は桁違いに向上しました。 色の反転も拒否しました。



新しいパネルと数字








すべてのコードをまとめてループにラップし、原則として、ビデオで起こったことを追い払った。 最後の更新後のWoTクライアント自体は大幅にスローダウンし始めましたが、ラグの間に(インターフェース内の)速度計が完全に不適切な値を示す場合があります。 仕事は完璧ではありませんが、結果には満足しています。







キャプチャには、 Python Imaging Library(PIL)を使用しました

画像を操作するには: OpenCV



ラフな文章をおpoびします。これはHabréについての私の最初の記事です。



All Articles