4

2つの連続するスクリーンショット間を移動したパーツを検出できる高速アルゴリズムがあるかどうかを知りたいです。アルゴリズムは2つの画像を取得し、一方の画像に一連の(長方形の)領域と、もう一方の画像のどこに一致する領域があるかを表すベクトルを出力する必要があります。

これを、画面キャプチャ用に合理化されたロスレスビデオ圧縮アルゴリズムに使用したいと思います。これにより、モーション検出の通常のアプリケーションとは少し異なるユースケースになると思います。

  • 画像はスクリーンショットです。アーティファクトや画像ノイズが発生する可能性はほとんどありません
  • 画像の一部が移動すると、ピクセル単位で移動します。移動したパーツは通常、ピクセルの2%未満しか異なりません。
  • 移動する領域は大きく、長方形の形状をしていることがよくあります

ビデオ圧縮パイプラインには他のステップもあり、リアルタイムで実行する必要があるため、モーション検出は高速である必要があります。

何か役立つものはありますか?

4

4 に答える 4

2

Opencvは画像操作を詳細にカバーしており、このテーマに関する多数のチュートリアルがあります。

http://docs.opencv.org/doc/tutorials/tutorials.html

PDFには、Webサイトよりも多くのヒントがあります。Google for...opencvチュートリアルpdf...トップリンク。

メインのウェブサイト。 http://opencv.willowgarage.com/wiki/

基本的に、これをうまく機能させる画像に対して実行できる数学関数があります。畳み込みなど。

于 2012-08-24T09:17:21.110 に答える
2

私はいくつかの考えを持っています、そしてあなたが考えることができるおそらく実行可能な解決策。

まず、個々のピクセルデルタを追跡し、それらだけを送信/保存することを検討してください。通常のインタラクティブセッションでは、UIのごく一部を変更します。長時間のコンピューター使用セッションでは、ウィンドウの移動やサイズ変更は(逸話的に)あまり一般的ではない傾向があります。これにより、多くの余分な作業を行うことなく、入力されたテキスト、カーソルの動き、小さなUIの更新などの単純なものを効率的にキャプチャできます。

また、OSをより低いレベルでフックして、たとえばピクセルの表示リスト、または(最適には)「損傷した」長方形のリストを取得することを検討することもできます。たとえば、MacOSXのQuartzコンポジターはこの情報を提供します。これは、更新する対象をすばやく絞り込むのに役立ち、理想的な場合は、画面自体を効率的に表現できる場合があります。

Windows(ウィンドウマネージャー)のウィンドウに関する情報を照会できる場合は、表示されているウィンドウごとに個別のデータストリーム(ピクセルデルタ)を保存し、単純なディスプレイリストアプローチを適用して再生中にそれらを「レンダリング」できます。次に、表示リストを簡単に比較できるため、移動するウィンドウを識別するのは簡単です。

カーソルの位置に関するOSの情報を照会できる場合、カーソルの移動は通常、画面上のオブジェクトの移動(たとえば、ウィンドウの移動、アイコン、オブジェクトのドラッグなど)とよく相関するため、カーソルの移動を使用して移動のデルタをすばやく推定できます。これにより、画像を処理して動きのデルタを決定する必要がなくなります。

考えられる解決策(または上記で移動デルタを識別できない場合の最後の手段)について:実際には、単一の移動する長方形の(非常に一般的な)ケースをかなり簡単に処理できます。フレーム内で変化するすべてのピクセルのマスクを作成します。マスク内の最大の連結成分を特定します。長方形に近い場合は、移動した領域を表していると見なすことができます。ウィンドウが正確に直交して移動する(たとえば、完全にx方向またはy方向に移動する)場合、デルタ全体はわずかに大きい長方形のように見えます。または、ウィンドウが斜めに移動する場合、デルタ全体は8辺になります。形。どちらの方法でも、動きベクトルを推定し、領域を比較することでこれを検証できます。この処理は、考慮しなければならない詳細を意図的に無視することに注意してください。ウィンドウの近くで独立して移動するピクセル、または変化していないように見える領域(ウィンドウ内の単色の大きなブロックなど)。実際の実装では、上記のすべてに対処する必要があります。

最後に、リアルタイムのモーションエスティメーションに関する既存の文献を調べます。ビデオエンコーディングなどのモーションエスティメーションと補正の最適化には多くの作業が行われているため、上記の方法が不十分な場合は、その作業も使用できる可能性があります。

于 2012-08-23T04:16:39.440 に答える
2

フレーム間でモーションを追跡する一般的な方法は次のとおりです。1。画像1で追跡するポイントを決定します。2。入力画像のポイントを出力画像のポイントと相関させます。3。そこに到達した変換を決定します。

ステップ1には、多くの「トラッカー」があります。OpenCVには、「興味深い」ポイント(エッジの交差、極大など)を探すかなり標準的なものがあります。Kanade-Tomasiイメージトラッカーはその1つです。ただし、使用する場合は、ポイントの通常のグリッドを作成することをお勧めします。

ステップ2の場合、一般的な手法は、解像度を下げた四分木を使用することです。これは、画像を取得し、幅と高さの1/2の新しい画像を作成し、何度も繰り返すことを意味します。これで、上部に非常に低解像度の画像が表示され、桁違いに高速に検索でき、次に高い解像度の画像を表示するための境界ボックスが表示されます。あなたの場合、最適化は、最初に出力を見て、それがまったく変更されていないかどうかを確認し、ポイントx、yに一致するものが見つかったら、その隣にポイントx+1またはy+1などを探すことです。

ステップ3の場合、それはあなた次第です...画面の周りをスライドするウィンドウについて話している場合、一緒に移動するが、それ以外はエッジの外側と内側で同一である大きなパッチがあります。ただし、アニメーションがあると、物事がうまくいかなくなる可能性があります。また、マウスカーソル自体は、動き回ってアルゴリズムの有効性を低下させる小さなものです。

于 2012-08-24T17:27:04.523 に答える
1

私がしたこと

私は、ほとんどの動きを補正し、実装が簡単な単純な手法を実装しました。

各フレームは、一定のサイズ、たとえば8×8ピクセルのタイルに分割されます。コーデックは、カスタマイズ可能な数のタイルのリングバッファを管理します(例:2 20 ) 。これで、コーデックが入力ストリームで検出したタイルごとに、それがリングバッファですでに検出されているかどうかを確認します。そうである場合は、タイルインデックスを保存するだけで、そうでない場合は、タイルをリングバッファに保存します。

画像の一部が過去の画像からブロックサイズの倍数だけ移動された場合は常に、キャッシュ内にタイルが見つかる可能性が非常に高くなります。このようにして、ほとんどの動きを補正することができます。リングバッファでタイルを見つけるのは非常に高速なので、これはリアルタイムで実行するのに十分な速度です。

于 2012-08-24T15:55:29.510 に答える