コードは「究極の真実」であると主張せず、多くは簡素化されています(ある場所では、複製はある意味で許可されていました。 それでも、コードは機能し、オブジェクトを追跡し、場所に関する情報を提供し、オブジェクトのシェードを動的に計算できます(照明が変更された場合)。
興味のある方のために-猫をお願いします。
AForgeへの短い遠足。
フレームワークは一連のライブラリであり、それぞれが特定の種類の問題を解決するように設計されています。
- AForge.Imaging-画像処理用のフィルターと計算を備えたライブラリ。
- AForge.Vision-マシンビジョンライブラリ。
- AForge.Neuro-ニューラルネットワークを操作するためのライブラリ。
- AForge.Geneti c-遺伝的アルゴリズムを使用するためのライブラリ。
- AForge.Fuzzy-ファジー計算のライブラリ。
- AForge.MachineLearning-機械学習ライブラリ。
- AForge.Robotics-一部のRoboticsキットのサポートを提供するライブラリ。
- AForge.Video-ビデオ処理用のライブラリのセット。
ライブラリを備えた完全な例があります。
ユーザーインターフェース
私は自分のプロジェクトを最初から書いたわけではなく、Vision \ MotionDetectorの例をベースに取り上げました。 彼はすでに、ウェブカメラ、リモートウェブカメラ(JPEG、MJPEG url経由)に接続する方法と、特定のビデオファイルを開く方法を知っています(私は認めていませんが、試していません)。
元の例では、いくつかのアルゴリズムによってストリーム上の動きを識別できますが、最も簡単なのは、2つの連続するフレームの違いを見つけることです。
フォームコードはファイルごとに処理され、タスク専用にシャープ化されました。 [モーション]タブで、オブジェクト検索アルゴリズムを選択する必要があります。
次に、[カラートラッキングオブジェクトの定義]フォームでオブジェクトを選択します。
オブジェクトに関する情報は、メインフォームのステータスバーに表示されます。
追加の設定として、色差のしきい値が提供されます。これは、単一の色を追跡するのではなく、そのバリエーションを考慮する機能です。
さらに、ユーザーは処理中にオブジェクトの色を追跡するかどうかを指定できます(つまり、オブジェクト自体が色によって追跡されるだけでなく、オブジェクトの新しい色が処理中に計算されます)。
次のバンには、Aforgeモーションディテクターが標準装備されています。 オブジェクトは、画像内で異なる方法で強調表示できます。
実装
AForge.Vision.Motion。 IMotionDetector-画像間の違いを検索できるインターフェース。 処理を実行するColorDetectionクラスは、 それから継承されます。
ユーザーインターフェイスと対話するために、後続のフレームの処理を初期化するInitializeメソッド(Image image、Rectangle rect)が追加されました。 ここでは、ターゲット(画像内の選択された長方形)に関する情報が収集されます。 情報は、選択した領域の主要な色で収集されます(このプロパティは、追跡の基礎として引き続き機能します)。 ターゲットの位置も記憶されます。
IMotionDetectorには次のメソッドがあります。
- ProcessFrame(AForge.Imaging.UnmanagedImage)-画像キャプチャデバイスから受信した次のフレームをオブジェクトに転送します。 次のフレームは、タイプAForge.Imaging.UnmanagedImageのオブジェクトです。このクラスを使用すると、 Bitmap.GetPixel(x、y)よりもはるかに高速にピクセルにアプローチできます。
- Reset ()-クラスのコンテンツをリセットします。
プロパティ:
- AForge.Vision.Motion.IMotionDetector。 MotionFrameは、 AForge.Imaging型のプロパティです。 UnmanagedImage 。オブジェクトで領域を強調表示します。
- AForge.Vision.Motion.IMotionDetector。 MotionLevel- 「動きのレベル」(0〜1)-はかない値。 実装されていません。
アプリケーションのステータスバーの情報を更新するために、プロパティの取得が追加されました。
- ポイントセンター
- 四角形のBoundsBox
- カラーオブジェクト
ターゲットカラーだけでなく、いくつかのシェードも使用するために、Set Property DifferenceThresholdが使用されます。
フレームのメイン処理は、 ProcessFrame関数で発生します。 このアルゴリズムは、次の手順に分割できます。
- オブジェクトの存在領域を拡大します。 画面全体で新しい位置を検索するのではなく、前の位置に隣接する領域でのみ検索します。 これにより、ターゲットオブジェクトが同じ色の別のオブジェクト(画像の別の部分)と混同されないという観点から、検索がより正確になります。
- オブジェクトの支配的な色の極値を決定することにより、上記の領域内のオブジェクトの境界を計算します(可能な色偏差-DifferenceThresholdもここで考慮されます)。
- 「マスク」 MotionFrameを作成します。これにより、MotionDetectorは画像内のターゲットオブジェクトを強調表示できます。
- 次に、「平均色」と新しいオブジェクトのサイズが計算されます。
- オブジェクトが小さすぎる場合(たとえば、次のフレームで、ターゲットオブジェクトが別のオブジェクトで完全に覆われた場合)-前のフレームの処理で残った位置と色に関する情報は変更しません。
- それ以外の場合、オブジェクトの新しい位置と境界が記憶され、アルゴリズムがbool DynamicColorTrackingプロパティを使用して設定される色の変化を監視する場合、新しい計算された色も記憶されます。
これで画像処理が完了しました。
可能な改善
ゲームコンソールのコントローラーについては既に説明したので、通常、その色はフレーム内の他のオブジェクトとは対照的に異なります。 したがって、(隣接する領域だけでなく)フレーム全体でターゲットカラーの初期検索を実行できます。 これにより、高速移動中にオブジェクトを追跡できます。
関連リンク
• AforgeプロジェクトのWebサイト 。
• Aforge-CodeProjectに関する記事 。
PS depositfilesのソースへのリンク 。
Googleドキュメントのソースへのリンク
UPD。 テーマブログに転送されたカルマに感謝します。