データベースとマウスで描いた図形の結びつけについて

このQ&Aのポイント
  • 自作プログラムのアルゴリズムで、データベースとマウスで描いた図形の結びつけ方を求めています。
  • 現在作成中のプログラムでは、マウスで描いた線の座標をデータベースに保存し、呼び出すことで該当する図形の名前を表示する機能を実装しています。
  • しかし、同じ図形を全く同じ形で描くことは現実的ではないため、どのような条件でデータベースとの照合を行えば良いのか悩んでいます。数学的な理論やヒントがあれば教えていただきたいです。
回答を見る
  • ベストアンサー

複数の点の、相似・近似の確認

こんにちは、 現在、自作のプログラムを作成中の者です。 作成しているプログラムのアルゴリズムで、どうしても答えが出せない部分がありますので、お知恵を貸してください。 プログラム概略 ・画面にマウスで線を描く ・その線をデータベースに名前と共に保存 ・呼び出し画面で図形を書いた際に、登録してある図形から該当するものの名前を呼び出す。 といった処理を行おうと考えています。 現在完成している処理としては。 ・マウスをクリックして画面上でドラッグする間、一定の間隔でマウスの座標を所得し線を描く。 ・クリックを離した時点で、一連のマウスの座標を、配列変数に格納する。 ・複数のマウスクリック(複数の線)用に変数をもたせ管理する。 ・最後に、その形にあった状態でデータベースに保存する。 というところまで完成しているのですが。 保存されている情報と、呼び出しの際に描いた情報を結びつけるためのアルゴリズムが思いつきません。(一番要のところかもしれませんが・・・) データベースへの保存も、どういった情報を保存すればいいのか定まっていないので、改良中ではあります。 ただ、全く同じ図形(大きさも含めて)を描くことは現実的な操作ではないと思いますので。 どのような条件でデータベースとの照合を行えばいいのかを考えています。 漠然とした情報かとは思いますが、数学的な理論などでも勉強しますので、 このような感じの求め方 等のヒントを頂ければと思います。 長文、失礼いたしました。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

画像処理関連の文献と言いましたが、一般的な画像処理の書籍はラスタイメージの処理に多くのページを費やしていて、あなたの必要とするであろう認識・分類・学習についてはあまり詳しく書かれていないものもありますので、店頭や図書館で内容を確認することをお勧めします。また、その他に機械学習などについても勉強するといいでしょう。 大きさや回転に頑健で書き順は意識しないというのであれば、古典的な方法としては回転不変特徴などが考えられますし、そのあとSVMやニューラルネットワークなどで分類するといった手順になるかもしれません。 しかしどういうパラメータにどういうアルゴリズムを使うべきかは、どういったパターンを認識したいかといったことと密接に関係します。例えば、右向きの矢印と左向きの矢印を別のものとすると、回転不変特徴だと区別できないので、回転角を制限するような方法を考えないといけません。 あなたのプログラムがどういう用途なのかわかりませんが、どういう図形を入力するのかももう少し検討したほうがいいかもしれません。例えば、マウスジェスチャーソフトでは動きのパターンを制限して認識を簡単にしています。なんでもいいと言い出したら、漢字認識ソフトを再発明することになりかねませんので。

WinterCat-Huyu
質問者

お礼

返事が遅くなり、申し訳ありません。 なるほど、一言に画像認識と言っても種類や手法があるのですね。 時間を見つけて、大きな書店に行ってみたいと思います。 また、今回のプログラムは自分の考えたものがどこまで実現することが可能なのかと 勉強を兼ねてやっていたことなので、要求される仕様があやふやなものになっていました。 大変、勉強になりました。ベストアンサーとさせて頂きます。 ありがとうございました。

その他の回答 (1)

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

つまり手書き図形の形状認識をやりたいわけですか。 文字認識の研究などとしてある程度確立した手法があると思いますので、画像処理関連の文献を当たるといいと思います。 基本的には座標の値を直接比較するか、なんらかの特徴量を抽出して比較することになるかと思いますが。 ちなみに、拡大縮小や回転に対する対応、書き順の厳密性はどのように考えていますか?

WinterCat-Huyu
質問者

お礼

myuki1232様 回答有難うございます。 >文字認識の研究などとしてある程度確立した手法があると思いますので、画像処理関連の文献を当たるといいと思います。 書籍等で探せばよいのでしょうか?時間の都合上、そういったものを探せてはいないのですが、どういった場所で文献を探すのが適切かアドバイスを頂けると助かります。 >ちなみに、拡大縮小や回転に対する対応、書き順の厳密性はどのように考えていますか? 拡大縮小に関しては、ある程度は認識させたいと考えています。ただし、あくまでも使用者が同じ物を書いたつもりでという仮定になりますので、どのような大きさで書いても認識するといったものでは無くても構いません。 また、回転に関しても上記同様10~30度程度の認識であれば問題有りません。 書き順に関しては、そこまで意識をしません。認識をしても、しなくても今回の私の用途ではあまり関係のないものと判断します。

関連するQ&A

  • マウスの位置をリアルタイムに取得

    マウスの座標を取得するようにjavascriptを組んだのですが、マウスポインタが移動していないときは座標取得処理をしないようにする方法を探しています。 マウスの座標を変数に保存して最新の座標と比較するようにして、座標が動いたら、座標を画面に表示させるようにできますでしょうか? マウスポインタの古い座標の保存法がわかりません。 よろしくお願い致します。

  • 特定座標をクリック

    特定座標をクリック 画面上の座標を指定してマウスクリックを発生させるプログラムってどう書けばよいでしょうか?

    • ベストアンサー
    • Java
  • マウスの停止確認

    JavaScript初心者です。 今こんなプログラムを組もうと思ってます。 /------- JavaScriptを使って、常にマウスの動き(座標)を確認しながら、マウスの動きが止まってから5秒後に別の処理をさせる。 /------- こんなプログラムを組む為に必要な関数などあるのでしょうか? また、サンプルなど教えていただければうれしいです。 皆様 宜しくお願いします!!

  • 複数の点を最短距離で全て繋ぐアルゴリズム

    C++で以下のようなプログラムを書こうと思うのですが、 効率的なアルゴリズムが思い浮かびません。 よい方法をご存知の方がおりましたら教えてください。 ------------------------ xy平面上に複数の点があります。 それぞれの点の座標は全て分かっています。 今、原点から出発して全ての点を直線で結んでいくのですが このとき引く直線の長さの総計が最小になるような 結び方を見つけたいのです。 全ての結び方をしらみつぶしに調べると (点の数)! 通りの総直線距離を計算しなければならず 点が増えるとかなり苦しいことになります・・・

  • 最接近点を持つ線を特定

    お世話になります。 宜しくお願いします。 現在、swingとawtを駆使して、線や図形の描画を行うアプリを作成しています。 その中で、次の様な事をする場合の処理で躓いております。助けてください。 よろしければ添付の図をご参照下さい。 ほぼ中央にサイコロの「1」の目の様な正方形があり、 その中心に赤い円(中心点)があります。 図示上ではわかりやすいように赤い円で示しましたが、実際には1pixelの点です。 そして、4本のラインがまとわり付いていると思います。 これらのラインの内、「中心点との最接近点を持つ線」を特定したいです。 各座標同士の頂点情報は、図形の親要素(TextPane)の0,0からの相対頂点情報として、 いつでも参照可能なスコープの変数に保持していますので、 後は特定する為の計算式にあてはめるだけと考えておりますが、難航しております。 どうかお助け下さい。よろしくおねがいします。 <他> ・全ての頂点座標は必ず0,0以上の値となります。 ・中心点は必ず正方形の中心に描画されます。ただし、正方形自体の描画位置は無作為です。 ・ラインは図示上では4本ですが、実際にはn本です ・ラインは図示上では適度に分散していますが、頂点情報は再描画の度、完全に無作為に設定されます。 ・図形をTextPaneの中に書く所までは問題なくできています。

    • ベストアンサー
    • Java
  • 線をオブジェクトとして選択するアルゴリズムについて。

    線とか、丸とかを描くグラフィック関係のソフトを作りたいのですが、 wordの図形描画の機能みたいに、ある線分をクリックすることでその線分がアクティブになって、移動をしたり、長さを変えるといったようなことをプログラムで作ろうとしたら、どのようなアルゴリズムを組んだらよいのでしょうか? ちなみに、言語はVC++とVBを使うことができます。 簡単な考え方でもよいですし、どちらかの言語のプログラムを書いていただいても結構なので、どなたかお答えよろしくお願いします。

  • 同一セッションIDのブラウザを複数開かせたくない

    ASP、ActiveXDLL、JavaScriptで作られているシステムのメンテナンスをしています。 DBはOracle9iです。 一部の大変複雑な処理をしているところや、画面遷移時に仮保存状態として処理するためにASPプログラム内でワークテーブルを作成し、そこに保存しております。 ワークテーブルは「IPアドレス+セッションID+元テーブル名」としており、IEで ・「Shiftキー+リンククリック」 ・「Ctrl+N」 ・「リンクを新しいウィンドウで開く」 などで、同一セッションIDでブラウザを複数画面操作できるので、その複数画面で同じプログラムで操作すると同じワークテーブルを扱い、おかしなデータができてしまいます。 多数のプログラムでワークテーブルを使用しており、ワークテーブルの名前を変更することは時間的に無理があるので、同一セッションで複数画面を開かせないようにしたいと思っているのですが、なんとか実現できませんでしょうか? よろしくお願いします

  • 線分や円弧をクリックして選択するプログラム

    CAD等で描かれた2次元の図面上の任意の線(線分や円弧)をクリックして選択するプログラムを作っています。 いまは叩き台として、各線のバウンディングボックス(線分や円弧を囲む最小の長方形)の情報(対角線の両端座標) が入った配列(実際はC++のSTL vectorです)を用意して、クリックした座標の一番近くに在る、若しくは内包する バウンディングボックスを線形探索して、見つかったバウンディングボックスに所属する線がクリック許容範囲内 であるかを分析しています。 しかし、この方法では線の数が少ないうちは良いのですが、大規模な図面になると時間が掛かってしまい 使い物になりません。 このような場合、どういったデータ構造でどのようなアルゴリズムで探索するのが良いのでしょうか? なにか定石的なものがあるのでしょうか? 恥ずかしながら、探索アルゴリズムというと学生の時に2分探索法等を習った程度で、2次元以上の高次元のもの 扱うアルゴリズムはピンときませんでした。

  • マウスクリックと図形の関連付けについて

    C++とDirectXを使って白地図の都道府県をマウスでクリックするとその県に色がつくプログラムを作りたいのですが、不定形の範囲とマウスクリックを関連付ける方法がわかりません。 長方形や丸ならクリックした座標と図形の当たり判定をとる方法で色を変えられたのですが、都道府県だと形が不定形なため、座標が計算で求められないのでできませんでした。 関連づけの方法を教えてください。 こんなかんじになるものです↓

  • C#(.net) ドロー系ソフト作成 図形選択方法

    C#(.net framework 4.0)で現在業務に使用しているソフトで、地図画像に対して、ごく初歩的な図形(直線や矢印、円、四角形、文字程度)を挿入する事が必要になりそうでして、ドローソフト系のようなプログラミングを行いたいと思っています。(Excel上での図形挿入の様なイメージ) Graphicsを使用して、線や塗りなどの描画はすぐにできると思うのですが、一度描画した線や四角を移動させたり大きさを調整したりするために、対象の図形をマウスでクリックして選択する方法がまるでうかびません。通常、この「図形を選択する」というのはどのように実現させているのでしょうか?思いつくものとしては、 図形をコントロールとして扱い、マウスイベントを直接受け取れるようにする? (そもそもコントロールの使い方として間違っているような気がしますし、パフォーマンスにかなりの悪影響がありそう…) 別に座標マップを作り、どの図形がどのドットに対応しているかを記録する? (線を引いた結果、どの座標がどの図形かをすべて計算する必要があると、かなりの計算とコード量になりそう…) くらいです。基本的な、もしくは一般的な方法や考え方がありましたら是非教えてください。ペイント系ならそれなりにネット上に情報はあるような気もするのですが、ドロー系に関する情報はなかなか少ないようで困っています。ドロー系ソフト作成時に参考になるコードや情報や本などありましたら、そちらも教えていただけると助かります。よろしくお願いいたします。 P.S. 質問投稿時にさんざん迷ったのですが、C#(.Net Framework)のカテゴリーって、こちらの C・C++ でよろしかったんでしょうかw

専門家に質問してみよう