我想在图像中找到图像.我这样做是为了桌面自动化.在这一刻,我想要快速,而不是精确.因此,我决定仅根据相同的平均颜色匹配相似的图像.
如果我在桌面上选择几个图标,例如:
我将搜索最后一个(我仍然想知道这个文件是什么):
您可以清楚地看到最有可能匹配的内容:
在不同的情况下,这可能不起作用.但是,当给出图像大小时,它应该非常可靠且闪电般快速.
我可以获得一个截图作为BufferedImage对象:
MSWindow window = MSWindow.windowFromName("Firefox", false);
BufferedImage img = window.screenshot();
//Or, if I can estimate smaller region for searching:
BufferedImage img2 = window.screenshotCrop(20,20,50,50);
当然,搜索图像的图像将从保存在文件中的模板加载:
BufferedImage img = ImageIO.read(...whatever goes in there, I'm still confused...);
我解释了我所知道的一切,以便我们可以专注于唯一的问题:
>问:如何在缓冲图像上获得平均颜色?如何在该图像的子矩形上获得这样的平均颜色?
速度在这里获胜.在这种特殊情况下,我认为它比代码可读性更有价值.
解决方法:
我认为无论你做什么,你都会进行O(wh)操作,其中w是你的宽度,h是你的身高.
因此,我将发布这个(天真的)解决方案来完成您问题的第一部分,因为我不相信有更快的解决方案.
/*
* Where bi is your image, (x0,y0) is your upper left coordinate, and (w,h)
* are your width and height respectively
*/
public static Color averageColor(BufferedImage bi, int x0, int y0, int w,
int h) {
int x1 = x0 + w;
int y1 = y0 + h;
long sumr = 0, sumg = 0, sumb = 0;
for (int x = x0; x < x1; x++) {
for (int y = y0; y < y1; y++) {
Color pixel = new Color(bi.getRGB(x, y));
sumr += pixel.getRed();
sumg += pixel.getGreen();
sumb += pixel.getBlue();
}
}
int num = w * h;
return new Color(sumr / num, sumg / num, sumb / num);
}