1

画像の特定の位置を調べて、選択したピクセルの色が変化したかどうかを確認したいのですが、どうすればよいですか? (動きを確認しようとしています)

私はこのようなことができると思っていました:

public int[] rectanglePixels(BufferdImage img, Rectangle Range) {
  int[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
  int[] boxColors;  
    for(int y = 0; y < img.getHeight(); y++) {
      for(int x = 0; x < img.getWidth; x++) {
        boxColors = pixels[(x & Range.width) * Range.x + (y & Range.height) * Range.y * width]
      }
    }
  return boxColors; 
}

多分それを使って位置から色を抽出しますか?私がそれを正しく行っているかどうかはわかりませんが、その後、このメソッドを再実行して、2 つの配列の類似性を比較する必要がありますか? 類似性の数があるしきい値に達した場合、画像が変更されたと宣言しますか?

4

3 に答える 3

1

動きを検出する 1 つの方法は、画像全体または異なる時間 ( nn-1n-2、...)のサブ画像を考慮したピクセルの色の変化を分析することです。この場合、固定カメラを検討しています。次の 2 つのしきい値がある場合があります。

  1. 2 つのピクセルが異なることを定義するカラー チャネル変動のしきい値。
  2. 動きがあると見なす画像間の明確なピクセルのしきい値。つまり、時刻nn-1における同じシーンの 2 つの画像には、10 個の異なるピクセルしかありません。それは本当の動きですか、それともただのノイズですか?

以下は、カラー チャネルのしきい値を指定して、画像内の明確なピクセルに対抗する方法を示す例です。

for(int y=0; y<imageA.getHeight(); y++){
        for(int x=0; x<imageA.getWidth(); x++){

            redA = imageA.getIntComponent0(x, y);
            greenA = imageA.getIntComponent1(x, y);
            blueA = imageA.getIntComponent2(x, y);

            redB = imageB.getIntComponent0(x, y);
            greenB = imageB.getIntComponent1(x, y);
            blueB = imageB.getIntComponent2(x, y);

            if
            (
                Math.abs(redA-redB)> colorThreshold ||
                Math.abs(greenA-greenB)> colorThreshold||
                Math.abs(blueA-blueB)> colorThreshold
            )
            {
                distinctPixels++;
            }
        }
    }       

ただし、そのためのMarvinプラグインがあります。このソースコードの例を確認してください。下の画像に示すように、「動き」を含む領域を検出して表示します。

ここに画像の説明を入力

この目的のために背景を決定/減算したり、カメラの動きを処理したりする、より洗練されたアプローチがあります。最も単純なシナリオから始めて、より複雑なシナリオに進むべきだと思います。

于 2013-11-13T12:27:03.580 に答える
0

ループや追加の配列を実際にいじる場合を除き、BufferedImage.getRGB(startX, startY, w, h, rgbArray, offset, scansize)を使用する必要があります。

于 2013-11-12T17:23:19.620 に答える