C#, Проверяющий, существует ли изображение в рамках другого изображения

Я не уверен, где запустить с этого, таким образом, некоторое руководство было бы хорошо. То, чего я должен достигнуть, исследуйте большое изображение (скажите 1280x1024), и проверка, чтобы видеть, существует ли другое меньшее изображение в ней или не (возможно, изображение на 50x50 пикселей).

Я пытался делать это путем сравнения каждого пикселя, который является действительно медленным, и я, возможно, должен сделать это 100 + времена, таким образом, это не кажется подходящим. Я просто задаюсь вопросом, существует ли лучший путь?

Спасибо

7
задан Tset 15 December 2009 в 22:27
поделиться

1 ответ

Я просто работал над чем-то похожим, и быстрый и грязный результат, который я придумал, это использование реализации AForge.Net "ExhaustiveTemplateMatching" с изображениями 1/4 их размера. 720p изображения в полном размере заняли пару минут, но на 1/4 размера это около секунды на моем маленьком компьютере.

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;
    }
}

Вы также можете, конечно, просто проверить на tm.length > 0 и да, есть некоторые ненужные деления там :P

.
5
ответ дан 7 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: