在Java中查找图像中的图像

时间:2012-07-27 03:09:30

标签: java image matching

我已经花了好几个小时来完成这项工作,但由于某种原因,它没有找到匹配。您可以使用任何图像对其进行测试,但应该截取屏幕左上角的屏幕截图(1000像素×1000像素)并在其中查找指定的图像。任何帮助将不胜感激!

        import java.awt.Rectangle;
        import java.awt.Robot;
        import java.awt.image.BufferedImage;
        import java.io.File;
        import java.io.IOException;

        import javax.imageio.ImageIO;


        public class ImageRobotTester {

            /**
             * @param args
             */
            public static void main(String[] args) {
                ImageRobot i = new ImageRobot();
                try {
                    BufferedImage settingsImage = ImageIO.read(new File("images/Dex.png"));
                    Robot r = new Robot();
                    BufferedImage screen = r.createScreenCapture(new Rectangle(0, 0, 1000, 1000));

                    i.subImage(settingsImage, screen);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }

        }
      import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;


public class ImageRobot {

    public ImageRobot() {
        // TODO Auto-generated constructor stub
    }

    public void subImage(BufferedImage needle, BufferedImage hayStack)
    {
        int xMatch = 0;
        int yMatch = 0;
        int possMatches = 0;
        try {
            for(int j = 0; j < hayStack.getHeight() - needle.getHeight(); j++)
            {
                for(int i = 0; i < hayStack.getWidth() - needle.getWidth(); i++)
                {
                    BufferedImage hayStackSub = hayStack.getSubimage(i, j, needle.getWidth(), needle.getHeight());
                    if(hayStackSub.equals(needle))
                    {
                        System.out.println("match!");
                        xMatch = i;
                        yMatch = j;
                    }

                }
            }
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            System.out.println("Out of bounds! (" + xMatch + ", " + yMatch + ")");
        }

        System.out.println("(" + xMatch + ", " + yMatch + ")");
    }

}

1 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我,但是你想在这里做某种图像识别吗? 您不是在逐个像素地搜索与参考图像匹配的子图像,而是在搜索类似的图像?正确?

在这种情况下,您需要在大图像上移动一个小“窗口”(就像您现在正在使用双重for循环),但不使用“等于”,而是使用经过适当训练的神经网络来判断您正在寻找的图像位于该窗口内。

有关如何构建基于NN的图像识别器的详细信息,请参阅本教程:

http://neuroph.sourceforge.net/image_recognition.html