まず画像をマイコンで取り込む環境を構築してみます。一番重要なカメラには PHS 用のカメラユニット Treva を使います。AAF ぱ研の力によって解析が行なわれたのですが、非常に簡単にマイコンと接続する事が出来ます。3.3V 動作で、マイコンからクロックを供給し、Treva からのシリアルデータを読み込むだけで OK です。つまり電源2本と I/O 2本をつなぐだけで画像の取り込みが出来るのです。この簡単さは衝撃的です。
取り込み用のマイコンは日立の H8 Tiny を使ってみました。以前は外部バスの出ない H8 なんて AVR があるし魅力無しと思っていたのですが、秋月から超小型基板で販売されるようになって見方が変わりました。1,600円でこのサイズは非常に魅力的です。今回は将来的な小型化を見据えて、この基板を使ってみました。
Treva は 3V 動作なので、通常の 5V で動く CPU ボードとの直結は危険です。そこで今回は接続を簡単にするために H8 を 3.3V で動かしてみます。しかし秋月の基板には 16MHz の発振子が実装されており、3.3V では安定した動作が出来ませんでした。そこで基板上の 16MHz 発振子を無理やり破壊し、代わりに 10MHz の3端子セラミック発振子を実装しました。ちなみに Treva も 3.3V で問題なく動作しました。
Treva はピンプラグで PHS 本体と接続するのですが、これに対応する4端子ピンジャックの入手が難しいので、筐体を外して内部の線を取り出し、直接つなげることにしました。クロック信号のピンク線を Port1 の bit0 に、データ信号の黄色線を Port1 の bit1 に接続します。Treva と基板同士の固定は、結局両面テープを使ってごまかしてしまいました。
画像取り込み環境の構築(ソフトウェア編)
まずは H8 で Treva からの画像データを取り込み、PC に転送する環境を作ります。PC との接続はシリアルを使います。Treva が取り込むデータ量は1画面あたり 96x72x2 で、約 13KB になります。H8 の内部 RAM は 2KByte なので1画面分を保持する事は出来ません。Treva からデータを取り込みながら、シリアル経由でデータを PC に送信させる事にします。
H8 側の取り込みソフトは、AAF ぱ研で公開されているソースをそのままパクって、秋月Cコンパイラ(日立Cコンパイラ評価版)のサンプルソースとマージして作成しました。PC 側の方では Visual Basic を使ったお手軽取り込みソフトを作成しました。シリアル送信部分は軟弱にもフリーのシリアル送受信用 OCX を使いました。
PC 側で Get ボタンを押すと H8 に1バイトのダミーデータを送信し、これをトリガにして H8 側で Treva からの画像データ取得を開始し、取り込んだデータを順次 PC 側に送信します。取り込んだデータはバイナリファイルとしてセーブ出来るようにしてあります。Treva を使って画像の取り込みが出来るのは家にいる間だけなので、このソフトを使って画像データファイルをどんどん生成します。このファイルがあれば、場所を選ばずに認識遊びが行なえるというわけです。電車の中でも楽しく認識アルゴリズムやパラメータの評価が行なえます。
認識アルゴリズムの検討と評価
次にいよいよ楽しい認識部分の検討です。今回はテニスボールの認識を行なってみます。画像ファイルからテニスボールの位置と、画像内での半径を取得します。
まずは認識結果の評価が行なえる環境を用意します。ある画像ファイルを人間が見て、ここにテニスボールがあるな、という情報を画像ファイルに付加し、ソフトで認識した結果と比較が出来るようにすれば、認識アルゴリズムやパラメータの定量的な評価が出来ます。
そこで、テニスボールの位置と半径を入力し、画像データに付加するソフトを作成しました。位置や半径は数値で入力するのは難しいので、マウス操作で画像上に円を重ねて入力する方式を採用しました。またボールと背景の境界が分かるように、カーソル位置の画像データ YUV 成分が見えるようにしてみました。これで取り込んだ画像データファイルの後ろに X,Y,R の3バイト分のデータを付加していきます。
これで認識部分検討の用意は出来ました。いよいよ認識アルゴリズムの検討です。最終的には H8 Tiny に実装するのですが、まずは Visual Basic で実装し、PC 上で検証を行ないます。
H8 Tiny は内蔵 RAM が 2KByte しかないので、大量のデータを保持する事は出来ません。またデータは Treva から取り込む順番でしか参照できません。そこで、ある画素に対して色を使ってボールかどうかの判定を行い、その結果をXY方向それぞれに対して射影したデータ列を作成します。ボールがある場合にはXY方向共に、ある場所に認識された結果の分布が現れます。これを使ってボールの位置と半径を認識してみる事にします。
Treva から送られる画像データの色空間は YUV です。最初は輝度情報 Y を除いて UV だけで色の認識を行なってみました。しかし明るさによって UV の範囲も変わってくるので、Y の値の範囲にあわせた2段階の判定を行なってみました。
射影データから位置と半径を求める方法も、最初は射影データの重心から位置を取得する方法を試してみたのですが、ノイズに弱い問題に直面し、最終的には射影データが連続して存在する領域の最長領域をボール位置としてみました。また取得した半径と中心位置の射影データを比較し、射影データの値が円とは思われない値を示している場合には、ボールと認識しないようにしてみました。
ボールのある画像、ボールの無い画像をいくつか用意し、このソフトで認識をした結果と、先程自分で付加したボール位置・半径とを比較して、アルゴリズムや色認識のパラメータの調整を行い、蛍光灯下ではそれなりにはボールを認識できるようになりました。
移動台車への搭載
Visual Basic で検証した認識アルゴリズムを H8 Tiny に実装します。認識結果のボール位置XY座標とボール半径の3バイトを、シリアルを通じて出力するようにします。正しく認識できているかチェック出来るように PC 側で3バイトのデータを受信、表示するソフトを作ってみました。
10MHz の H8 Tiny では、画像取得、認識に約 500ms 弱かかってしまいました。Treva からの画像取得のためのクロック信号をソフトで I/O を ON/OFF して生成しているためか、画像の取り込み自体で 400ms 程度かかっていました。5V で動作させて H8 のクロックを 16MHz に上げれば、多少は改善されるかもしれません。
台車は以前から作成していたもので、OAKS16 マイコンボードを使ってステッピングモータを制御するものです。モータドライバは東芝の TA8435H を使っています。シリアルポートで H8 からの認識結果を受信し、ボールを追いかけるソフトをでっち上げてみました。
やはり画像認識は非常に楽しめます。Treva とマイコンボードとの接続や、移動台車など環境構築を行なえば、後はソフトで色々と遊ぶ事が出来ます。Treva の解析で我々に手軽な画像取得環境を与えて下さった AAF ぱ研に強く感謝致します。