主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

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

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

Cコンパイラの設定

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

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

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

墨西哥実行可能ファイル

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

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

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

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

- - - - - -[アプリ]タブをクリック,[MATLAB编码器]にスクロールダウン,[MATLAB编码器プロジェクト]ダイアログボックスで[好]をクリック

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

a=coder.config('exe')

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

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

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

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

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

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

シミュレーションの実行

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

%定义原始图像原始= imread (“cameraman.tif”);定义扭曲的图像通过调整大小,然后旋转原始图像规模= 0.7;J = imresize(original, scale);θ= 30;畸变=不旋转(J, theta);%调用生成的mex文件[matchedOriginalLoc, matchedDistortedLoc,...thetaRecovered,...鳞片覆盖,恢复]=...visionRecovertformCodeGeneration_kernel(原始的、扭曲的);
scalereccovered = 0.701003 thetaRecovered = 30.235065

MATLAB関数の 墨西哥ファイルへのコンパイル

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

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

  • 実行時に可変サイズで,上限を(1000 1000)とする

  • uint8データ型

定义输入图像的属性imageTypeAndSize = code .typeof(uint8(0), [1000 1000],[true true]);编译时间输入= {imageypeandsize, imageypeandsize};codegenvisionRecovertformCodeGeneration_kernel.m-报告arg游戏compileTimeInputs;
代码生成成功:要查看报告,打开('codegen/mex/visionRecovertformCodeGeneration_kernel/html/report.mldatx')。

生成されたコードの実行

[matchedOriginalLocCG, matchedDistortedLocCG,...已回收CG、标度已回收CG、已回收CG]=...visionRecovertformCodeGeneration\u kernel\u mex(原始、扭曲);
scalereccovered = 0.701003 thetaRecovered = 30.235065

クリーンアップ

清楚的visionRecovertformCodeGeneration\u内核\u mex;

编码基因と MATLABコードの比較

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

isequal(matchedOriginalLocCG, matchedOriginalLoc)
Ans = logical 1

付録

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