EmbVision チュートリアル(6)

映像ストリーム処理 - Raspberry Pi™編 -

新潟大学 工学部 電気電子工学科  村松 正吾

Copyright (c), All rights reserved, 2014-2015, Shogo MURAMATSU

Contents

Part5 | メニュー

概要

本演習では、Part5で作成したSimulink モデル を Raspberry Pi に実装し、 エクスターナルモードでのシミュレーションのほか、 スタンドアロンで実行する方法について学ぶ。

Raspberry Pi 設定

シングルボードコンピュータ Raspberry Pi への実装コードを Simulinkモデルを通じて生成することができる。

なお、本演習は Windows®上のMATLABで実行する必要がある。

以下では、Raspberry Pi 用のサポートパッケージ

が既にインストールされている前提で話を進める。

[ トップ ]

シミュレーションモデル

まず、本演習 Part5 で作成した Simulink モデル videogradfilt を Raspberry Pi 用に変更しよう。

モデル videogradfilt を読み込み、 videogradfiltraspi として保存する。

open_system('videogradfilt')
save_system('videogradfilt','videogradfiltraspi')

Raspberry Pi 用の実装コード生成を行う Simulink モデルは、 全てのブロックがコード生成に対応している必要がある。 さらに、各種入出力ブロックは Raspberry Pi 用のブロックライブラリから 選択して使用する必要がある。

Raspberry Pi 用のブロックライブラリは、Simulinkライブラリブラウザーから

を選択すればよい。

あるいは、MATLAB® コマンドウィンドウ上から

raspberrypilib

と打ち込んでも良い。

映像入出力ブロックを Raspberry Pi 用の入出力ブロックに置き換えよう。

「V4L2 Video Capture」ブロックの出力Yはグレースケールに対応する。 本モデルでは、残りの出力 Cb,Crを利用しないため、以下の終端ブロックを接続した。

また、「SDL Video Display」ブロックでは RGB 入力ができるよう、 ブロックパラメータ Pixel format を RGB と編集した。

早速、実行してみよう。

すると、「SDL Video Display」ブロックの入力部でデータ型の不一致による エラーが生じる。

原因は、「SDL Video Display」ブロックが8ビット符号なし整数型(uint8)を 要求するのに対し、「HSV to RGB」ブロックが実数型(double)でデータを出力 するためである。

この問題を回避するために、ゲイン調整とデータ型変換を行うブロック

を「SDL Video Display」ブロックの入力部に挿入し実行しよう。

無事実行され、ダミーの映像処理が実行される。

ここで

という点に注意してほしい。 このことを確かめるために、「Computer Vision System Toolbox/Sinks」内にある

を一時的に 「V4L2 Video Capture」の出力Yに接続して、シミュレーションを実行 してみよう。

「V4L2 Video Capture」の出力と「SDL Video Display」の表示を比べると 互いに転置の関係にあることが分かる。

したがって、勾配フィルタの方向を修正しなければならない。 「Filt.Grad.」ブロックのKernelプロパティを

のように転置するよう編集して、勾配フィルタの方向を修正しよう。

再度、モデル videogradfiltraspi を実行しよう。

出力の彩色(勾配方向)が修正されていることが確認できる。

以降、「To Video Display」ブロックは不要なのでモデルから削除しておこう。

[ トップ ]

ハードウェア実行の準備

Raspberry Pi 用に構築したモデルを実際のボード上で動作させてみよう。

Simulink モデルを Raspberry Pi 上で動作させる方法には、

の二種類がある。

エクスターナルモードでは、Simulink モデルから Raspberry Pi 上で 動作する実装コードを生成し、Raspberry Pi 上で実際に動作させ、 その出力を手元の Simulink 上で確認する。

一方、スタンドアロン実行では、Simulink モデルから Raspberry Pi 上で 独立に動作する実装コードを生成し、Raspberry Pi 上で動作させる。

まず、準備として Raspberry Pi model B/B+ を用意し

  1. MicroSD カード
  2. LAN ケーブル
  3. Web カメラ
  4. 電源ケーブル

の順に接続しよう。

なお、MicroSD にはRaspberry Pi Support Package から ファームウェアイメージの書き込みが完了しているものとする。

では、Simulink から Raspberry Pi への接続を行うための準備をしよう。

Simulink モデル videogradfiltraspi のメニューバーから

へと進む。

ターゲットハードウェアとして「Raspberry Pi」を選択する。

接続するボードの情報を確認する。

特に、「Board information」の「Host name」は、各ボード毎に設定が異なるので 編集が必要となる。

IPアドレスが分かれば、以下の用に編集すればよい。(192.168.11.2は一例)

「OK」をクリックし準備を完了する。

[ トップ ]

エクスターナルモード

では、Simulink モデル videogradfiltraspi をエクスターナルモードで動作 させてみよう。

まず、シミュレーションのモードを「ノーマル」から

へと変更する。

早速、実行してみよう。

Raspberry Pi に接続した Web カメラの処理映像が Simulink 上で表示される。

[ トップ ]

スタンドアロン実行

では、Simulink モデル videogradfiltraspi を Raspberry Pi 上で スタンドアロン実行してみよう。

スタンドアロン実行のために以下の準備を行う。

  1. 電源ケーブルを一旦外す
  2. HDMIディスプレイ接続する
  3. 電源ケーブルを再度接続する

正しく接続されていれば、Rasbian の起動を Raspberry Pi に接続した ディスプレイ上で確認できる。

なお,Raspberry Pi Camera Module を利用するためには以下のサイトを参照してほしい。

http://www.mathworks.com/matlabcentral/answers/122199-simulink-with-raspberry-pi-camera-capture

Simulink モデル videogradfiltraspi に戻り、

のボタンをクリックしよう。

Windowsのコマンドウィンドウが立ち上がらり、Simulink モデルの左下に

と表示されれば成功である。

Raspberry Pi に接続されたディスプレイ上にカメラからの映像の 処理結果が表示される。

以降、Simulink モデル videogradfiltraspi を閉じても、Raspberry Pi 上の 処理は継続される。

close_system('videogradfiltraspi')

MATLAB コマンドウィンドウ上で raspberrypi 関数を利用すると、接続中の Raspberry Pi の情報を取得できる。

h = raspberrypi

Raspberry Pi 上で動作中のモデル videogradfiltraspi を停止するには、 stop メソッドを利用する。

h.stop('videogradfiltraspi')

再度モデル videogradfiltraspi を開き、run メソッドを用いれば、 Raspberry Pi 上でモデルを再起動することもできる。

open_system('videogradfiltraspi')
h.run('videogradfiltraspi')

[ トップ ]

演習課題

演習課題6-1. Sobel勾配フィルタ

演習課題4-1で紹介した Sobel カーネルに変えて Raspberry Pi 上で、 スタンドアロン実行しよう。

演習課題6-2. モデルの自作と実行(オプション)

自ら映像処理モデルを創造設計し、 Raspberry Pi 上で、スタンドアロン実行しよう。

以下に期待される拡張例を示す。


Part5 | メニュー | トップ