2

簡単なアルゴリズムを使用して異なるピクセルの数を数えることで、2 つの画像を区別し始めました。

private int returnCountOfDifferentPixels(String pic1, String pic2)
    {
        Bitmap i1 = loadBitmap(pic1);
        Bitmap i2 = loadBitmap(pic2);
        int count=0;

        for (int y = 0; y < i1.getHeight(); ++y)
               for (int x = 0; x < i1.getWidth(); ++x)
                    if (i1.getPixel(x, y) != i2.getPixel(x, y)) 
                        {
                        count++;
                        }

          return count;

    }

しかし、このアプローチは最初の形では効率が悪いように思われます。なぜなら、非常によく似た写真でも異なる非常に多くのピクセルが常に存在するからです。2 つのピクセルが実際にそれほど異なるかどうかを判断する方法を考えていました。Android の bitmap.getpixel(x,y) は Color オブジェクトを返します。

モーション検出を支援するために、2 つの Color オブジェクトを適切に区別するにはどうすればよいですか?

4

2 に答える 2

2

その通りです。ノイズやその他の要因により、通常、ビデオ ストリームには多くの生のピクセルの変化があります。以下に、考慮すべきいくつかのオプションを示します。

  1. 最初に画像をぼかします。理想的には、ガウス フィルターまたは単純なボックス フィルターを使用します。これは、隣接するピクセルとピクセル自体の (加重) 平均を取ることを意味します。これにより、センサーのノイズがかなり減少するはずです。

  2. countあるしきい値よりも大きい場合にのみ差を追加します。これには、実際に大きく変化したピクセルのみを考慮するという効果があります。これは実装が非常に簡単で、すでに問題を単独で解決している可能性があります。

考えてみてください。まず、この 2 つのオプションを試してみてください。うまくいかない場合は、さらにいくつかのオプションを提供できます。

編集:実際には違いを合計しているのではなく、異なるピクセルを数えているだけであることがわかりました。これは、オプション 2 と組み合わせれば問題ありません。オプション 1 も機能しますが、やり過ぎかもしれません。

また、2 つの色の違いを調べるには、Color クラスのメソッドを使用します。

int p1 = i1.getPixel(x, y);
int p2 = i2.getPixel(x, y);
int totalDiff = Color.red(p1) - Color.red(p2) + Color.green(p1) - Color.green(p2) + Color.blue(p1) - Color.blue(p2);

totalDiffこれで、貢献するために超えなければならないしきい値を考え出すことができますcount

もちろん、さまざまな方法でこれらの数値をいじることができます。たとえば、上記のコードは、ピクセル強度 (明るさ) の変化のみを計算します。色相と彩度の変化も考慮したい場合は、次totalDiffのように計算する必要があります。

int totalDiff = Math.abs(Color.red(p1) - Color.red(p2)) + Math.abs(Color.green(p1) - Color.green(p2)) + Math.abs(Color.blue(p1) - Color.blue(p2));

Colorまた、たとえばの他のメソッドも見てくださいRGBToHSV(...)

于 2012-05-07T20:28:10.867 に答える
0

これは本質的に非常によく似た別の回答であることは知っていますが、別の形で言い換えると、解決策を探している人にとって役立つかもしれません。これには、時間の経過とともに 2 つ以上の画像が含まれます。文字通りだけの場合、これは機能しませんが、同等の方法は機能します。

各フレームのすべてのピクセルの履歴を実行します。たとえば、各ピクセルについて: history[x, y] = (history[x, y] * (w - 1) + get_pixel(x, y)) / w

どこwにあるかもしれませんw = 20。高ければ高いほどw、モーションのスパイクが大きくなりますが、モーションがリセットされるまでに長いモーションを逃さなければなりません。

次に、何かが変更されたかどうかを判断するために、各ピクセルに対してこれを実行できます。

changed_delta = abs(history[x, y] - get_pixel(x, y))

total_delta += changed_delta

ほとんどのノイズが安定し、動きが発生すると大きな違いが得られることがわかります。基本的に、多くのフレームを取得し、最新のフレームに対して多くのフレームからモーションを検出しています。

また、動きの位置を検出するには、画像を小さな断片に分割し、個別に行うことを検討してください。次に、1 つの画像を個別の画像のグリッドとして扱うことで、オブジェクトを見つけて画面全体で追跡できます。

于 2016-06-02T20:35:37.057 に答える