2011-07-14 22 views
1

私の質問はthis oneと似ていますが、より具体的な範囲です。JPG画像内のテキストのバウンディングボックスを見つける

私のカードゲームアプリケーションでは、スキャンされたJPEG画像にある単語をユーザーがクリックできるようにしたいと考えています。このサンプルPokemon trading cardをご覧ください。

この場合、ユーザーはマウスをテキスト "Scratch"の上に置くことができます。クリックすると、テキストの周りにパルス状の矩形の枠が表示されます。問題は、テキストの境界を検出する方法です。ユーザーがクリックする可能性のある単語の配列があります(これらはカードごとにデータベースから取得されます)。例を続けると、この場合の配列は["Scratch"、 "Live Coal"]になります。ユーザが「スクラッチ」をクリックすると、アプリケーションはコールバックを介して「スクラッチ」が「ライブコール」の代わりに選択されたことを知る必要があります。

私はこの問題を解決するために光学式文字認識ライブラリを使用することを考えていましたが、このためのオープンソースオプションは品質が悪い(例:GOCR)、複数のプラットフォーム(Tesseractなど)で十分にテストされていません。私はWindowsとMacの互換性だけを気にしています。 OCRを必要としない明白な/より単純なソリューション/アルゴリズムが欠けていますか?自分のデータベースにスキャンされたカードが何千もあるので、各カードのバウンディングボックスに手書きでコードを書くことはできません。ユーザは、それに付随するクリック可能なテキストの配列を用いて、自分のカスタムカードスキャンをアップロードすることもできる。

テキストの色は常に黒ではありません。許可されるカードとテキストスタイルが異なるこのpanoramaを参照してください。黒いカードは白いテキストを持ち、3番目の最後のカード(Zekrom)は白い輪郭の黒いテキストを持っています。

どのようなプログラミング言語のソリューションも高く評価されています。しかし、オープンソースのアルゴリズムやライブラリを探しています。 RubyやJavaのソリューションがあれば、私のコードは主にこれら2つの言語になっています。

EDIT:配列内の単語/フレーズの順番は、カードと同じであることを言い忘れました。したがって、アレイは["Live Coal"、 "Scratch"]の代わりに["Scratch"、 "Live Coal"]になります。私はそれが潜在的にタスクを簡素化できるので、これを言及しています。したがって、この例では、単に黒色のピクセルを探すことができます(ただし、白い円の黒い星を見なければなりません)。しかし、より小さなフォントで攻撃名の下に記述テキストがある場合はさらに難しいでしょう(例についてはパノラマを参照してください)。

+0

ユーザーがイメージをアップロードすることを許可している場合は、入力した内容が実際にテキストと一致することを確認するにはどうすればよいですか?また、カードの向きは変わりますか(カードが横向きに表示されたり、奇妙な角度で表示されるとどうなりますか?あなたは、既存のテキストを空白にして、*生成する*テキストを適切な位置に配置することができます - バウンディングボックスを生成しやすく、必要に応じて翻訳しやすく、OCRに依存しません。実際に処理するのは、「移動」セクションの境界ボックスを決定することだけです(これは、OCR領域を事前に制限するために関係なく行いたい場合があります)。 –

+0

@ X-Zeroありがとう、これは実行可能な解決策のように聞こえる。どのように私は '移動'セクションの境界ボックスを検出することをお勧めしますか? – Klarerwind

+0

他のものがクリック可能になっているかどうかによって、基本的には主なものではないすべてのものです。カードの中点には水平のバーがあります。これはまったく対照的です(申し訳ありませんが、私は画像解析をしていません)。いずれにしても、ユーザーが自分のカードをアップロード(おそらく作成)できるのであれば、カード作成者に自分のテキストを入力して、ポケモンのカスタム画像を入れることができます。それはさらに簡単になるはずです。現時点では、カードを認識する必要があります。 –

答えて

1

簡単にするために、テキストの周りに境界ボックスを視覚的に描くことができるプログラムを作成しますが、この購入でピクセル色の違いを検出できます。テキストが黒であるため、左上の最も黒いピクセルが大きなインデントなしで、カードの下半分内にある場所を確認できます。

+0

カードのフォーマットが大きく異なるという問題があります。私はまた、この[カード](http://pokebeach.com/scans/team-rocket/39-dark-kadabra.jpg)の "Pokemon Power:Matter Exchange"と "Mind Shock"というフレーズを認識する必要があります – Klarerwind

0

カーソルが静止しているときは、黒いピクセルがカーソルの周囲にあるか4ピクセルにあるかを確認します。そうであれば、最初の3つの連続した(文字間に黒以外のピクセルが残っている可能性があるため)カーソルの左側に黒以外のピクセルを、右に、上に、下にチェックします。はいの場合は、これらの場所を使用して四角形を描きます。 OpenCVを使用できます。

+0

良い考え方単語やフレーズ全体に1つの長方形の枠線を描く必要があります。たとえば、リンク先のOpenCVページには、最初の図の「<...> \ OpenCV \ binをシステムPATHに追加」の周りに赤い四角形があります。 – Klarerwind

+0

これはどうですか?あらかじめ各テキスト領域の周囲に透明な四角形を描きます。したがって、各カードオブジェクトに対して、矩形の座標を含む矩形の配列リストを関連付けます。今、ユーザがマウスを動かすたびに、ユーザがそれらの「隠れた」矩形の中にいるかどうかのチェックを行います。彼/彼女がいる場合、ちょうどその矩形の色を黒または何かに変えますか? – TookTheRook

+0

手元のカードがわからない場合は、「スクラッチ」やユーザーが新しいカードをスキャンしたときなど、あらかじめ定義された単語の画像を保存するだけで、カードに保存した画像があるかどうかを確認します。そうであれば、イメージがどこにあるかを検出してその周囲に線を描くことができます... – TookTheRook

関連する問題