2012-02-20 36 views
0

我有許多字母的圖案圖像字典,我也有一個必須被識別的位圖! 「兩個」圖像的高度是相同的!一些圖案圖像具有不同的寬度。在另一個圖像中檢測一個圖像並返回它的值

如何迭代X軸並識別模式中的字母?

現在,我使用此功能檢查,如果X位圖列中有黑色像素:

static Boolean GetColumnState(Bitmap bmp, int x) 
{ 
    BitmapData pixelData = bmp.LockBits(
     new Rectangle(0, 0, bmp.Width, bmp.Height), 
     ImageLockMode.ReadOnly, 
     PixelFormat.Format32bppArgb); 
    Boolean state = false; 
    unsafe 
    { 
     int* pData = (int*)pixelData.Scan0.ToPointer(); 
     pData += x; 
     for (int i = 0; i < bmp.Height; ++i) 
     { 
      pData += bmp.Width; 
      if (Color.FromArgb(*pData) == Color.FromArgb(255, 0, 0, 0)) 
      { 
       state = true; 
       break; 
       //pixelColumn[i] = Color.FromArgb(*pData); 
      } 
     } 
    } 
    bmp.UnlockBits(pixelData); 

    return state; 
} 

如果CulumnState()返回true,那麼我裁剪尺寸相同圖案的圖像圖像和比較它們。

 int y = target.Count; 
     for (int i = 0; i < b1.Width; i++) 
     { 
      if (GetColumnState(b1, i + count) == true) 
      { 
         int trWidth = target[5].Value.Width; 
         int trHeight = target[5].Value.Height; 
         Bitmap bitm = new Bitmap(trWidth, trHeight); 
         Rectangle section = new Rectangle(new Point(0, b1.Height - trHeight-1), new Size(trWidth, trHeight)); 
         Bitmap cropped = CropImage(b1, section); 
         cropped.Save(@"C:\111.png"); 
         target[5].Value.Save(@"C:\000.png"); 
         if (CompareMemCmp(cropped, target[5].Value) == true) 
         { 
          //count = target[5].Value.Width; 
          textBox2.AppendText(target[5].Key); 
          break; 
         } 
         else { textBox2.AppendText("noo"); } 

       //textBox1.Text = "yes!"; 
      } 
      else 
      { 
       //textBox1.Text = "noo"; 
      } 
      break; 
     } 

不幸的是,即使經過裁剪的圖片在視覺上看起來是一樣的 - 它有不同的大小,以便memcmp(我比較的方法是基於這一點)返回 ..這有

位圖被識別並且圖案圖像全部在BlackAndWhite顏色中..我想知道是否有更可靠的方式來比較另一個圖像內的圖像並通過字典(OCR)返回它的值。

+0

請不要在「C#」等前加上標題。這就是標籤的用途。 – 2012-02-20 19:31:13

+0

好的,我也使用C#標籤來緩和搜索..我一直認爲這裏是不同編程語言的專業人士,所以我爲了不吸引PHP,C++或Java人員而故意進入C#..但無論如何我會把它作爲警告,不會在將來重複這個錯誤 – Alex 2012-02-20 19:33:33

回答

0

基於像素的模式匹配值是否定的正如你所發現的那樣。如果字體是完全可預測的並且一致地呈現,那麼可以通過對圖像進行規範化(對齊,縮放,旋轉以匹配)並計算圖像之間的均方差,然後接受它是否足夠小來完成此工作。在面對未知字體或不同圖像源(屏幕截圖,相機,掃描等)的情況下,您需要基於某種類型的機器學習(ML)的更健壯的方案。識別位圖中的數字是神經網絡的經典介紹性例子,但許多其他ML方案也可以使用 - 請參閱Supervised learning#Approaches_and_algorithms on Wikipedia。請注意,這將涉及培訓,這意味着您需要一組好的數據來訓練它。

+0

我打算用它來識別已知字體..所有字母總是具有相同的像素等我已設法做識別結果100%,但只花了近1秒才能識別出4個字母。 ;(我會問一個關於優化的問題。如果速度還不夠好 - 即使使用Tesseract或其他解決方案.. – Alex 2012-02-21 08:06:16

+0

問題修正:) – Alex 2012-02-21 14:27:21

相關問題