2009-12-15 7 views
6

Non sono sicuro da dove cominciare con questo, quindi una guida sarebbe buona. Quello che devo realizzare è esaminare una grande immagine (diciamo 1280x1024) e controllare se esiste un'altra immagine più piccola al suo interno o meno (magari un'immagine di 50x50 pixel).C# Verifica se un'immagine esiste all'interno di un'altra immagine

Ho provato a farlo confrontando ogni pixel che è molto lento e potrei aver bisogno di farlo più di 100 volte, quindi non sembra adatto. Mi sto solo chiedendo se c'è un modo migliore?

Grazie

+0

Come esatto ha a che essere? Potresti ridimensionare le immagini a metà delle dimensioni e confrontare? – jestro

+0

Puoi dirci qualcosa sul contenuto delle immagini? Sono bitmap statici casuali o c'è qualche struttura di cui si potrebbe trarre vantaggio? Inoltre, puoi dirci qual è la probabilità che la query sia "spazzatura"? Cioè, qual è la probabilità che la piccola immagine NON venga trovata nell'immagine grande? Se la query ha un'alta probabilità di essere spazzatura, ciò che si desidera ottimizzare è determinare rapidamente lo stato della posta indesiderata. Quali sono le conseguenze di una risposta errata, falsi positivi o falsi negativi? Deve essere esatto per tutte le immagini? –

+0

Oh, e devi determinare * dove * è la partita, o solo se esiste una corrispondenza? –

risposta

3

stavo solo lavorando a qualcosa di simile e il risultato rapido e sporco mi è venuta è quella di usare l'esecuzione di AForge.Net di "ExhaustiveTemplateMatching" con le immagini 1/4 delle loro dimensioni. Le immagini a 720p a grandezza intera sono durate un paio di minuti, ma con una dimensione di 1/4 sono circa un secondo sul mio 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; 
    } 
} 

Si potrebbe anche, naturalmente, basta controllare per tm.length> 0 e sì, ci sono alcune divisioni non necessarie in là: P

+0

Grazie mille :) dal test rapido che ho fatto sembra ideale, lo testerò correttamente domani – Tset