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; 
}

也许用它来从位置中提取颜色?不确定我这样做是否正确,但在那之后我应该重新运行这个方法,比较两个数组的相似之处吗?如果相似度的数量达到某个阈值,则声明图像已更改?

4

3 回答 3

1

检测运动的一种方法是分析考虑整个图像或子图像在不同时间(nn-1n-2,...)的像素颜色变化。在这种情况下,您正在考虑使用固定相机。您可能有两个阈值:

  1. 定义两个像素不同的颜色通道变化阈值。
  2. 图像之间不同像素的阈值要考虑存在移动。换句话说:在时间nn-1的同一场景的两个图像只有 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 回答
0

通过阈值比较两个值将作为一个很好的指标。也许,您可以计算每个数组的平均值以确定颜色并比较两者?如果您不想要阈值,只需使用 .hashCode();

于 2013-11-12T17:26:03.403 回答