ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

画像処理関数を含むアプリケーションからのコード生成

この例では、Image Processing Toolbox™ の関数を使用する MATLAB® アプリケーションから MATLAB Coder™ を使用して C コードを生成する方法を説明します。この例では、MATLAB 環境を設定し、コード生成用の MATLAB コードを準備して、MATLAB コードで発生する可能性のある、コード生成の妨げとなる問題の回避方法を説明します。

コンパイラの設定

この例では、コード生成のために MATLAB Coder で使用する C/C++ コンパイラを指定する方法を説明します。

MATLAB Coder で使用する C/C++ コンパイラを指定するには、関数 mex-setup オプション付きで使用します。

mex -setup
MEX configured to use 'Microsoft Visual C++ 2010 (C)' for C language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
	 variables with more than 2^32-1 elements. In the near future
	 you will be required to update your code to utilize the
	 new API. You can find more information about this at:
	 http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

To choose a different C compiler, select one from the following:
Microsoft Visual C++ 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\msvc2012.xml C
Intel C++ Composer XE 2013 with Microsoft Visual Studio 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2012.xml C
Intel C++ Composer XE 2011 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\mexopts\intel_c_12_vs2010.xml C
Intel C++ Composer XE 2013 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2010.xml C
Microsoft Visual C++ 2010 (C)  mex -setup:C:\MATLAB\R2015a\mex_C_win64.xml C

To choose a different language, select one from the following:
 mex -setup C++ 
 mex -setup FORTRAN mex -setup FORTRAN

コードの生成

この例では、MATLAB Coder を使用して、Image Processing Toolbox 関数を含む MATLAB コードから C コードを生成する方法を説明します。プロセスを説明するため、この例で使用するコードには、コードの生成前に解決しなければならない準備の問題とビルドの問題が含まれています。

次のコードをファイルにコピーして、cellDetectionMATLAB.m という名前を付けて保存します。このコードは、Image Processing Toolbox のの例を変更したものです。

function BWfinal = cellDetectionMATLAB(I)
%cellDetectionMATLAB - detect cells using image segmentation.

[~, threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BWs = edge(I,'sobel', threshold * fudgeFactor);
figure
imshow(BWs)
title('binary gradient mask');

se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);

BWsdil = imdilate(BWs, [se90 se0]);
figure
imshow(BWsdil)
title('dilated gradient mask');

BWdfill = imfill(BWsdil, 'holes');
figure
imshow(BWdfill);
title('binary image with filled holes');

BWnobord = imclearborder(BWdfill, 4);
figure
imshow(BWnobord)
title('cleared border image');

seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure
imshow(BWfinal)
title('segmented image');

サンプル イメージを使用してコード例をテストします。Image Processing Toolbox に含まれている cell.tif ファイル (matlab\toolbox\images\imdata\cell.tif) を使用します。

I = imread('cell.tif');

Iseg = cellDetectionMATLAB(I);

% Display the original image and the segmented image side-by-side.
imshowpair(I,Iseg,'montage')

C コード生成前に MATLAB コードのコピーを作成します。コード生成用にこのコードを変更するため、コピーを使用して作業をすることをお勧めします。

copyfile('cellDetectionMATLAB.m','cellDetectionCodeGeneration.m');

MATLAB エディターで、コード生成された関数を開きます。最初の手順として、関数シグネチャ内の関数名をファイル名と一致するように変更し、MATLAB Coder のコンパイル命令 %#codegen を関数シグネチャの最後に追加します。この命令は、MATLAB コード アナライザーに対して、コード生成の妨げとなる問題を診断するように指示します。

function BWfinal = cellDetectionCodeGeneration(I) %#codegen
.
.
.

MATLAB Coder アプリを開きます。MATLAB で [アプリ] タブを選択し、[コード生成] に移動して MATLAB Coder アプリをクリックします (または、MATLAB コマンド プロンプトで「coder」と入力します)。

エントリポイント関数の名前 cellDetectionCodeGeneration を指定し、Enter を押します。

このコードのコード生成の準備状態を判定します。[次へ] (コーダー ウィンドウの右下) をクリックします。MATLAB Coder によりコード生成の妨げとなる問題が特定されます。このコードの例には 5 つのサポートされていない関数呼び出しがあります。

準備状態の問題を確認します。[問題の確認] をクリックします。MATLAB Coder のレポートでは、編集ウィンドウにコードが表示され、その下側にコード生成をサポートしていない関数 imshow の使用を警告する準備状態の問題のリストが示されます。

準備状態の問題を解決します。この例から imshow の呼び出しと関連する表示コードを削除します。表示のステートメントはセグメンテーションの演算には必要ありません。MATLAB Coder でこのコードの例を編集できます。コードを削除したら、[保存] をクリックして編集を保存し、準備状態のチェックを再実行します。準備状態のチェックを再実行すると、MATLAB Coder「問題は見つかりません」というメッセージを表示します。

関数への入力のサイズとデータ型を定義します。コードへの入力はすべて、固定サイズ、可変サイズまたは定数になるように指定しなければなりません。入力引数のサイズの指定方法は複数ありますが、最も簡単な方法は関数呼び出しの例を MATLAB Coder に指定することです。関数を呼び出すスクリプトをテキスト入力フィールドに入力します。この例では、次のコードを入力して Enter を押します。

I = imread('cell.tif’); 
Iseg = cellDetectionCodeGeneration(I);

入力の定義についての詳細は、MATLAB Coder のドキュメンテーションを参照してください。MATLAB Coder が入力タイプの定義を返したら、[次へ] をクリックします。

実行時の問題をチェックします。MATLAB Coder の準備状態チェックを実行していても、コード生成の妨げとなるその他の問題がビルド処理の際に発生する場合があります。準備状態チェックでは関数の依存関係によって準備状態が特定されますが、ビルド処理ではコーディング パターンが検証されます。入力タイプの定義で入力したのと同じコードを使用できます (ダイアログ ボックスに事前に読み込まれています)。[問題の確認] をクリックします。

この例には次のビルドの問題が含まれています。すなわち、strel オブジェクトの配列を imdilate に渡していますが、オブジェクトの配列はコード生成でサポートされていないのです。

特定されたビルドの問題を解決します。この例では、strel オブジェクトの配列を渡さないように、imdilate の呼び出しを変更しなければなりません。これを行うには、imdilate に対する 1 つの呼び出しを、imdilate に対する 2 つの別々の呼び出しに置き換えます。この場合、次の図に示すようにそれぞれの呼び出しで 1 つの strel オブジェクトを渡します。

テスト用のビルドを再実行し、変更によって問題が解決したことを確認します。[問題の確認] をクリックします。MATLAB Coder は問題が検出されないことを示すメッセージを表示します。これでコード生成の準備ができました。[次へ] をクリックします。

生成するコードの種類を選択し、ターゲット プラットフォームを選択します。MATLAB Coder は C または C++ ソース コード、MEX ファイル、スタティック ライブラリ、共有ライブラリまたはスタンドアロンの実行可能ファイルを生成できます。[製品ハードウェア] は、ARM や Intel プロセッサを含む多くの選択肢から選択できます。この例では、[ソース コード] を選択し、[言語] は [C] オプションを選択したままにします。また、[製品ハードウェア] には [汎用] を、[デバイス タイプ] には [MATLAB Host Computer] を選択します。[MATLAB Host Computer] を選択した場合、MATLAB Coder はプリコンパイルされた共有ライブラリに依存するコードを生成します。Image Processing Toolbox 関数は、共有ライブラリを使用して最適なパフォーマンスを維持しています。選択が完了したら、[生成] をクリックします。

コードを生成します。終了すると、MATLAB Coder に生成コードが表示されます。

[C/C++ ダイナミック ライブラリ] オプションを選択した場合、MATLAB Coder では次のインターフェイスが生成されます。このインターフェイスは、外部アプリケーションとの統合に使用できます。

type codegen\dll\cellDetectionCodeGeneration\cellDetectionCodeGeneration.h
/*
 * cellDetectionCodeGeneration.h
 *
 * Code generation for function 'cellDetectionCodeGeneration'
 *
 */

#ifndef __CELLDETECTIONCODEGENERATION_H__
#define __CELLDETECTIONCODEGENERATION_H__
/* Include files */
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#include "rtwtypes.h"
#include "cellDetectionCodeGeneration_types.h"

/* Function Declarations */
#ifdef __cplusplus
extern "C" {
#endif
extern void cellDetectionCodeGeneration(const unsigned char I[30369], boolean_T BWfinal[30369]);
#ifdef __cplusplus
}
#endif
#endif
/* End of code generation (cellDetectionCodeGeneration.h) */

提示されている関数シグネチャは、2 つの入力があることを示しています。最初の入力 I は、30,369 個の要素をもつ unsigned char であると予測されます。これは、セル検出を実行する入力イメージを渡すために使用します。MATLAB 内の入力イメージのタイプ (uint8) は、unsigned char として表現されます。イメージのサイズは 159 x 191、つまり 30,369 個の要素です。この入力は固定サイズに定義されているため、要素の数はインターフェイスを使用して指定されます。2 番目の入力 BWfinal は、30,369 個の要素をもつ boolean_T であると予測されます。これは、出力イメージへのポインターを渡すために使用します。

MATLAB と C では、配列をメモリに格納する方法が違うことに注意してください。MATLAB では列優先の順序で配列を格納し、C では行優先の順序で配列を格納します。説明のために、次の配列について考えます。

[ 1  2
  3  4 ]

MATLAB では、配列を [1 3 2 4 ] としてメモリに格納しますが、C では要素を [1 2 3 4 ] として格納します。配列を取り扱うときは、この違いを考慮に入れなければなりません。

[C/C++ 実行ファイル] オプションを使用してスタンドアロンの実行可能ファイルを生成することもできます。この場合は、生成されたコードを呼び出す main 関数を指定しなければなりません。データをインポートするための既製のユーティリティはありません。例については、MATLAB Coder のドキュメンテーションの「原子のシミュレーションへの動的なメモリ割り当ての使用」を参照してください。

[次へ] をクリックして処理を完了します。MATLAB Coder は生成内容についての情報を表示します。MATLAB Coder の既定の設定では、生成された出力を格納する codegen サブフォルダーが作業フォルダーに作成されます。コード生成の詳細は、MATLAB Coder のドキュメンテーションを参照してください。

詳細

この情報は役に立ちましたか?