1

単純な形状のセット (次の図を参照) があり、手書きの形状を認識して、おそらくセット内にある形状を把握したいと考えています。

それを行う簡単なアルゴリズムはありますか?またはオープンソースのライブラリですか?

ところで、私のタスクは単純なので、OpenCV のような複雑すぎるライブラリは使用しません。

前もって感謝します!!

形状

4

3 に答える 3

1

これは古いプロジェクトですが、これはあなたが探しているものに沿っているかもしれません。

これにはOpenCVが必要ですが、コメント投稿者が指摘したように、それを学ぶ価値があるかもしれません。

于 2011-04-15T02:37:26.687 に答える
0

C や C++ でそれを行う方法はわかりませんが、アルゴリズムは単純です。形状に角度が追加されるたびに成功率が低下することに注意してください。そのため、上記で指定した基本的な形状セットを認識するのには適していますが、それ以外はあまり役に立ちません。

  1. コーナー認識。あらゆる種類のコーナーを認識する必要がありますが、それは簡単です。驚くべき形状認識アルゴリズムを探しているのではなく、単にすばやく簡単なアルゴリズムを探している場合は、線が一方の側から来て、反対側で終わらないピクセルのグループを探してください。おそらく、これを約 10 ~ 20 ピクセルのブロックで行うことができますが、一部の図形の角が非常にだらしない (2 番目の手書き図形の下隅など) 場合は、さらに多くすることもできます。ただし、使用するブロック サイズが大きくなるほど、小さな形状を検出できなくなります。
  2. エラーチェック。まず、コーナーが 3 つ未満で 0 を超える場合は、間違いがあったことがわかります。それ以外の場合、ゼロが見つかった場合は、別のアルゴリズムを使用してそれが円か楕円かを判断し、その結果を返すことができます。そうでない場合は、次に進みます。
  3. ライン矯正。まず、コーナーがどのような順序で接続されているかを判断します (簡単です)。次に、X 座標と Y 座標の違いを比較して、2 つの違いのうち最小のものを削除するか、特定のしきい値を超えている場合は、対角線を想定して線をまっすぐにします。
  4. 角合わせ。それができたら、角度や距離などの線の特徴を照合することで形状を簡単に識別できます (たとえば、任意の点から開始して、水平-垂直-水平-垂直を見つけ、正方形または長方形があることを知っているので、それらを区別できます)。長さを比較して)。

もちろん、完全に正確なマッチングは不可能です。2 番目の例の形状が、傾いた平行四辺形なのか、傾いた正方形 (またはダイヤモンドや長方形) なのかさえわかりません。

于 2011-04-15T02:45:24.560 に答える
0

これは基本的に線検出
です。直線を含む形状に対してのみ機能し、決して単純ではありません。
図に k 個の線分があると仮定し、k-means アルゴリズムを使用して点を線に集約します。
最初にポイントをランダムにクラスターに分割します。
これらのクラスターのそれぞれについて、点が近似している線を計算します。(点までのすべての距離の合計が最小
である線) 外れ値 (線から最も離れた点) は、より適切に適合する他のクラスターに再割り当てする必要があります。
特定のしきい値に達するまで最後の手順を繰り返し
ます。目的のしきい値に達しない場合は、別の値の K を試すことができます。
1 つに到達した場合は、これらの線の交点を計算し、不規則な形状を通常の形状に一致させるために必要な他のプロパティを抽出できます。
このように、正方形から三角形を、平行四辺形から正方形を区別できますが、非常に複雑です。
この「アルゴリズム」は、波線、点線、または線が交差しない形状に対して機能する可能性があるため、かなり堅牢です

于 2011-04-15T02:58:45.850 に答える