名称 MIRS1002 数字認識/方向決定プログラム作成仕様書
番号 MIRS1002-SOFT-0002

最終更新日:2011.2.7

版数 更新日 作成 承認 改訂記事
A01 2011.2.28 斉藤 斉藤 初版

目次

  1. ドキュメントの概要
  2. 仕様・方針
  3. ソフトウェア構成と動作概要
  4. まとめ

  1. ドキュメント概要
  2. このドキュメントはOpenCVを用いた数字認識と、その結果を用いて進行方向を決定するプログラムに関して記述する。


  3. 仕様・方針

  4. ソフトウェア構成と動作概要
  5. 以下に数字認識と進行方向決定のアルゴリズム/関数構成などを示す。

    1. 進行方向決定部

      進行方向決定部のフローチャートを以下に示す。進行方向決定部は画像処理を行った結果から次の進行方向を決める処理を行う。
      なお拡張子(.dia)はDIAというダイアグラムエディタの出力ファイルである。

    2. 数字認識フロント部

      数字認識フロント部のフローチャートを以下に示す。フロント部は撮影した画像を加工し、0901のプログラムに引き渡すまでの処理を行う。
      ※のついた処理はMIRS0901の関数をそのまま利用している。

    3. 数字認識コア部

      数字認識コア部のフローチャートを以下に示す。コア部はMIRS0901のプログラムを改良したもので、引き渡された写真から数字を読み取るまでの処理を行う。
      ※のついた処理はMIRS0901のものをそのまま利用、%のついた処理は一部改良を行ったものである。

    4. 関数構成

      以下に、関数の構成を示す。※のついた関数はMIRS0901の関数をそのまま使用している。%のついた関数は一部改良を行ったものである。

      • num()
        • get_number()
          • img_update()%
          • input_DB()%
            • threshold()※
            • noisecut()※
            • labeling()%
              • nsuniq()
              • image_ans()
            • gettrim()※
            • triming()※
            • select_number()%・・・簡単なバグの修正のみのため説明略
    5. 関数解説

      作成・改変した各関数の解説を示す。OpenCVの関数に関しては、OpenCVの公式ページにあるレファレンスを参照。 MIRS0901の関数に関しては、MIRS0901のドキュメントを参照。

      【作成及び使用した関数の詳細】
      関数名 引数 戻り値 動作概要 参考画像
      num() 1(int*):進行方向

      2(int*):次の仕掛け番号仕掛け番号

      3(int*):次の仕掛けが鍵のとき-鍵の次の仕掛け番号,のれんの時-のれんであることを示す定数

      4(int):十字路の現在位置(前,後,右,左)
      (int)正常終了:0
      異常終了:-1
      画像認識モジュール最上位の関数。次の進行方向を行うアルゴリズムが含まれる。 なし
      img_update() 1(char*):キャプチャ結果の画像の名前を指定

      2(int):画像の幅をピクセル単位で指定

      3(int):画像の高さをピクセル単位で指定
      (int)正常終了:0
      異常終了:-1
      標準のプログラムを流用している。uvcdynctrlコマンドによる、送電周波数補正などの設定を行うようになっている。 キャプチャ画像
      get_number() 1(int[2][2]):認識した数字の値がそのまま入る。

      [0][0]-左上、[0][1]-右上、[1][0]-左下、[1][1]-右下
      (int)正常終了:0
      異常終了:-1
      MIRS0901の画像処理プログラムを呼び出す準備とその結果の後処理を行う。画像の上下分割、多数決による数字の絞り込みの処理を含む。 上画像

      下画像
      input_DB() 1(IplImage*):get_number()で分割された画像

      2(int*):認識した数字1

      3(int*):認識した数字1の位置(右or左)

      4(int*):認識した数字2

      5(int*):認識した数字2の位置(右or左)

      6(int*):詳細なエラー番号[-1:画像1が失敗,-2:画像2が失敗,-3両方とも失敗,0:両方とも成功]
      (int)正常終了:0
      異常終了:-1(引数5が-3のときのみ)
      MIRS0901の画像処理プログラムのメインプログラム。引数の変更と詳細なエラー番号に対応。画像の周囲に強制的に黒の領域を周囲に挿入する処理を含む。 入力画像

      2値化済み画像

      黒の領域挿入画像
      labeling() 1(IplImage*):2値化された画像

      2(IplImage*):数字部分の領域のみが白で残った画像1

      3(IplImage*):数字部分の領域のみが白で残った画像2

      4(int*)詳細なエラー番号[input_DB()を参照]
      (int)正常終了:0
      異常終了:-1
      ラベリングを行う関数(MIRS0901)。ラベリングとは、画像を領域別にラベルをつける作業のことで、今回は黒い部分の中の白い部分を領域別に分け、 その中から数字のみの部分を取り出す目的で使っている。ラベリング自体とその中から画像の領域を判別する部分に分かれ、判別部分をオリジナルimage_ans()で書き直した。 黒の領域挿入画像

      取り出した画像1

      取り出した画像2
      nsuniq() 1(int*):引数2の配列の要素数(結果の表示のためにも使用する)

      2(int[]):ユニークな数字を求めたい配列
      戻り値なし labeling()内で生成される、ラベルのマップの中のユニークな数字を求めるための関数。結果は、引数を上書きして返却される。 なし
      image_ans() 1(int):引数2の配列の要素数

      2(IplImage*[]):それぞれのラベリング領域のみが白で残った画像の配列

      3(int*):数字部分のみが残った画像の番号1(引数2の配列の添字に対応)

      4(int*):数字部分のみが残った画像の番号2(引数2の配列の添字に対応)

      5(int*):詳細なエラー番号[input_DB()を参照]
      (int)正常終了:0
      異常終了:-1
      labeling()内で呼ばれる、ラベル領域が数字であるかどうかを判別する関数。ラベル領域は画像によって可変のため、labeling()内で動的配列を生成している。 直線検出と画像の黒領域と白領域の面積比によって絞り込みをかけている。 配列中の画像1

      配列中の画像2

      配列中の画像3

  6. まとめ
  7. 認識率に関しては、会場で適切にパラメータを設定した場合は、十分な精度があると思われる。 会場では、準備時間に撮影された写真を認識することができた。

    目標とした開発期間の短縮は、事前調査の不足などから十分に達成できたとは言えなかった。 特に、OpenCVの関数を理解するのに時間がかかった。よい参考文献などを見つけられれば効率化できたかもしれない。

    以下に、プログラムを書く・MIRS0901のプログラムを理解するために参考にしたサイト等を挙げておく。

    また、本校図書館にO'REILLの"詳解 OpenCV―コンピュータビジョンライブラリを使った画像処理・認識"を購入していただいたので、参考になるはずである。


    以下に、今回作成したファイルのtarballをリンクしておく。コメントはUTF-8/LFで書かれている。

    各ソースファイル中の"DEBUG"はdefineしておくと、デバック用の出力を行うようになる。
    "SIMPLEDEBUG"をdefineすると、単体テスト用のmain関数や有効になる。(ただし、下位のダミー関数等は定義されていないので注意)

    num.tar.gz

    以下に、画像をフィルタリングする際の閾値の決定を補助する、check用のプログラムをリンクする。
    ただし、これを使用した環境のOpenCVのバージョンが、学校の環境より新しいので、cvSaveImageの引数などが変わっている。注意すること。

    check.tar.gz

関連文書

  • MIRS0901 OpenCVによる数字認識


    MIRS1002トップページへ