■ホビーロボット部品の製造・販売 
  モータコントローラ、センサ、音声、画像、無線モジュールなど、
■ホビーロボット制作記事のページ (各種マイコン、PCとの接続事例)
■特殊メイク、特殊材料の販売 ※特殊メイクのコーナーはこちらに移りました。
Top(お知らせ) 製品紹介 使い方とサンプルプログラム 通信販売 リンク ロボット掲示板 会社案内
 Easy Robotics for all enthusiastic people!!!  ---HOBBY ROBOT PARTS SHOP ASAKUSAGIKEN---   Since 2003...
SH2とCMOS-EYEで動体検知
はじめに

 ここでは SH2の中の、SH7144Fを搭載したマイコンボード (インターフェイス誌2006.6月号) と浅草ギ研製CMOSイメージセンサーボードCMOS-EYEを使って、動体検知を行います。

 尚、このページは「SH...バス接続及びシリアル接続」のページので作成した環境を使用しています。ハード接続、画像へのアクセス方法などは事前にこちらを参照願います。ニ値化処理については、「SH...ニ値化画像処理」のページを参照願います。

 ※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。


用語について

 このページで説明する用語について解説します。

 CMOS-EYEはマイコンと接続することが前提となっております。以下の説明で「マイコン」と書いたところは、CMOS-EYEに接続するユーザー側のマイコンを示します。マイコン側の端子名は極力、そのマイコンのデータシートに書かれている名前を記載しています。
 マイコンチップが載ったCPUボードを「マイコンボード」とします。マイコンボードの端子名は極力、そのマイコンボードの取扱説明に書かれている名称を記載しています。

 CMOS-EYE上にも制御用のマイコンが搭載されていますが、これは「CMOS-EYE上のマイコン」とします。(バス接続時には特にこの「CMOS-EYE上のマイコン」を意識する必要はありません。)

 CMOS-EYEからはいろいろな端子が出ています。アドレスを指定する端子の集まりを「アドレスバス」とします。又、データを指定したり受けたりする端子の集まりを「データバス」とします。



動体検知についての概要とソースプログラム

 まず、ソースはこちら。

 CMOS-EYE_SH2_MoveDetect.c (右クリックで保存)


 画面上に動くものがあるかを検出するには、画像を2枚撮影してその濃度差を調べ、濃度差が大きいところが動くものがあった、と判定できます。。
 
   
 一枚目の画像−>二枚目画像−>差が大きいところを抽出

 撮影時には、背景照明の微妙な変化などで背景自体も変化する可能性があるので、「濃度が違うところ」ではなく、濃度差に幅を持たせて「濃度差が大きいところ」とした方が意図したとおりに検出されます。

 CMOS-EYEはAWB(オートホワイトバランス)機能とAE(自動露出)機能があり、起動時にはどちらも動いています。対象物が画面に入ってくると、その濃度の影響で画面全体が明るくなったり暗くなったりする可能性が高いので、この処理を行う前にはどちらの機能もオフにした方が良いでしょう。

 尚、ハードウェア接続、CMOS-EYE上のSRAMの操作方法、アドレスセット関数、IO初期化関数、ウェイト関数、1ピクセル読み込み関数、1ピクセル書き出し関数、撮影関数、データ送信関数、については前のページを参照願います(上のはじめに、を参照)。


動体検知プログラムの部分

 今回は2画面の各ピクセルの差を計算するだけなので非常に簡単です。

 注意点としては、画素データは1バイトなので、差の上限値と下限値を設定するときに、0〜255の範囲を超えないように注意することぐらいでしょうか。

 詳細はコメントを参照願います。

 

 例のごとく、TEST端子をHIGH/LOWさせてオシロで波形を計測し、この部分の動作時間を調べてみました。
 
 1メモリ10mSなので約30mSといったところです。ちなみに、H8Tinyですと120mS、CMOS-EYE内蔵プログラムですと120mSでした。



画像処理結果

 ソースプログラムでは、起動時に背景画像を撮影して、その後5秒ごとに現在画像を撮影しています。背景は0番地、現在画像は4800番地、結果画像は9600番地に格納されます。

 実際に、ソースプログラムを動かしたものを、CMOS−EYE Viewerで見てみます。

 結果画像(9600番地から格納)
 

 と、このように差が大きいところが抽出されました。

 以下、差の値の設定値(変数diff)による変化です。


 diff = 30
   

 diff = 5
   

 diff = 100
    


 ということで無事、動体検知ができました。diff=5は、背景の微妙な変化も拾っているため、ごましお雑音が多くなっているのがわかります。同じ画像でも、撮影する度にセンサーの各画素は同じ値になるとはかぎりませんので注意しましょう。

  この二値化画像をさらに処理することにより、位置やおおきさ(距離?)なども判定することができるでしょう。

 ちなみに、上の画像では、AWBとAEをオフにしているので、環境の変化で明暗が出ます。室内でカーテンを閉め切っての状況で撮影しましたが、diff=30の時は曇ってましたが、その後晴れたので画面は明るくなっています。


おわりに

 今回は
グレー画像を元に処理していますが、カラー画像でRGB各濃度から計算することもできます。但し、RGBの3つの濃度を検討材料に入れると、処理時間が単純に3倍になりますので、まずは今回のようにグレー画像からニ値化画像を作り、これをマスクとして、黒の部分だけをカラー計算することで処理時間が短縮されると思います。
 これにより、カラー画像処理の「時間がかかる」という問題点を解決できるでしょう。

 あらかじめ、肌色を記憶させておき、グレー画像で動体検知を行い、対象場所に肌色があれば人間である、といった処理も可能かもしれません。簡易人体追跡システムのような使い方、でしょうか。

 このように、画像処理はその組み合わせで色々なことができる可能性のあるものです。皆様も是非いろいろと研究していただいて、面白いアプリケーションを作ってみてください。


2006年8月29日

 
(C)Copylight 2003. 有限会社浅草ギ研 | 通信販売の法規(訪問販売法第8条)に基づく通信販売業者の表示