gpt4 book ai didi

java - 如何检测图像中的彩色矩形?

转载 作者:行者123 更新时间:2023-11-30 08:04:50 26 4
gpt4 key购买 nike

我正在尝试编写一个 AI 迷宫求解器程序。为此,我将在 GIMP 中绘制 2 色迷宫,红色为墙壁,蓝色为背景或地板。然后我将从 GIMP 导出为 png 并使用 ImageIO.read() 获取迷宫的 BufferedImage 对象。最后,我会将 Rectangle 碰撞框分配给墙壁并将它们存储在 ArrayList 中,这样我就可以使用 .intersect() 检查 Sprite 与墙壁。我可以在这里使用它。

但是,有一件事我想为我的程序做但我不知道该怎么做:一旦我将我的图像存储为 BufferedImage,我如何检测红色部分(所有完全相同的红色 RGB 阴影)并创建匹配的 Rectangle

注意事项:

  • 迷宫将始终具有固定大小(1000x1000 像素)。
  • 每个迷宫都有一个固定的起点
  • 红色区域将始终形成直矩形。我创建的 Rectangle 对象只是用作碰撞框,所以我可以使用 .intersect(),从不绘制或类似的东西。
  • 创建的
  • Rectangle 将存储在 ArrayList 中。

迷宫示例:(一个简单的) enter image description here

我希望能够做的事情:(绿色区域是创建 java.awt.Rectangles 并将其存储到 ArrayList 的地方)

enter image description here

最佳答案

我将提供一个非常简单的方法来解决这个问题(没有完全实现,只是为了让你明白)。有所有矩形的列表 List<Rectangle> mazeRectangles .所有矩形都将存储在这里。当然还有图像 BufferedImage image;现在我们将遍历所有图片,直到找到一张颜色正确的图片每次找到矩形时,我们都会跳过矩形宽度的所有 x 值。

//iterate over every pixel..
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
//check if current pixel has maze colour
if(isMazeColour(image.getRGB(x, y))){
Rectangle rect = findRectangle(x, y);
x+=rect.width;
}
}
}

检查颜色的方法:

public boolean isMazeColour(int colour){
// here you should actually check for a range of colours, since you can
// never expect to get a nicely encoded image..
return colour == Color.RED.getRGB();
}

有趣的部分是 findRectangle方法..我们看看是否已经有一个 Rectangle其中包含我们的坐标。如果是返回它,否则创建一个新的 Rectangle ,将其添加到列表中并返回。如果我们必须创建一个新的 Rectangle ,我们将首先检查它的宽度。令人讨厌的是,您仍然需要检查矩形其余部分的每个像素,因为您可能有这样的配置:

+++++++
+++++++
###
###

哪里#+是单独的盒子。所以我们先求宽度:

public Rectangle findRectangle(int x, int y){
// this could be optimized. You could keep a separate collection where
// you remove rectangles from, once your cursor is below that rectangle
for(Rectangle rectangle : mazeRectangles){
if(!rectangle.contains(x, y)){
return rectangle;
}
}
//find the width of the `Rectangle`
int xD = 0;
while(x+xD < width && isMazeColour(image.getRGB(x+xD+1, y))){
xD++;
}

int yD = 0; //todo: find height of rect..

Rectangle toReturn = new Rectangle(x, y, xD, yD);
mazeRectangles.add(toReturn);
return toReturn;
}

我没有实现 yD部分,因为它有点乱而且我有点懒,但你需要遍历 y 并检查每一行(所以两个嵌套循环)

请注意,此算法可能会导致重叠 Rectangle秒。如果你不想那样,在找到 xD 时检查每个像素是否已包含在 Rectangle 中.只展开xD只要你不在另一个Rectangle里面.

另一件事:由于红色和蓝色之间的颜色插值,您最终可能会在矩形的边界处出现奇怪的人工制品。也许您想检查 Rectangles 是否太小(例如只有 1 像素宽)并摆脱它们..

关于java - 如何检测图像中的彩色矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35376726/

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