名称 | MIRS1205 OpenCVによる数字認識プログラム |
---|---|
番号 | MIRS1205-SOFT-0002 |
最終更新日:2013.02.15
版数 | 最終更新日 | 作成 | 承認 | 改訂記事 |
---|---|---|---|---|
A01 | 2013.02.15 | 太田航 | 初版 |
目次
以下に、本プログラムのフローチャートを示す。
fig.1 フローチャート
以下に、本プログラムの関数構成を示す。
「number_oota関数で認識した数字からコースを決定する」までを行う関数。
number_oota関数を使用している。
「数字認識」を行う関数。
(get_img, binarization, labelling, triming1, triming2, number_search)関数を使用している。
カメラを用いて画像を撮影し、画像を保存するための関数。
引数は(撮影した画像名(保存場所指定), 画像の幅, 画像の高さ)を指定するようにしている。
あくまでも、画像を撮影,保存するだけなので、
この関数の後にcvLoadImage関数を用いて画像を読み込むことでデータとして扱えるようになる。
fig.2 画像取得結果例
指定した画像を二値化するための関数。
引数は(入力画像のIplImage構造体名, 出力画像のIplImage構造体名)
入力画像を
@グレースケール化 (cvCvtColor関数を使用)
Aガウシアンフィルタを用いた平滑化 (cvSmooth関数を使用)
B大津の手法を用いた二値化 (cvThreshold関数を使用)
の順で処理を行い、引数で指定した「出力画像のIplImage構造体名」に結果を出力する。
fig.3 二値化処理結果例
指定した画像から数字部を検出するための関数。
引数は(入力画像, 左の数字部検出失敗時のポインタ変数, 右の数字部検出失敗時のポインタ変数)
入力画像(二値化画像)から
@cvFindContours関数を用いた輪郭検出(戻り値は取得した輪郭の全個数)
AcvBoundingRect関数で全輪郭の傾いていない外接四角形領域の座標を取得
B取得した座標から各輪郭の外接四角形の面積を計算
C計算した面積が指定した大きさの範囲内かつ外接四角形の高さが指定値以上なら
入力画像に四角形を描画する処理を行う。
D一番目の四角形と二番目の四角形を左右の数字部として検出する。
もし、四角形が一つ分しか検出していなかったらpxy1, pxy2に「-1」を代入する。
E入力した画像に四角形を描画した画像を
cvSaveImage関数を用いて画像ファイルとして保存する。
の順で処理を行っている。
今回は、この関数の後に一番目と二番目の四角形の左上角の座標より左右を判断するようにしている。
なお、出力画像がほとんど黒くなってしまうのは原因がわからなかった。
fig.4 ラべリング処理結果例
指定した画像から、指定した範囲を切り取るための関数。
引数は(入力画像, 指定する範囲の座標データ)
@cvSetImageROI関数を用いて、その範囲のデータのみに処理を適用するようにする。
AcvSaveImage関数を用いて、画像を保存する。
この時、「保存処理」をするのは@で指定した範囲のみとなる。
この関数は「左の数字」用としている。ちなみにtrimingではなく「trimming」の表記が正しい。
fig.5 トリミング(左)処理結果例
triming1関数の「右の数字」版。処理を考えるのがめ…難しかったのでこのようにした。
triming1, triming2の関数の後に、切り取った画像をbinarization関数を用いて二値化している。
fig.6 トリミング(右)処理結果例
入力画像1,2(二値化したもの)から、「0〜9」のどの数字かを判別するための関数。
引数は(入力画像1, 入力画像2, 入力画像1の認識結果, 入力画像2の認識結果)
ROI走査を用いて処理を行っている。通常のROI走査は「0,2〜9」の数字しか判別できない。
そのため、@〜FのROI走査の後にGとHの座標が黒または白かという判断を追加することで
「1」の判断をできるようにしている。
fig.7 ROI走査(@〜F方向に進む) | fig.8 追加調査(G,Hの地点) |