开发者

C# Checking if an image exists within another image

开发者 https://www.devze.com 2022-12-14 15:27 出处:网络
I\'m not sure where to start with this so some guidance would be good. What I need to achieve is, examine a large image (say 1280x1024) and check to see if another smaller image exists within it or no

I'm not sure where to start with this so some guidance would be good. What I need to achieve is, examine a large image (say 1280x1024) and check to see if another smaller image exists within it or not (maybe a 50x50 pixel image).

I tried doing this by comparing every pixel whi开发者_StackOverflow中文版ch is really slow and I may need to do it 100+ times so it doesn't seem suitable. I'm just wondering if there is a better way?

Thanks


I was just working on something similar and the quick and dirty result I came up with is to use AForge.Net's implementation of "ExhaustiveTemplateMatching" with images 1/4 of their size. 720p images at full size took a couple minutes but at 1/4 size it's about a second on my puny computer.

public static class BitmapExtensions
{
    /// <summary>
    /// See if bmp is contained in template with a small margin of error.
    /// </summary>
    /// <param name="template">The Bitmap that might contain.</param>
    /// <param name="bmp">The Bitmap that might be contained in.</param>        
    /// <returns>You guess!</returns>
    public static bool Contains(this Bitmap template, Bitmap bmp)
    {
        const Int32 divisor = 4;
        const Int32 epsilon = 10;

        ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(0.9f);                      

        TemplateMatch[] tm = etm.ProcessImage(
            new ResizeNearestNeighbor(template.Width / divisor, template.Height / divisor).Apply(template),
            new ResizeNearestNeighbor(bmp.Width / divisor, bmp.Height / divisor).Apply(bmp)
            );

        if (tm.Length == 1)
        {
            Rectangle tempRect = tm[0].Rectangle;

            if (Math.Abs(bmp.Width / divisor - tempRect.Width) < epsilon
                &&
                Math.Abs(bmp.Height / divisor - tempRect.Height) < epsilon)
            {
                return true;
            }                
        }

        return false;
    }
}

You could also of course just check for tm.length > 0 and yes there are some unnecessary divides in there :P

0

精彩评论

暂无评论...
验证码 换一张
取 消