沼津高専 電子制御工学科
MIRSNCAM-画像処理プログラム関数レファレンス
MIRSNCAM-SOFT-0008
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2006.02.13 柴田龍治 柴田龍治 初版

--目次--
  1. 目的
  2. ヘッダファイル一覧
  3. 関数一覧
  4. 関数概要

1. 目的

本仕様書は、本機MIRSにおける画像処理プログラムの詳細について記述したものである。

2. ヘッダファイル一覧

ファイル名調整を必要とする変数説明
image.h カラー画像をモノクロ画像に変えるとき(画像処理概要の動作概要4)に必要となるヘッダファイル
border 白黒の閾値。0〜255まで指定可能。この値より小さい値をもつ画素は黒に、大きい値をもつ画素は白になる。
競技場の明るさによって画像処理が上手くできない場合は、この値を調節する。
color_boder カラー画素とモノクロ画素の区別の際の閾値。カラー画像をモノクロ画像に変換するとき、画素のR[]G[]B[]の3つの値の差をくらべて、ひとつでもこのcolor_boder以上値が離れていれば、その画素はカラー画素であると判断される。
この値を調節することで、白黒でない色素の強い背景部分を除去することができる。
slit.h スリット法を行う際(画像処理概要の動作概要5〜8)に必要となるヘッダファイル

3. 関数一覧

ファイル名関数名書式返り値説明
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)

4. 関数概要

  • int number_get(void)

  • 画像処理メイン関数。画像処理結果として得られたポスト番号をそのまま返り値として与える。ポストを見つけなかった場合は0を返り値とする。

  • void ioperm(int, int, int)

  • 入出力ポートの設定。第一引数⇒使用するポート番号(16進数表記)、第二引数⇒使用するバイト数、第三引数⇒使用モード(1で書き込み)

  • void outb(int, int)

  • 指定されたポートに指定された値を出力する。出力データは1バイトのみ。第一引数⇒出力データ、第二引数⇒出力ポート番号

  • 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-画像処理評価試験報告書-