gpt4 book ai didi

Java:检查图像是否移动

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:14 24 4
gpt4 key购买 nike

我想查看图像中的某个位置,看看所选像素的颜色是否发生了变化,我该怎么做? (我正在尝试检查是否有移动)

我想我可以做这样的事情:

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

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

最佳答案

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

  1. 定义两个像素不同的颜色 channel 变化阈值。
  2. 考虑存在运动的图像之间的不同像素的阈值。换句话说:同一场景在时间 nn-1 时的两张图像只有 10 个不同的像素。这是真实的运动还是只是噪音?

下面的示例展示了如何在给定颜色 channel 阈值的情况下计算图像中的离散像素。

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插件来做到这一点。检查这个source code example 。它检测并显示包含“运动”的区域,如下图所示。

enter image description here

有更复杂的方法可以为此目的确定/减去背景或处理相机运动。我想你应该从最简单的场景开始,然后再转向更复杂的场景。

关于Java:检查图像是否移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19935705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com