1

現在、これを使用して、画面上の別の画像、つまりウィンドウで発生するビットマップを見つけますが、ツールが遅いです。1秒以下で処理したいので、画像をセクション、つまり80,60にトリミングすることを考えていました画像のポイント0,0のセクションとそこでの検索、同じトリミングを行うがy + 60を行い、800 x 600ピクセルであると仮定して画像全体をカバーするまで続行します

私が現在使用しているコードは次のとおりです。

        public bool findImage(Bitmap small, Bitmap large, out Point location)
    {
        //Loop through large images width
        for (int largeX = 0; largeX < large.Width; largeX++)
        {
            //And height
            for (int largeY = 0; largeY < large.Height; largeY++)
            {
                //Loop through the small width
                for (int smallX = 0; smallX < small.Width; smallX++)
                {
                    //And height
                    for (int smallY = 0; smallY < small.Height; smallY++)
                    {
                        //Get current pixels for both image
                        Color currentSmall = small.GetPixel(smallX, smallY);
                        Color currentLarge = large.GetPixel(largeX + smallX, largeY + smallY);
                        //If they dont match (i.e. the image is not there)

                        if (!colorsMatch(currentSmall, currentLarge))
                            //Goto the next pixel in the large image

                            goto nextLoop;
                    }
                }
                //If all the pixels match up, then return true and change Point location to the top left co-ordinates where it was found
                location = new Point(largeX, largeY);
                return true;
            //Go to next pixel on large image
            nextLoop:
                continue;
            }
        }
        //Return false if image is not found, and set an empty point
        location = Point.Empty;
        return false;
    }
4

1 に答える 1

2

正確な一致を探しているので、大きな画像をダウンサンプリングし、小さな画像をダウンサンプリングできます (ただし、異なるオフセットで数回)。次に、ダウンサンプリングされた画像の正確な一致を検索します (再帰的である可能性があります)。

あなたの全体像はそれほど大きくないように聞こえますが、行の 1 つをボイヤー・ムーア検索で回避できる場合があります。

于 2012-08-25T01:09:52.487 に答える