沼津高専 電子制御工学科 | ||||||||
| ||||||||
改訂記録 | ||||||||
---|---|---|---|---|---|---|---|---|
版数 | 作成日 | 作成者 | 承認 | 改訂内容 | ||||
A01 | 2006.02.13 | 柴田龍治 | 柴田龍治 | 初版 |
ファイル名 | 調整を必要とする変数 | 説明 |
---|---|---|
image.h | カラー画像をモノクロ画像に変えるとき(画像処理概要の動作概要4)に必要となるヘッダファイル | |
border | 白黒の閾値。0〜255まで指定可能。この値より小さい値をもつ画素は黒に、大きい値をもつ画素は白になる。 競技場の明るさによって画像処理が上手くできない場合は、この値を調節する。 |
|
color_boder | カラー画素とモノクロ画素の区別の際の閾値。カラー画像をモノクロ画像に変換するとき、画素のR[]G[]B[]の3つの値の差をくらべて、ひとつでもこのcolor_boder以上値が離れていれば、その画素はカラー画素であると判断される。 この値を調節することで、白黒でない色素の強い背景部分を除去することができる。 | |
slit.h | スリット法を行う際(画像処理概要の動作概要5〜8)に必要となるヘッダファイル |
ファイル名 | 関数名 | 書式 | 返り値 | 説明 |
---|---|---|---|---|
number_get.c | number_get | int number_get(void) |
ポスト番号 | 画像処理メイン |
ioperm | void ioperm(int, int, int) |
入出力設定 | ||
outb | void outb(int, int) |
LED表示 | ||
strcpy | void strcpy(str, str) |
文字列の代入 | ||
sys | void sys(str) |
jpg→bmp変換 | ||
bmp.c | readBmp | void readBmp(char *, unsigned char *) |
bmpデータの読み込み | |
to256BW | void to256BW(unsigned char *, unsigned char *) |
カラー画像を3値化画像に変換 | ||
to24BMP | void to24BMP(unsigned char *, unsigned char *) |
24ビットbmp形式に変換 | ||
writeBmp | void writeBmp(unsigned char *, char *) |
bmp画像作成 | ||
slit.c | slit_func | void slit_func( unsigned char *) |
スリット上のデータをとる。(画像処理概要の動作概要5) | |
post_id.c | post_id | void post_id(void) |
スリット上のポスト番号識別。(画像処理概要の動作概要6) | |
position_id.c | position_id | void position_id(void) |
スリット横方向のノイズ除去及びポスト識別。(画像処理概要の動作概要6) |
int number_get(void)
void ioperm(int, int, int)
void outb(int, int)
void strcpy(str, str)
指定された文字列を変数に代入する。書式は、strcpy(bmp,"djpeg -bmp jpgファイル名 > bmpファイル名"); である。ファイル名はフルパス指定で記述する。
void sys(str)
jpg形式の画像をbmp形式の画像に変換する。sys()はシステムコマンドを実行する関数で、コマンドを引数として与える。
標準ライブラリヘッダーファイル stdlib.h をインクルードする必要がある。
void readBmp(char *, unsigned char *)
bmpデータの読み込み。下図のように、画像の左下を原点としてx-y座標をとり、それぞれの座標の画素のRGBデータを配列に格納する。
座標(x,y)の画素の R,G,B のデータはそれぞれ、image[x][y][0], image[x][y][1], image[x][y][2] に格納される。
void to256BW(unsigned char *, unsigned char *)
readBmp()で読み込んだデータをみて、画像を3色(黒、白、グレー)に分ける。
まず readBmp() でとった画素のRGBデータを比較して、カラーの色素が強い部分をグレーにする。
⇒ 方法は、RGBそれぞれのデータの差分をとり、その差分が color_boder ( image.h で定義)より大きい場合をカラーの色素が強いと判断し、値を144(グレー)に変える。
次に、各画素のRGBデータをある特定の重み係数を掛けて平均をとり、一つのデータ(0〜255)にする。
最後に、一つにまとまった各画素のデータを border( image.h で定義)と比較し、これより大きい場合は255(白)、小さい場合は0(黒)に変え、image_bw[x][y] に格納する。
処理前の画像と処理後の画像を下に示す。
void to24BMP(unsigned char *, unsigned char *)
to256BW() で一つにまとめた各画素のデータ image_bw[x][y] を 各画素のRGBデータ image[x][y][]に代入する。
void writeBmp(unsigned char *, char *)
to24BMP()で作成した image[x][y][]をもとに bmp画像を作成する。
void slit_func( unsigned char *)
画像に垂直方向に32本のスリットを入れ、各スリットを上から順に見て、色の変化、色の長さ(同じ色が続くピクセル数)をスリット構造体( slit.h で定義)に格納する。色の変化は、 slit[スリット番号].s_color[色の順番] にchar型で w(白)、b(黒)、g(グレー)のいずれかが格納される。色の長さは、slit[スリット番号].length[色の順番] にint型でピクセル数が格納される。スリット番号は、左から順に0〜31番までである。
下にスリットを入れる前の画像と入れた後の画像を示す。
void post_id(void)
slit_func() で格納されたスリット構造体のデータから、スリット上のポストパターンを検出する。ポストパターン検出後、ポストの有無、ポスト番号、黒線幅平均値をスリット構造体に格納する。
下にポストパターン検出の流れ図を示す。図のENDにおける line_num がポスト番号となる。
このポストパターン検出法は、下に示すポストの各パラメータ表に基づく。
⇒ ポスト上部の白色部分(ポスト最上端から最初の黒線までの部分)の垂直方向のピクセル幅。
⇒ ポスト黒線の垂直方向のピクセル幅。
ポスト白線(黒線と黒線の間部分)の垂直方向のピクセル幅。
⇒ ポスト下部の白色部分(ポストの最下黒線から赤外線スイッチ上端までの部分)の垂直方向のピクセル幅。
⇒ ポストの水平方向のピクセル幅。
⇒ スリットがポストにかかる本数。
void position_id(void)
スリットの横方向のノイズ除去を掛けた後、画像中心にもっとも近いポストの番号を返えす。ノイズ除去の方法について説明する。
まず、post_id() で得られたスリット番号0〜31までのスリット上のポスト番号(ポストが検出できなかた場合は0)を順に並べる。この検出したポスト番号の配列パターンに対するノイズ除去法を下記に記述する。
関連ドキュメント | |
---|---|
ドキュメント番号 | ドキュメント名称 |
MIRSNCAM-SOFT-0007 | MIRSNCAM-画像処理概要- |
MIRSNCAM-SOFT-0009 | MIRSNCAM-画像処理試験手順書- |
MIRSNCAM-SOFT-0010 | MIRSNCAM-画像処理評価試験報告書- |