2015-10-28 2 views
0

J'essaie d'effectuer un OCR numérique de base sur une image en le comparant aux bitmaps des nombres 0-9, en utilisant le code ci-dessous. J'ai essayé de suivre le code dans la réponse à this question, mais il ne retourne pas les bons résultats. 1: Si le programme détermine que le nombre 0 est présent à un point donné, alors il détermine également que 1, 2, 3, ..., et 9 sont présents à cet endroit, ce qui n'est évidemment pas vrai. 2: Les emplacements qu'il trouve des nombres dans ... la plupart des emplacements sont des espaces blancs (blancs). Je serai le premier à admettre que l'utilisation de la méthode lockbits est nouvelle pour moi, car j'utilise habituellement la méthode de comparaison getPixel(), mais c'était beaucoup trop lent pour ce projet, donc je peux faire un erreur de débutant ou 2.Comparaison d'images utilisant des verrous ne fonctionnant pas correctement

Merci pour l'aide !!!

P.S. L'image à OCR est RTA, et je crois que tout le reste est auto-explicatif.

void newOCR() 
    { 
     Rectangle rect = new Rectangle(0, 0, 8, 9); 
     Rectangle numRect = new Rectangle(0, 0, 8, 9); 

     for (int i = 0; i < RTA.Width - 8; i++) 
     { 
      for (int j = 0; j < RTA.Height - 9; j++) 
      { 
       rect.Location = new Point(i, j); 
       for (int n = 0; n < numbers.Length; n++) 
       { 
        System.Drawing.Imaging.BitmapData data = RTA.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, RTA.PixelFormat); 
        System.Drawing.Imaging.BitmapData numData = numbers[n].LockBits(numRect, System.Drawing.Imaging.ImageLockMode.ReadOnly, numbers[n].PixelFormat); 

        unsafe 
        { 
         byte* ptr = (byte*)data.Scan0.ToPointer(); 
         byte* numPtr = (byte*)data.Scan0.ToPointer(); 

         int width = rect.Width * Image.GetPixelFormatSize(data.PixelFormat)/8; 
         for(int y = 0; y < rect.Height; y++) 
         { 
          bool outBreak = false; 
          for(int x = 0; x < width; x++) 
          { 
           if(*ptr != *numPtr) 
           { 
            outBreak = true; 
            break; 
           } 
           else if(y == rect.Height - 1 && x == width - 1) 
           { 
            timeDict.Add(new Point(i, j), n); 
           } 

           ptr++; 
           numPtr++; 
          } 

          if(outBreak) 
          { 
           break; 
          } 

          ptr += data.Stride - width; 
          numPtr += numData.Stride - width; 
         } 

         RTA.UnlockBits(data); 
         numbers[n].UnlockBits(numData); 
        } 
       } 
      } 
     } 
    } 
+0

Si pas 'octet * numPtr = (octet *) data.Scan0.ToPointer()' 'être octet * numPtr = (octet *) numData.Scan0.ToPointer();' . On dirait que vous comparez bitmap à lui-même :-) –

+0

@IvanStoev OUI! Ce travail est parfait. Voir - erreur recrue. Si vous faites une réponse, je vais l'accepter :) Merci beaucoup! – BrianH

+0

Bienvenue. Je ne suis pas tout à fait sûr si je suis censé poster comme réponse, mais puisque vous demandez, je le ferai. –

Répondre

1

Il y a un (probablement copier/coller) erreur dans la ligne suivante

byte* numPtr = (byte*)data.Scan0.ToPointer(); 

qui provoque la comparaison du bitmap à lui-même. Il devrait être

byte* numPtr = (byte*)numData.Scan0.ToPointer();