Simulink における OpenCV コードを使用した笑顔検出
この例では、"OpenCV Importer" アプリを使用して笑顔検出器を構築する方法を説明します。検出器では、顔のイメージまたはビデオにおける笑顔の強度を推定します。推定された強度に基づいて、検出器はデータベースから適切な絵文字を特定し、その絵文字を笑顔の上に配置します。
最初に、Computer Vision Toolbox Interface for OpenCV in Simulink のインストールと使用に従って、OpenCV 関数を Simulink® にインポートします。アプリは、指定した OpenCV 関数のサブシステムと C Caller ブロックを含む Simulink ライブラリを作成します。事前構成済みの Simulink モデルでこのサブシステムを使用して、笑顔検出を行う顔のイメージまたはビデオを受け取ります。このモデルから C++ コードを生成し、そのコードをターゲット ハードウェアに配布できます。
次の方法を学びます。
OpenCV 関数を Simulink ライブラリにインポートする。
生成されたライブラリのブロックを Simulink モデルで使用する。
Simulink モデルから C++ コードを生成する。
Raspberry Pi ハードウェアにモデルを配布する。
C++ コンパイラの設定
OpenCV ライブラリを構築するために、OpenCV ライブラリを使用する関数に対応する移植可能な C コードの生成の記載に従い、お使いのオペレーティング システムと互換性のある C++ コンパイラを特定します。mex -setup c++
コマンドを使用して、特定したコンパイラを構成します。詳細については、C++ コンパイラの選択を参照してください。
モデルの説明
この例では、Simulink モデル smileDetect.slx
を使用して、笑顔検出器を実装します。
このモデルでは、subsystem_slwrap_detectAndDraw
サブシステムが Smile_Detect_Lib
ライブラリ内にあります。"OpenCV Importer" アプリを使用して、subsystem_slwrap_detectAndDraw
サブシステムを作成します。このサブシステムが顔のイメージまたはビデオを受け取り、以下の出力値を提供します。
outImage
:円の付いた顔イメージintensity
:笑顔の強度x
: 円の中心のx
座標y
: 円の中心のy
座標rd
:円の半径
モデルは Simulink.ImageType
データ型を使用するように構成されています。サブシステムからの outImage
は、Simulink.ImageType
データ型です。MATLAB Function ブロックは数値行列のみを操作するため、Image To Matrix ブロックは outImage
を Simulink.ImageType
から数値行列に変換します。
MATLAB Function ブロックは、subsystem_slwrap_detectAndDraw
サブシステム ブロックからの入力を受け取ります。MATLAB Function ブロックには、一連の絵文字のイメージがあります。これらのイメージに含まれる絵文字の笑顔の強度は、低から高までさまざまです。ブロックは、絵文字のイメージの中から、推定された強度に最も適切な絵文字を特定し、顔イメージ上に配置します。次に、出力が Detected Face ブロックおよび Smiley Replacement Video Viewer ブロックに提供されます。
サンプル フォルダーの書き込み可能な場所へのコピー
サンプル フォルダーのパスにアクセスするには、MATLAB コマンド ラインで以下のように入力します。
OpenCVSimulinkExamples;
各サブフォルダーには、例を実行するために必要なサポート ファイルがすべて含まれています。
以下の手順に進む前に、サンプル フォルダーを書き込み可能なフォルダーの場所にコピーし、現在の作業フォルダーを ...example\SmileDetector
に変更します。出力ファイルはすべて、このフォルダーに保存されます。
手順 1: OpenCV 関数のインポートによる Simulink ライブラリの作成
1."OpenCV Importer" アプリを起動するには、MATLAB ツールストリップの [アプリ] をクリックします。[Welcome] ページで [Project name] を Smile_Detector
と指定します。プロジェクト名にスペースが含まれていないことを確認してください。[Next] をクリックします。
2.[Specify OpenCV Library] で以下のファイルの場所を指定し、[Next] をクリックします。
Project root folder: サンプル フォルダーのパスを指定します。このパスは、サンプル ファイルを保存した書き込み可能なプロジェクト フォルダーのパスです。出力ファイルはすべて、このフォルダーに保存されます。
Source files: プロジェクト フォルダー内にある
.cpp
ファイルのパスとしてsmiledetect.cpp
と指定します。Include files: プロジェクト フォルダー内にある
.hpp
ヘッダー ファイルのパスとしてsmiledetect.hpp
と指定します。
3.ライブラリを解析して、インポートする関数と型を特定します。解析が完了したら、[Next] をクリックします。関数 detectAndDraw
を選択し、[Next] をクリックします。
4.[What to import] で、inImage
の [I/O Type] に [Input]
を選択し、[Next] をクリックします。
5.[Create Simulink Library] で、OpenCV の型の既定値を設定します。既定では、[Create a single C-caller block for the OpenCV function] が選択されており、生成された Simulink ライブラリに C Caller ブロックとサブシステムが作成されます。
6.[Configure library to use Simulink.ImageType signals] を選択して、生成されたライブラリ サブシステムを Simulink.ImageType
シグナルを使用するように構成します。
7.[Default Color Format of Simlink.ImageType signal] をイメージの既定の色形式である RGB
に設定します。
8.[Default Array layout of Simulink.ImageType signal] を、イメージの既定の配列レイアウトである Column-major
に設定します。
9.[Next] をクリックして Simulink ライブラリを作成します。
OpenCV コードを基に、Simulink ライブラリ Smile_Detector_Lib
がプロジェクトのルート フォルダーに作成されます。このライブラリには、サブシステムと C Caller ブロックが含まれます。どのブロックでも、モデル シミュレーションに使用できます。この例では、サブシステム subsystem_slwrap_detectAndDraw
を使用します。
手順 2: 生成されたサブシステムの Simulink モデルでの使用
生成されたサブシステム subsystem_slwrap_detectAndDraw
を Simulink モデル smileDetect.slx
で使用するために、次を行います。
1.MATLAB の現在のフォルダーにあるモデル smileDetect.slx
を右クリックし、コンテキスト メニューから [開く] をクリックします。生成されたサブシステムをライブラリからモデルにドラッグします。このサブシステムを MATLAB Function ブロックに接続します。
2.サブシステムをダブルクリックし、次のパラメーター値を設定します。
Rows:
480
Columns:
640
Channels:
3
Underlying Type:
uint8
3.[適用] をクリックし、[OK] をクリックします。
手順 3: 笑顔検出器のシミュレーション
Simulink ツールストリップの [シミュレーション] タブで [実行] をクリックして、モデルのシミュレーションを行います。シミュレーションの完了後、Video Viewer ブロックには検出された顔が表示されます。モデルはその顔に絵文字を重ね合わせます。絵文字は笑顔の強度を表しています。
手順 4: 笑顔検出器モデルからの C++ コードの生成
モデルからコードを生成する前に、現在のフォルダーでの書き込み権限があることを確認してください。
C++ コードを生成するには、次を行います。
1.MATLAB の現在のフォルダーから smileDetect_codegen.slx
モデルを開きます。
2.Simulink ツールストリップの [アプリ] タブで [Embedded Coder] を選択します。[設定] リストの [C++ コード] タブで、[C/C++ コード生成設定] をクリックして [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。次の設定を確認します。
[コード生成] ペインの [ターゲットの選択] セクションで、[言語] が
C++
に設定されていること。[コード生成] ペインの [ターゲットの選択] セクションで、[言語標準] が
C++11 (ISO)
に設定されていること。[コード生成] ペインの [インターフェイス] にある [データ交換インターフェイス] セクションで、[配列のレイアウト] が
Row-major
に設定されていること。
3.MathWorks® によって実装された C++ クラス images::datatypes::Image
の代わりに OpenCV クラス cv::Mat
を使用して、イメージが表される量産 C++ コードを生成する場合は、[データ型置換] ペインで [OpenCV Mat クラスを使用してイメージを実装] を選択します。
4.生成されたサブシステム subsystem_slwrap_detectAndDraw
を MATLAB Function ブロックに接続します。
5.C++ コードを生成するには、[C++ コード] タブで [Build]
ボタンをクリックします。モデルがコードの生成を終了すると、生成されたコードが [コード] ビューで開きます。
6.生成されたコードを確認できます。モデルに Simulink.ImageType
データ型の信号が含まれている場合、コード ジェネレーターは追加の共有ユーティリティ ファイルを生成します。これらのファイルでは、イメージのメタ属性に関する情報の構築、破棄、および応答のためのユーティリティが宣言および定義されます。
image_type.h
image_type.cpp
ビルド プロセスにより smileDetect_with_ToOpenCV.zip
という zip ファイルが現在の MATLAB 作業フォルダーに作成されます。
笑顔検出器の Raspberry Pi ハードウェアへの配布
モデルを配布する前に、Raspberry Pi をお使いのコンピューターに接続します。ハードウェアの PWR LED が点滅を始めるまで待ちます。
[設定] ドロップダウン リストで [Hardware Implementation]
をクリックして [コンフィギュレーション パラメーター] ダイアログ ボックスを開き、次の設定を確認します。
[ハードウェア ボード] が
Raspberry Pi
に設定されていること。[デバイス ベンダー] がARM Compatible
に設定されていること。[コード生成] ペインの [ターゲットの選択] で、[言語] が C++ に設定されていること。[ビルド プロセス] で、[Zip ファイル名] が
smileDetect_with_ToOpenCV.zip
に設定されていること。[ツールチェーン設定] で、[ツールチェーン] がGNU GCC Raspberry Pi
と指定されていること。
コードを Raspberry Pi ハードウェアに展開するには、次を行います。
1.生成された zip ファイルから、次のファイルを Raspberry Pi ハードウェアにコピーします。
smiledetect.zip
smileDetect.mk
main.cpp
2.Raspberry Pi で、ファイルを保存した場所に移動します。elf
ファイルを生成するには、以下のコマンドを入力します。
make -f smileDetect.mk
3.実行可能ファイルを Raspberry Pi 上で実行します。正常に実行されると、顔イメージ上に絵文字が配置された出力が Raspberry Pi に表示されます。
smileDetect.elf
参考
ToOpenCV | FromOpenCV | Simulink.ImageType