動体検知とは
動体検知は、カメラ画像で取り込んだ映像から、動いた物体を抽出するものです。その際に、2値化など画像処理のアルゴリズムが使われ、動いた物体をCPUがマーキングして示します。この一連の流れが動体検知の概要です。今回使用しているアクセル社のAG903は、強力なグラフィックエンジンを搭載しているため、CPUの負担をかけることなく、動体検知のアルゴリズムを実現しています。後述するキャプチャ機能と、パイプラインにおける画像処理をきめ細かく柔軟に扱えることがAG903の最大の特徴といってもいいでしょう。
グラフィックスLSI AG903の特徴
アクセル社のAG903は、 Cortex-A5 400MHzとアクセル社独自の強力なグラッフィックエンジンを搭載しています。今回のような画像エンジンを使用したアプリケーションや、サイネージ系などのアプリケーションに本領を発揮するSoCです。内蔵RAMは、64MB持っており、外付けメモリなしに優れたグラフィック能力を最大限活かせる構成になっています。パッケージは、実装のしやすいQFPを採用しています。ここでは紹介しきれないほどの機能が搭載されています。詳細はアクセル社のWebサイト、または sales@axell.co.jp まで。
動体検知のアルゴリズム
動体検知は、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ビューを表示して、どのタスクがなんのイベントで待っているかが、一目でわかります。
UARTの出力は、TeraTerm等で確認できます。動きがなければ、UARTへの出力は止まります。
活用方法例
こんな応用も期待できる
今回の実装では、差分情報があるとUARTに出力していますが、オンボード上のLEDにも出力しています。UART出力しているところで、LEDをつけていますが、更新がなければUART出力されないので、LEDも消しています。このように、ボード上でも動体検知を表現しています。これを応用していくと、1/0のデータをクラウドに上げることで、UIを構築できるのではないかと思います。
データシートから拾い上げたAG903の気になる機能を一つ紹介!
ワンストップポート(OSP)
CPUを介在することなく、割り込みのイベント発生時に起動し、メモリの書き込みやレジスタ操作など512ステップまでのシーケンス処理が実行できるユニット。CPUコアをSleepにしたまま処理ができるので、電力的にもメリットあり。また割り込みハンドラも介する必要がないので、処理時間の向上にも繋がります。特に、usやns単位で応答しなければいけないシステムには、絶大な効果が期待できます。
こちらも是非
“もっと見る” 実験室
組み込みアプリを止めるな!printfやブレークポイントも使わず内部状態をチェック!
産業機器、オーディオ製品、通信デバイスをはじめとする多くの組み込みアプリケーションは、わずかなタイミングの違いで動きが変化します。そのため、開発・検証のためにprintfなどを仕掛けることが難しく、開発効率が伸び悩むケースも増えています。そこで今回の実験室では、システムを止める事なく内部状態を取得できるデータ計測ツール「EVRICA」を紹介いたします。組み込みアプリケーションの開発や検証に欠かせない、新しい開発ツールです。
IoTエッジコンピューティングをSmartMeshで実践
今回の実験は、Moteに内蔵されている非力なマイコンを使って、振動計測ソリューションのFFTデータをSmartMeshで送信したIoTエッジコンピューティングを実践してみました。
非絶縁型中間バスコンバータ750Wで、48Vと12Vを自由自在
VicorのNBMシリーズの最新デバイスであるNBM2317シリーズは、23×17×7mmという超小型パッケージで最大750W出力、48V→12Vまたは、12V→48Vの双方向において98%のピーク効率を実現した非絶縁型中間バスコンバータ。今回の実験室は、実際に動かしつつ、その性能とメリットを解説している。その様子は、是非動画で見て欲しい。