動体検知システムを、カメラ入力可能なSoCとRTOSで簡単に実現できた

動体検知とは

動体検知は、カメラ画像で取り込んだ映像から、動いた物体を抽出するものです。その際に、2値化など画像処理のアルゴリズムが使われ、動いた物体をCPUがマーキングして示します。この一連の流れが動体検知の概要です。今回使用しているアクセル社のAG903は、強力なグラフィックエンジンを搭載しているため、CPUの負担をかけることなく、動体検知のアルゴリズムを実現しています。後述するキャプチャ機能と、パイプラインにおける画像処理をきめ細かく柔軟に扱えることがAG903の最大の特徴といってもいいでしょう。

図動体検知の様子 動体なし(カメラ画像左と2値化されたものが右)

図動体検知の様子 動体あり(カメラ画像左と2値化されたものが右)

グラフィックスLSI AG903の特徴

アクセル社のAG903は、Arm Cortex-A5 400MHzとアクセル社独自の強力なグラッフィックエンジンを搭載しています。今回のような画像エンジンを使用したアプリケーションや、サイネージ系などのアプリケーションに本領を発揮するSoCです。内蔵RAMは、64MB持っており、外付けメモリなしに優れたグラフィック能力を最大限活かせる構成になっています。パッケージは、実装のしやすいQFPを採用しています。ここでは紹介しきれないほどの機能が搭載されています。詳細はアクセル社のWebサイト、または sales@axell.co.jp まで

図SOLID Starter Kit for AG903

図AG903のブロック図

動体検知のアルゴリズム

動体検知は、2つの画像の差分を検出することで、物体が移動したかどうかの判断をしています。リアルタイムで処理をするには、30ms以内に処理を終わらせないといけません(VGA画像30fpを想定)。画像のサイズが大きくなると、処理時間も増えます。フレームレートも上げてしまうと、もっと高速に処理しなければなりません。そのバランスが、難しいところです。

画像比較判断を行うには、動いたピクセルの差分を検出するための閾値を設定する必要があります。設定値がラフすぎると、差分情報が欠落し、厳密に閾値を設定しすぎると、画像のノイズあるいは、カメラ画像(アナログ信号)からデジタル変換の際に生じるノイズ成分も差分と認識してしまうため、ちょうど良い設定を探る必要があります。この辺りは、設置環境、周りの明るさなど、環境に応じて適宜変更するのがいいでしょう。

AG903のパイプライン処理

今回の動体検知には、いくつかの画像変換要素を用いています。OpenGLと同じような感じで、パイプラインを構成する各ブロックのパラメータと各ブロック間の接続とをCPUから指定すると、CPUの介在無しにH/Wが処理してくれます。これらをRTOSのタスクやデータ・キューなどを活用して、柔軟で高速なパイプラインを実現しています。このパイプライン動作は、大きく3つの動作に分けられます。

  • リアルタイム画像キャプチャ
  • 画像比較
  • 動体検知

リアルタイム画像キャプチャ

リアルタイム画像キャプチャーのブロックでは、アナログのカメラ入力に3つの動作に示したブロックに渡す必要があります。ダイレクトにカメラ入力できるのも、AG903の魅力です。

カメラ入力→デジタル変換→YUV/RGB変換→表示用VRAM→画像表示

図画像キャプチャのパイプライン

画像比較処理

画像比較処理は、下記のブロックで構成されています。

カメラ入力→デジタル変換→YUV/RGB変換→差分演算→差分に2値化→2値化表示用VRAM→画像表示

どのエリアが差分に該当するかを示すためのラベリング処理は、AG903のH/Wで発見した変化領域の座標、サイズの情報をメモリ上にリスト構造として出力します。CPUは、その完了通知を受け、リストから最大の領域を検索します。その結果から「四角で囲む描画コマンド」を発行し、UARTにも出力しています。

図画像比較処理部

動体検知

動体検知のためのブロックは、下記の構成です。

カメラ入力→デジタル変換→YUV/RGB変換→画像比較用VRAM→差分演算→差分の2値化→2値化表示用VRAM→画像表示

この時、現在のリアルタイム画像と、比較用画像の差分を演算します。演算結果は、CPUに渡されます。

図動体検出部

このように、複雑な処理もAG903の柔軟なアーキテクチャーにより、必要なパイプラインや画像処理モジュールを組み合わせることが簡単にできます。

SOLID IDE

今回の動体検知アプリは、パイプラインを効率的に動かすためのアイデアを盛り込んでいます。タスクは、イベントフラグやデータキューを活用して、スムースな画面描画と、赤い矩形の表示を実現しています。もちろん、Arm Cortex-Aを搭載しているので、キャッシュも有効にして、その性能を発揮させています。画面は、デバッガで止めたところ。RTOSビューを表示して、どのタスクがなんのイベントで待っているかが、一目でわかります。

図SOLID IDEの画面

UARTの出力は、TeraTerm等で確認できます。動きがなければ、UARTへの出力は止まります。

図動体検知のログ出力

室長ポイント!

こんな応用も期待できる

今回の実装では、差分情報があるとUARTに出力していますが、オンボード上のLEDにも出力しています。UART出力しているところで、LEDをつけていますが、更新がなければUART出力されないので、LEDも消しています。このように、ボード上でも動体検知を表現しています。これを応用していくと、1/0のデータをクラウドに上げることで、UIを構築できるのではないかと思います。

データシートから拾い上げたAG903の気になる機能を一つ紹介!

ワンストップポート(OSP)

CPUを介在することなく、割り込みのイベント発生時に起動し、メモリの書き込みやレジスタ操作など512ステップまでのシーケンス処理が実行できるユニット。CPUコアをSleepにしたまま処理ができるので、電力的にもメリットあり。また割り込みハンドラも介する必要がないので、処理時間の向上にも繋がります。特に、usやns単位で応答しなければいけないシステムには、絶大な効果が期待できます。

図OSPのブロック図