2010/06/13

OpenCV マーカーの識別化

昨日、今日とマーカーの識別プログラムを書いてました。

以前はマーカー内に文字を書き、輪郭で識別する方法も試しました。
マーカー内部に「」を書いたものと「」を書いたものの2つを識別させた場合、
カメラとの距離が近い場合はきちんと識別できましたものの、
距離が離れるとどうしても輪郭がぼやけるため、ばらつきが出てしまいました。


輪郭での識別はあきらめて、2次元コードによる識別を行うことにしました。
原理は単純で、小さい四角(以後、ドット)を縦横4つずつ並べ、ドットの組み合わせで
マーカーを識別することにしました。

ドットの黒は二進数の1に対応し、ドットの白は0に対応します。
ドット16個で16ビットとし、6万通り以上のパターンを作ることが出来ます。
下の画像のパターンだと、一番左は16進数で000Aなので10進数だと10、
真ん中は16進数で0309なので777、一番右は16進数で8000なので327678となります。
(灰色の線は見やすくするために書いているだけです。実際にはありません。)











マーカーの仕様は下記の通りとなります。
・マーカー全体のサイズ:縦横90mm
・マーカーの外側の太さ:10mm
・方向ドットとマーカーのフチとの間隔:5mm
・方向ドット:10mm四方を塗りつぶす
・数値ドット:10mm四方の枠内を8mm四方の正方形で塗りつぶす





















ドット解読の方法は、かなり適当ですが下記の通りとなります。
例:一番左上のドットの場合
マーカーをカメラで写してマーカー認識を行うと、白黒が反転された状態の画像となり、
左上のドットは、始点が(15,15)、終点が(25,25)の四角形の中に描かれます。

ドットの中心(20,20)の上下左右3画素((17,17)から(23,23))の画素の値を調べて、
白くなっているドットの数が一定以上あれば、左上のドットは塗りつぶされていると認識して、2進数の1になります。
これを16回繰り返すと、ドットの解読が完了します。

また、これと同じ方法を使って、方向ドットがどちらを向いているかを検出することも可能です。

実際の動作模様は下記の通りです。






最近コードが長くなってきたので、Googleサイトでコードの保管場所を作りました。
URLはhttp://sites.google.com/site/playwithopencv/ です。
マーカーの図面データもこっちに置きました。

ではまた。

4 件のコメント:

  1. このプログラムを実行した際に、マーカーを検出すると
    Opencv Error: Assertion failed CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT(tvec) ) in unknown function,
    file ..\..\..\..\ocv\opencv\src\cv\cvclibration.cpp, line1139
    というのが出てしまうんですがどうしてでしょう?
    VS2008 OpenCV2.1を使っています。

    返信削除
  2. >匿名さん

    たぶんカメラのキャリブレーションファイルが読み込まれていないため、エラーが出たのでは無いかと思います。

    コードと一緒に入っている、
    intrinsic.xml
    distortion.xml
    の2つのファイルを、バイナリデータと同じ階層に置くと
    起動時に読み込んで、動作するようになると思います。

    返信削除
  3. できました!
    ありがとうございます!

    返信削除
  4. 富山県にある高岡工芸高校電気科の教員です。


    OpenCVマーカーの識別化の記事ですが、大変面白く読ませていただきました。
    向きが分かるよう方向ドットをつけたアイディアには、なるほどと思いました。
    このような貴重な情報を書いていただき、大変感謝いたします。


    事後報告になりますが、
    このブログにある4×4のマーカーの作り方と、
    公開されているOpneCVを使った認識プログラムを利用させていただき、
    生徒が主体となり、学校祭にて自分たちの課題研究の作品を紹介するロボットを作りました。

    ロボットはライントレースで動き、マーカーを認識するたび停まり、
    課題研究の班員の写真を表示し、研究内容を音声で紹介します。

    このロボットは大変好評で、今後なのですが、
    本校が管理する青井記念館美術館(一般の方も無料で公開されています)の作品を紹介するロボットとして改良し、
    北日本放送が主催するミラコン2017に、応募したいと考えています。

    ミラコン2017とは、未来に役立つ物の製作や研究を富山県の高校生が行い、論文にまとめ、プレゼンを行うコンテストです。
    製作やプレゼンの様子は、北日本放送にて放送されます。

    紹介ロボットの核になる認識プログラムとマーカーについては、
    このブログのものを利用させていただいたと明記させていただきたいと思います。

    製作物の放送や学校のホームページへの掲載など、
    問題がありそうならば、
    以下のメールアドレスに連絡いただければと思います。

    ohnaga-makoto@tym.ed.jp

    今後ともよろしくお願いいたします。

    返信削除