2009-12-15 5 views
6

Je ne sais pas par où commencer, donc quelques conseils seraient bons. Ce que je dois réaliser, c'est examiner une grande image (disons 1280x1024) et vérifier si une autre petite image existe dedans ou pas (peut-être une image de 50x50 pixels).C# Vérification de l'existence d'une image dans une autre image

J'ai essayé de le faire en comparant chaque pixel qui est vraiment lent et je pourrais avoir besoin de le faire plus de 100 fois, donc cela ne semble pas approprié. Je me demande juste s'il y a une meilleure façon?

Merci

+0

Comment exactement il être? Pourriez-vous redimensionner les images à la moitié de la taille et comparer? – jestro

+0

Pouvez-vous nous dire quelque chose sur le contenu des images? S'agit-il de bitmaps statiques aléatoires ou existe-t-il une structure dont vous pourriez tirer parti? Aussi, pouvez-vous nous parler de la probabilité que la requête soit "indésirable"? Autrement dit, quelle est la probabilité que la petite image ne soit pas trouvée dans la grande image? Si la requête a une forte probabilité d'être indésirable, alors ce que vous voulez optimiser détermine rapidement l'état indésirable. Quelles sont les conséquences d'une mauvaise réponse, fausse positive ou fausse négative? Est-ce que ça doit être exact pour toutes les images? –

+0

Oh, et devez-vous déterminer * où * correspond, ou simplement si une correspondance existe? –

Répondre

3

Je viens de travailler sur quelque chose de similaire et le résultat rapide et sale, je suis venu avec est d'utiliser la mise en œuvre de AForge.Net de « ExhaustiveTemplateMatching » avec des images 1/4 de leur taille. Images 720p en taille réelle a pris quelques minutes, mais à la taille 1/4, il est d'environ une seconde sur mon ordinateur chétif.

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

Vous pouvez vérifier tout aussi bien sûr pour tm.length> 0 et oui il y a quelques divisions inutiles là-dedans: P

+0

Merci beaucoup :) du test rapide que j'ai fait qui semble idéal, je vais le tester correctement demain – Tset

Questions connexes