2016-04-04 32 views
0

Şu anda emguCV ile birlikte visual studio 2013 C# kullanarak bir parmak izleyici tanıma ile çalışıyorum. Zaten ms access'i kullanarak bir veritabanım var ve bana (zaten gri renkte) görüntüleri eklememe izin veren bir program var.İki imageBox denetimleriyle eşleştirme (EmguCV)

  • ben 2 ImageBox (imageBox0, imageBox1, imageBox2) .., imageBox0 benim kameranın canlı akış görüntüler var., ImageBox1 imageBox0 (elim, gri tonlama, dikdörtgenin kontur) arasında işlenen resim görüntüler ve imageBox2, ms access veritabanından seçilen bir resmi görüntüler.

    : ihtiyacım Ne

(veritabanı içinde bütün görüntülerde) imageBox2 benzer veya imageBox1 bir görüntü tanımak için bir yol

İşte

Ben ne yapıyorum görüntüleridir olduğunu enter image description here

ben thoug oldum 2.

private Image GetImgFromDB() 
{ 
    if (rowNumber >= 0) 
    { 
     byte[] FetchedImgBytes = (byte[])LocalDataTable.Rows[rowNumber]["alphaImage"]; 
     MemoryStream stream = new MemoryStream(FetchedImgBytes); 
     FetchedImg = Image.FromStream(stream); 
     txtAlphaName.Text = (string)LocalDataTable.Rows[rowNumber]["AlphaName"]; 

     Bitmap FetchedImgCV = (Bitmap)FetchedImg; 
     normalizedMasterImage = new Image<Gray, Byte>(FetchedImgCV); 

     return FetchedImg; 
    } 
    else 
    { 
     MessageBox.Show("There are no images in the dataase yet. add some Please"); 
     //return null; 
    } 
    return null; 
} ` 

cevap

1

EmguCV sürümünü kullanıyorum Bu sessiz ve iyi bir başarı derecesiyle. Mine iki görüntüyü karşılaştırır ve bir uyarı oluşturmak için iki arasındaki yüzde arasındaki farkları belirlersiniz.

anahtar bu sadece POC, hiçbir şey prodüksiyondu,

class bitmapCompare 
{ 
    public enum CompareResult 
    { 
     ciCompareOk, 
     ciPixelMismatch, 
     ciSizeMismatch 
    }; 

    public static CompareResult Compare(bool useHash, Bitmap bmp1, Bitmap bmp2, out double err, out Bitmap diff) 
    { 
     CompareResult cr = CompareResult.ciCompareOk; 
     int er = 0; 
     err = 0; 
     diff = new Bitmap(bmp1.Width, bmp1.Height); 
     //Test to see if we have the same size of image 

     if (bmp1.Size != bmp2.Size) 
     { 
      cr = CompareResult.ciSizeMismatch; 
      err = 100; 
     } 
     else 
     { 
      //Convert each image to a byte array 

      System.Drawing.ImageConverter ic = 
        new System.Drawing.ImageConverter(); 
      byte[] btImage1 = new byte[1]; 
      btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType()); 
      byte[] btImage2 = new byte[1]; 
      btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType()); 

      //Compute a hash for each image 

      SHA256Managed shaM = new SHA256Managed(); 
      byte[] hash1 = shaM.ComputeHash(btImage1); 
      byte[] hash2 = shaM.ComputeHash(btImage2); 

      //Compare the hash values 
      if (useHash) 
      { 
       for (int i = 0; i < hash1.Length && i < hash2.Length; i++) 
       { 
        if (hash1[i] != hash2[i]) 
        { 
         er++; 
         cr = CompareResult.ciPixelMismatch; 
        } 
       } 

      } 
      else 
      { 
       int totalPixels = 0; 
       er = 0; 
       for (int x = 0; x < bmp1.Width; x++) 
       { 
        for (int y = 0; y < bmp1.Height; y++) 
        { 
         totalPixels++; 
         if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y)) 
         { 


          diff.SetPixel(x, y, Color.Black); 
          er++; 
          cr = CompareResult.ciPixelMismatch; 
         } 
         else 
          diff.SetPixel(x, y, Color.White); 
        } 
       } 
       System.Diagnostics.Debug.WriteLine("Total pixels:{0}", totalPixels); 
       System.Diagnostics.Debug.WriteLine("Diff pixels:{0}", er); 

       if (er > 0) 
        err = (double)er/((double)bmp1.Height * (double)bmp1.Width); 
       else 
        err = 0; 
       if (err > 0) err = Math.Round(err*100, 1); 
       if (err > 100) err = 100; 


      } 
     } 
     return cr; 
    } 

değiştirmek için çekinmeyin ... karmaları, değil ham verileri karşılaştırmaktır.

+0

Ona bakarım kardeşim, çok teşekkürler. umarım birşeyler çözebilir ve işimi bitirebilirim .. –

+0

Aslında, kodu görüntüledikten sonra, hızlı bir şekilde "Eşleşme, evet mi hayır mı?" Ancak, karma olmayanlar karşılaştırır ve farklı alanları vurgulayan karşılaştırmalı bir bitmap oluşturur. Bunu, yanlış pozitifleri azaltmak için Selenium ekran dökümlerini karşılaştırmak için kullandım. Herhangi bir sorun, ping beni. – MiloTheGreat

+0

kardeşim i (i imageBox1 ve imageBox2 karşılaştırmak için kullanabilirsiniz nasıl) benimkiyle kodunuzu kullanmak istiyorum lütfen bana nasıl yardımcı olabilir .. ayrıca, .? Bu bir düzeltmek benim anlayış yapar ... 'SHA256Managed shaM = new SHA256Managed(); // ana programın ad alanı? byte [] hash1 = shaM.ComputeHash (btImage1); // btImage1 = imageBox1 adı (emguCV) byte [] hash2 = shaM.ComputeHash (btImage2); // btImage2 = resim kutusunun adı (emguCV) ' bir kez daha teşekkürler ... –