0

画面上の画像をすばやく見つける方法はありますか?

私はそれが好きでした:(その前に私はRobot.createScreenCapture(...)で画面をキャプチャしました)

public static Point search(BufferedImage big, BufferedImage small) {
    Robot robot = null;
    try {
        robot = new Robot();
    } catch (AWTException e) {
        e.printStackTrace();
    }
    long time=System.currentTimeMillis();
    for (int x = 0; x < big.getWidth() - small.getWidth(); x++) {
        for (int y = 0; y < big.getHeight() - small.getHeight(); y++) {
            if (compare(x, y, big, small)) {
                return new Point(x, y);
            }
        }
    }
    System.out.println(System.currentTimeMillis()-time);
    return null;
}

private static boolean compare(int xs, int ys, BufferedImage img1, BufferedImage img2) {
    for (int x = 0; x < img2.getWidth(); x++) {
        for (int y = 0; y < img2.getHeight(); y++) {
            if (img1.getRGB(x + xs, y + ys) != img2.getRGB(x, y)) {
                return false;
            }
        }
    }
    return true;
}

ただし、200ミリ秒かかることもあれば、10000ミリ秒かかることもあります。:(

編集:誰かがAutohotkeyを知っているなら、それは別のプログラミング言語であり、数ミリ秒でそれらの画像を見つける「ImageSearch」と呼ばれる関数があります...(私が思うにC ++に基づく)

4

1 に答える 1

3

次の 2 つの可能性があります。

  1. 使用しているアルゴリズムはあまり高速ではありません。これは O(mn) アルゴリズムであるため、KMP アルゴリズムなどのより優れたアルゴリズムを検討する必要があります。

  2. 画像を検索する前に、おそらくまず圧縮してから検索し、別のチェックを使用して、圧縮がアルゴリズムに影響を与えなかったことを確認します。単純な「1行おきに取り出す」だけで、プログラムがかなり高速化されます。

于 2012-09-20T20:19:02.407 に答える