Main Content

特徴のマッチングとレジストレーションを使ったコード生成の紹介

この例では、MATLAB® Coder™ を使用して MATLAB ファイル用の C コードを生成する方法を説明します。また、自動特徴マッチングを使用したイメージの回転とスケールの検出の例で使用されている MATLAB コードに変更を加えて、コード生成でサポートされるようにする方法を説明します。コード生成の一般的な要件と、MATLAB コードの準備に必要な特定のアクションについてもいくつか紹介します。MATLAB コードがコード生成用に準備されたら、codegen(MATLAB Coder)コマンドを使用して C MEX 関数を生成します。最後に、結果を確認するため、生成した C MEX 関数を MATLAB で実行し、その出力を MATLAB コードの出力と比較する方法を示します。

この例には MATLAB Coder のライセンスが必要です。

C コンパイラの設定

この例を実行するには C コンパイラへのアクセスが必要です。コンパイラは 'mex -setup' コマンドを使用して構成しなければなりません。詳細は、MATLAB Coder 入門(MATLAB Coder)を参照してください。

MATLAB で実行するかスタンドアロン アプリケーションとして実行するかの決定

生成したコードは MATLAB 環境内で C MEX ファイルとして実行するか、MATLAB 環境の外でスタンドアロンの実行可能ファイルとして実行するか、あるいは共有ユーティリティとして他のスタンドアロン実行可能ファイルにリンクすることができます。コード生成オプションの設定の詳細については、codegen(MATLAB Coder)コマンドの -config オプションを参照してください。

MEX 実行可能ファイル

この例では MATLAB 環境内で実行される MEX 実行可能ファイルを生成します。

MATLAB 内で実行される C MEX 実行可能ファイルの生成は、最終的にスタンドアロンのコード作成へとつながるワークフローの重要な最初のステップとすることもできます。MEX ファイルの入力と出力は MATLAB 環境内で検査でき、そこには検証と解析を行うための可視化ツールや他の各種ツールが用意されています。また、個々のコマンドを、生成された C コードとして実行したり、MATLAB エンジンを介して実行することもできます。MATLAB を介して実行するには、関連するコマンドをcoder.extrinsic(MATLAB Coder)として宣言します。これで,生成したコードでそのコマンドの実行が必要になると、コードが MATLAB 環境に再入するようになります。これは、孤立したコマンドでコード生成がまだサポートされていない場合や、コードを生成しない特定のコマンド (たとえば plot コマンドなど) を組み込む場合に便利です。

スタンドアロン実行可能ファイル

別のアプリケーションへのコード配布が目的の場合は,スタンドアロンの実行可能ファイルが必要になります。まず最初の手順として MATLAB Coder を適切に構成します。たとえば、スタンドアロン実行可能ファイルが必要であると指定する 1 つの方法は、MATLAB Coder IDE を使用して MATLAB Coder プロジェクトを作成し、モジュールまたは実行可能ファイルが生成されるようそのプロジェクトを構成することです。これを実行するには、[生成] ページの [ビルド タイプ] ウィジェットで [C/C++ スタティック ライブラリ] または [C/C++ 実行ファイル] のオプションを使用します。この IDE を利用するには、次の手順に従います。

- [アプリ] タブをクリック、[MATLAB Coder] にスクロール ダウン、[MATLAB Coder プロジェクト] ダイアログ ボックスで [OK] をクリック

次を使用して config オブジェクトを定義することもできます。

a=coder.config('exe')

このオブジェクトを MATLAB コマンド ラインで coder コマンドに渡します。スタンドアロン実行可能ファイルを作成する際は、独自の main.c (または main.cpp) を作成しなければなりません。スタンドアロン実行可能ファイルを作成する場合、実行可能ファイルと MATLAB 環境間でデータのインポートやエクスポートを行う既成のユーティリティはないことに注意してください。取り得る方法の 1 つは、(手動で作成した main.c 内の) ファイルに printf/fprintf を使用し、そのファイルで 'load -ascii' を使ってデータを MATLAB にインポートすることです。

アルゴリズムにおける計算部分を独立した MATLAB 関数として分割

MATLAB Coder で C コードを生成するには、MATLAB コードが関数の形式を取っていなければなりません。ただし、通常は、対象となるすべての MATLAB コードについて C コードを生成する必要はありません。多くの場合コードは、C コードの生成が必要となる主要な計算部分と、C コードの生成が不要な (MATLAB で実行される) ハーネスまたはドライバーに分けることが望まれます。ハーネスには、テスト対象システムの一部ではない、可視化や他の検証補助機能が含まれる場合があります。この例のメイン アルゴリズムのコードは、visionRecovertformCodeGeneration_kernelという関数内で定義されています。

上で説明したようにコードを再構成したら、残りのコードが MATLAB Coder でサポートされる機能を使用していることを確認しなければなりません。サポートされるコマンドのリストは、MATLAB Coder のC/C++ コードの生成でサポートされている関数およびオブジェクト(MATLAB Coder)を参照してください。サポートされている言語構成の一覧については、C/C++ コード生成でサポートされている MATLAB 言語機能(MATLAB Coder)を参照してください。

コンパイルの対象とするメイン アルゴリズムを含む関数に、MATLAB Coder ではサポートされていない可視化や他の限定的機能が備わっていると便利な場合があります。その場合は、これらのアイテムを 'extrinsic' として (coder.extrinsic を使用して) 宣言できます。こうした機能は C コードを MATLAB MEX ファイルへと生成する場合にのみに可能であり、またこれらの関数は、実際にはインタープリター型 MATLAB モードで実行されます。スタンドアロンで使用するコードを生成する場合、外部関数が無視されるかエラーとなるかは、コード生成エンジンによって、これらの関数が結果に影響すると判断されるかどうかで決まります。したがって、最終的にスタンドアロンの実行可能ファイルを作成する場合は、対象のコードが外部関数から実質的な影響を受けないよう、コードを正しく構成しなければなりません。

元の例では、結果の可視化に showMatchedFeatures ルーチンと imshowpair ルーチンを使用しています。これらのルーチンは、新しい関数featureMatchingVisualization_extrinsicに抽出されます。この関数は外部関数として宣言されます。

シミュレーションの実行

カーネル ファイルvisionRecovertformCodeGeneration_kernel.mには 2 つの入力パラメーターがあります。最初の入力は元のイメージであり、2 番目の入力は回転とスケールによる歪みをもつイメージです。

% define original imageoriginal = imread('cameraman.tif');% define distorted image by resizing and then rotating original imagescale = 0.7; J = imresize(original, scale); theta = 30; distorted = imrotate(J, theta);% call the generated mex file[matchedOriginalLoc, matchedDistortedLoc,...thetaRecovered,...scaleRecovered, recovered] =...visionRecovertformCodeGeneration_kernel(original, distorted);
scaleRecovered = 0.701003 thetaRecovered = 30.235065

MATLAB 関数の MEX ファイルへのコンパイル

次に関数codegen(MATLAB Coder)を使用して、関数 visionRecovertformCodeGeneration_kernel を MEX ファイルにコンパイルします。コンパイル レポートを生成するには '-report' オプションを指定します。このレポートには元の MATLAB コードと、C コードの生成時に作成された関連ファイルが含まれています。必要に応じて、MATLAB Coder が新しいファイルを作成する一時ディレクトリを作成します。生成される MEX ファイルの名前は、-o オプションを使って実行可能ファイルの名前を指定した場合を除き、元の MATLAB ファイルに _mex を追加したものになることに注意してください。

MATLAB Coder では、すべての入力パラメーターのプロパティを指定しなければなりません。これを簡単に行うには、コマンド ラインで -args オプションを使用して、入力パラメーターを例で定義します。詳細については、コマンド ラインでの例による入力プロパティの定義(MATLAB Coder)を参照してください。%visionRecovertformCodeGeneration_kernelへの入力はイメージのペアであるため、次のプロパティを使って両方の入力を定義します。

  • 実行時に可変サイズで、上限を [1000 1000] とする

  • uint8 データ型

% Define the properties of input imagesimageTypeAndSize = coder.typeof(uint8(0), [1000 1000],[true true]); compileTimeInputs = {imageTypeAndSize, imageTypeAndSize}; codegenvisionRecovertformCodeGeneration_kernel.m-report-argscompileTimeInputs;
Code generation successful: To view the report, open('codegen/mex/visionRecovertformCodeGeneration_kernel/html/report.mldatx')

生成されたコードの実行

[matchedOriginalLocCG, matchedDistortedLocCG,...thetaRecoveredCG, scaleRecoveredCG, recoveredCG] =...visionRecovertformCodeGeneration_kernel_mex(original, distorted);
scaleRecovered = 0.701003 thetaRecovered = 30.235065

クリーンアップ

clearvisionRecovertformCodeGeneration_kernel_mex;

codegen と MATLAB コードの比較

上で示されるように、復元されたスケール (scale) と theta は MATLAB と codegen の両方で適度な許容誤差内にあります。さらに、以下に示すようにマッチする点も同一です。

isequal(matchedOriginalLocCG, matchedOriginalLoc) isequal(matchedDistortedLocCG, matchedDistortedLoc)
ans = logical 1 ans = logical 1

付録

この例では次の補助関数が使用されています。