名称 MIRS1004 画像処理関数
番号 MIRS1004-SOFT-0004

最終更新日:2011.2.25

版数 更新日 作成 承認 改訂記事
A01 2011.2.25 飯谷 健太 細越 寛太 初版

目次

  1. 概要
  2. ソースコード
  3. フローチャート
  4. プログラム解説
  5. 実行例

  1. 概要
    1. OpenCV(インテル社の開発、公開したオープンソースのコンピュータービジョンライブラリ→OpenConputerVision)
      を用いて数字認識を行うにあたり、三種類の方法が考えられた。
      一つは標準の周辺分布法を改良して用いる方法。
      二つ目はMIRS0901の開発した方法を改良する方法。
      三つ目は、テンプレートマッチング法によるものである。

      今回、MIRS1004ではテンプレートマッチング法を採用することを決定した。
      その理由としては、テンプレートマッチングは関数一つで簡単に行うことができるということ、
      そして、青木先生からテンプレートマッチングをおすすめされたということ、
      画像処理関数のプログラミングを始めるのが遅すぎ、開発完了までの時間があまり無かったため
      アルゴリズムの理解が比較的容易いテンプレートマッチングを選ぶしかなかったという3つの理由による。


  2. ソースコード
    1. ソースコードを以下に示す。
      ソースコードは先生が管理しています。どうしようもなくなったとき相談すれば、貰えるかもしれません。 プログラムのコンパイルにはopenCVライブラリのインストールが必要である。
      D科演習室内のPC,及びMIRS本体においてはopenCVが導入済みであるのでGCCや、Makefleでコンパイルが可能である。
      OpenCVのインストール、OpenCVライブラリを用いたコンパイル方法は
      MIRSMG3Dドキュメント管理台帳 MIRSMG3D画像処理開発環境実装手順書を参照。

      Source 解説
      Makefile 画像処理プログラムを統合するためのMakefile.makeするtestと言う実行ファイルができる
      Thre.c 二値化を行う
      img_update.c WEBカメラから画像を取得する。標準プログラム
      DB_num.c この内部でテンプレートマッチング、取得画像の変形を行っている。
      DB.c 優先順位で定めたとおりに数字を選択する。
      Togo_test.c 統合用のプログラム。結果を表示する。
      まとめてDL



  3. フローチャート
    1. fig.1にフローチャートを示す。



      fig.1 画像処理関数フローチャート


  4. プログラム解説

    1. DB_num.c
      DB_numの内部関数と解説を以下に示す。
      関数名 解説
      void set_number() 事前に用意した1~8までのテンプレートをロードする。
      void DBcap() WEBカメラから画像を取得し、二値化する。
      void MatchTemplate(int num) 1~8のすべての画像でテンプレートマッチングを行う。
      void Resize_set(int i,int *x,int *y) 撮影画像に対して縮小率を設定する。(i:縮小率(%), x:縮小後のxsize, y:縮小後のysize)
      void Resize(int x,int y) Resize_setで設定した縮小率で画像を縮小する。(x:xsize, y:ysize)
      void print_number() 各々の数字の認識率を表示する。デバッグ用。
      void ShowImage() 撮影した画像を別ウインドウで表示する。GUI上でないと見れない。
      void RemoveImage() 保持していた画像のデータ分のメモリを開放する。
      int DB_num(int *Num1,int *Num2) メイン、画像サイズを変えてマッチングし、座標、精度を計算。返り値-1で左側数字が失敗、返り値-2で右側数字が失敗、返り値0で成功
    2. 以上のように内部関数を定義し、使用している。

    3. テンプレート
    4. 画像処理系のプログラムはCPUに非常に負荷をかけることになる。特にMIRSに搭載されているCPUは弱い。
      そのため、本プログラムのように撮影画像を変形しその分マッチングを行うようなプログラムでは非常に時間がかかってしまう。
      そこで、事前に用意する1~8までのテンプレート画像を極力小さいものとすることで時間短縮に成功した。
      また、テンプレートは競技場で撮影したものを使うのではなく、競技規程で定められた数字サイズを元に自作した。
      自作テンプレートでは、マッチング精度が落ちると考えられたが、逆に精度は良くなった。
      このテンプレートの作成方法については1班の川井からアドバイスを貰った。
      以下に競技会でも使ったテンプレート画像を示す。
      テンプレート画像をnumと言うディレクトリに入れ、実行場所(カレントディレクトリ)に入れておかなければ実行時にエラーとなる。
      競技統合プログラム(すべてを統合したプログラム)を作成した時にはそのプログラムを実行するディレクトリにnumを入れておかなければならない。

               


               
           fig.2 テンプレート

    5. 二値化処理に関して
    6. 本プログラムでは二値化はthre()と言う関数で行っているが、この関数内部ではOpenCV標準の二値化処理(cvThreshold)を使用している。
      この関数の引数にはさまざまなバリエーションがあり、それぞれ二値化処理の結果は異なったものになる。
      このドキュメントを見てくださった方は、色々な引数を指定してどの値で最適な二値化処理が行われるか是非研究してみてください。
      ちなみに4班ではいろいろな方法を試した結果、CV_THRESH_BINARY_INV | CV_THRESH_OTSUを採用した。
      二値化処理が非常に正確に行われればそれだけ、マッチングの精度も上昇します。
      以下に標準画像と、二値化した画像を示す。
         
            fig.3 撮影画像                fig.4 二値化画像

    7. 仕掛け優先度によるソートに関して
    8. MIRSを班ごとに分かれて製作する上でそれぞれの機体に特徴が生まれる。そのため、得意な仕掛け不得意な仕掛けが生まれてしまう。
      また、鍵扉やゴールなど優先度を高くしなければいけない仕掛けも存在する。
      そこで、仕掛けの優先度を設定することはクリアするためには絶対に必要な方法であると考えられる。
      本プログラムではDB()と言う関数の内部で優先度に置けるソート処理を行っているが、
      if文を優先度の高い数字の順番に並べた非常に単純なものとなっている。そのため、動作に時間がかかってしまっている。
      ソート処理に関しては改善が必要である。
      ちなみにMIRS1004は以下のような設定になっている。ロータリーの優先度が低いのは無限転輪(キャタピラ)を使用しているためである。

      1.鍵,扉(num=4)
      2.のれん(num=8)
      3.ゴール(num=5)
      4.T字路(num=1)
      5.小部屋(num=2)
      6.十字路(num=6)
      7.ロータリー(num=3)
      8.行き止まり(num=7)


    9. DB()関数の使い方
    10. DB()関数を使用すれば、DBを撮影し、優先度と方向の情報を付加した数字二つを取得することができる。
      Togo_test.cを見てもらえば分かるとおり、DB(&priority1,&priority2,&houkou1,&houkou2);の
      第一引数には優先度第一位の数字、第二引数には優先度第二位の数字、
      第三引数には優先度第一位の数字の方向、第四引数には優先度第二位の数字の方向が入る
      後はこれらをそのまま使用できる。
      DBの読み取りに失敗した場合にはエラーであった引数が0となる。


  • その他
    1. 今後数字が増えたり、二桁になった場合、DB_num.cを少しいじくり、DB.cにちょこっと手を加えれば対応できると思います。

    沼津工業高等専門学校 電子制御工学科