ユビキタス鉄道模型
赤外線リモコン戦車
レーザ・グラフィックス
USB加速度センサマウス
ビジョンシステム
├ システム概要
├ アプリケーション概要
├ アプリケーション詳細
└ 参考&あとがき
リアルタイムOS
LCD表示パネル
相撲ロボット
多自由度ロボット
 開発事例 TOPへ
 HOMEへ
イエローナビ
 ページTOPへ
 開発事例 TOPへ
 HOMEへ
YellowSoft.com
製品紹介 Q&A ダウンロード 開発事例 ユーザ ご購入 価格表 お問合せ
 ビジョンシステム


  SH2とCMOSカメラによるビジョンシステム、YCSH使用
    S.Sakurada & T.Yamamoto


  アプリケーション詳細

    ピクセル値取り込み

ピクセル値の取り込みの前に、CMOSカメラからの出力方法について解説する画像を取りこむ際には、出力されたデータのフレーム位置(画素の座標)を、シンク信号(VSYNC、HREF)から得る必要がある。

以下にOST1020のシンク信号とフレーム位置の関係を示す。

   

フレームの先頭はVSYNC信号をモニタすることで知ることが出来る。VSYNCが立ち下がったあとのHREFの立ちあがりでデータの出力開始タイミングを得る。X方向640ドット分のピクセル値が出力されるとHREF信号が下がる。これを480ライン分繰り返して、1フレーム(1画面)分のピクセル値が出力される。

ここで1つ問題が発生する。データはPCLK信号に同期して出力され、下図の様にピクセル値は供給クロック2クロックに1回出力される。供給クロックはCPUクロックを8分周したものなので、結局ピクセル値は16CPUCLKに1回出力される。このタイミングをハードウエアで生成しようとするとFIFOなど大きなハード必要となり小型化が困難になる。そこで取り込みタイミングはソフトウエアで生成する様にする。

この方法はバスウエイト数などの影響によって調整値が変わるため、あまり美しいやり方とは言えないが、回路を簡便にできるというメリットがある。

   

そこで本アプリケーションでは、取り込みルーチンをアセンブラで記述することで
正確な取り込みタイミングを生成している。

タイミング調整の方法は、CS2信号とカメラのデータ出力をデジタルオシロスコープで観測しながら、NOPコマンドの数を調整するという方法を取った。

また本アプリケーションでは、VSYNC、HREF信号をポートで受け、フレーム位置を検出している。但し、データを全部受信すると格納するメモリが足りなくなるのでX方向は3ドットに1回(48CPUクロックに1回読む)、Y方向は2ラインに1回だけ読むようにして、データ量を少なくした。これにより取り込む画像サイズは640x480から213x240ドットに縮小される。

この部分のアセンブラソースをこちらに示す。
これをYCSHから呼び出すには。

 extern unsigned long _get_flame(unsigned long xsize,unsigned
 long ysize);


と宣言する。xsizeは取り込み画像の横ピクセル数、ysizeは縦ピクセル数を表す。
最大サイズは(xsize,ysize)=(213,240)である。(long型なのは特に理由はない)
戻り値は取りこんだピクセル数で、xsize*ysizeが帰ってくることになる(デバッグ
用途に使用)。

また、関数の呼び出しに当たっては、VSYNCのHighを検出してから呼び出す必要がある。

 while((PEDR & 0x40)==0); /* VSYNC=1まで待つ */
 _get_flame(XSIZE,YSIZE);


 (VSYNCチェックはアセンブラに含めても良かったのだが・・・)


    データ転送

ピクセル値はRGBそれぞれ8ビットであらわされるのに対して、データは16ビット幅で
出力される。実は下図の様にRedとBule成分が間引かれて出力されている。


PCにピクセル値を転送する際には、この抜けているRedとBule成分を前のピクセルで置き換えて補間している。

補間されたピクセルデータはSCI→RS232C経由でPCに転送する。PCに転送するデータのフォーマットは、PNMフォーマットを使用した。PNMフォーマットは

P3 320 240 255 (←"P3" に続けてXサイズ Yサイズ 画素値の最大値)
127 46 240 (←(x,y)=(0,0)の画素の明るさ R G Bの順)
130 60 224 (←(x,y)=(1,0)の画素の明るさ R G Bの順)
    
    
    

という内容で、C言語のprintf文で簡単にPNMフォーマットを出力できるのが魅力である。反面データサイズが大きいという欠点も有る。

SCI経由で送られたPNMファイルは、TeraTermなどのターミナルソフトの「ファイル」→「ログ」コマンドで受信したデータをファイル化する。
(イエローソフト注釈 YellowIDEの場合は「ターミナル」→「ログ保存」)

以上の1、2を実現したCソースをこちらに示す。

ソース中に出てくるI2C関連の関数は、次章「その他参考」の日立のサイトからダウンロードしたCソースをYCSH用に書き換え、さらにCMOSカメラに使いやすい様に改造して用いている。

また上記Cプログラムで、PCに転送したPNMファイルをこちらに示す。


    表示

TeraTermでファイル化したデータを.pnmという拡張子を付けたファイル名にして、GIMPというフリーの画像ツールで読みこませる。GIMPはLinuxなどUNIX系で有名なペイントツールで、Adobe社の"Photoshop"に匹敵する高機能なツールである。

PNMフォーマットはメジャーなフォーマットではないが、GIMPはそれに対応している数少ないツールの一つである。

またGIMPは数多くの画像フォーマットに対応しているので、GIMP上でBMPやJPGといったメジャーな画像フォーマットに変換することも出来る。

CMOSカメラで取りこんだ画像を、PCに転送してGIMPでJPGに変換
 (210x240ドット、24ビットカラー)


原画像に対して、横を1/3、縦を1/2に間引きしているので、表示は縦に1.5倍に伸びた画像となる。



← アプリケーション概要 4/5 参考&あとがき →