3

ユーザーが自分の電話で「単純な」形状(円、三角形など)を描画し、描画された形状がデータベース内の形状の1つと一致するかどうかをサーバーに尋ねることができる単純なAndroidアプリケーションを実装する必要があります。形状の数(たとえば、100未満ですが、それ以上にすることもできます)。このアプリケーションを機能させるために、私は次の手順を使用することを考えていました(入力画像は白黒ピクセルのみで構成されていると想定しています)。

A. DB内の画像と同じ縮尺にするために、入力画像のサイズを変更してトリミングします

B.入力画像を小さな角度(たとえば15度)でx回(この場合は24度)回転させ、これらの回転のそれぞれをDB内の各形状と一致させます。

質問:

  1. Aの場合、最善のアプローチは何でしょうか。サーバーにデータを送信する前に、Androidアプリケーションにこの手順を実装することを考えていました。
  2. Bの場合、形状のみを含む2つの白黒ピクセル画像を比較する適切なアルゴリズムは何でしょうか。
  3. これを実装するためのより良い/より簡単な方法はありますか?実装もあるソリューションが望ましいです。

PS:多くの人がこのあたりで同様のトピックについて話し合っていることがわかりますが、私の要件に十分に一致するものを見つけることができないようです。

4

3 に答える 3

3

機械学習アプローチ

輪郭を記述するいくつかの機能を選択し、いくつかの分類方法を選択し、タグ付けされた輪郭のトレーニングセットを準備し、分類器をトレーニングし、プログラムで使用します。

輪郭の特徴。輪郭(画像で検出されるか、ユーザー入力から作成される)が与えられると、回転不変モーメントを計算できます。最も古く、最もよく知られているのは、一連のHuモーメントです。

また、離心率、面積、凸状欠陥、重心距離関数のFFT変換など、等高線の特徴を考慮することもできます。

分類子。次に、分類器をトレーニングする必要があります。サポートベクターマシン、ニューラルネットワーク、決定木、ベイズ分類器は、一般的な方法の一部です。から選択する方法はたくさんあります。SVMを選択した場合、LIBSVMは無料のSVMライブラリであり、Javaでも機能し、Androidでも機能します。

アドホックルールアプローチ

多角形の曲線で等高線を近似することもできます(Ramer-Douglas-Peuckerアルゴリズムを参照してください。OpenCVライブラリには無料の実装があり、Androidで利用できるようになりました)。三角形や長方形などの特定の単純なフォームの場合、それらを「認識する」アドホックなヒューリスティックルールを簡単に考案できます(たとえば、閉じた輪郭を3つのセグメントと小さなエラーで近似できる場合、それは三角形。重心距離関数がほぼ一定で、凸状の欠陥がない場合は、円である可能性があります)。

于 2012-07-27T21:11:21.197 に答える
1

教師あり学習アプローチを使用できます。あなたが解決しようとしている問題については、単純な分類器 Naive BayesKNNなどで良い結果が得られるはずです。

各画像から特徴を抽出する必要があります。画像ごとに、それらをベクトルに保存できます。これを特徴ベクトルと呼びましょう。データベースにある画像の場合、形状のタイプが既にわかっているため、特徴ベクトルにタイプの ID を含めることができます。これは、トレーニング セットとして機能します。

トレーニング セットを取得したら、分類器をトレーニングできます。新しい形状を分類するたびに、その特徴ベクトルを取得し、それを使用して分類器をクエリします。

スケールとサイズの不変機能を使用することをお勧めします。これにより、各画像のサイズを変更する必要がなくなり、回転する代わりに一度比較するだけで済みます。

Scale/Rotate の不変機能をすばやく検索して試すことができます。

于 2012-07-26T20:05:38.057 に答える
1

これは手書き認識に非常に関連しているため、単純な hmm アルゴリズムを使用して、事前に学習したデータベースと形状を比較できます。

しかし、はるかに単純なアプローチとして、画像の角を検出し、角を数えて形状を検出することができます。

最初のアプローチは複雑な形状に使用でき、2 番目のアプローチは基本的な形状にのみ適しています。

于 2012-07-26T17:44:10.493 に答える