2012-02-20 4 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カラーで表示されます。別のイメージ内の1つのイメージを比較し、その値を辞書(OCR)で返す信頼性の高い方法があるかどうか疑問に思っています。

+0

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

私はC#タグを使って検索を簡単にしています。私はいつもここに様々なプログラミング言語の専門家がいると思っていましたので、PHP、C++、またはJavaの人々を引き付けないためにC#私はそれを警告として受け取り、この誤りを将来も繰り返さないだろう – Alex

答えて

0

ピクセル値はnoですあなたが発見したように、堅牢です。フォントが完全に予測可能で、一貫してレンダリングされている場合は、画像を正規化(一致、スケール、回転)し、画像の平均平方差を計算し、それが十分小さければ受け入れます。

不明なフォントやさまざまな画像ソース(screencapture、カメラ、スキャンなど)で、ある種の機械学習(ML)に基づいてより堅牢なスキームが必要です。ビットマップからの数字の認識は、ニューラルネットワークの古典的な導入例ですが、他の多くのMLスキームも動作します。Supervised learning#Approaches_and_algorithms on Wikipediaを参照してください。これには訓練が必要であることを覚えておいてください。訓練を行うには、多様なデータが必要です。

+0

私はそれを使って既知のフォントを認識するつもりだ。すべての文字が常に同じピクセルを持つなど、私は認識をすることができた100%の結果が得られましたが、ちょうど4文字を認識するのに1秒近くかかりました。 ;(私は最適化についてもう1つの質問をしています。スピードがそれでも十分でない場合は、Tesseractまたは他のソリューションを使用します。 – Alex

+0

問題が修正されました:) – Alex

関連する問題