このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
アプリケ,ションにおけるCの,主の例の使用
この例では,メジのエッジ検出を行う単純なソベルフィルタを実装するmatlab®コドからc実行可能ファルをビルドする方法を示します。実行可能ファイルはディスクからイメージを読み取り,ソーベルフィルターアルゴリズムを適用して,変更されたイメージを保存します。
この例では,実行可能ファイルをビルドする際に使用する主要関数の例を生成して変更する方法を示します。
必要条件
この例を実行するには,次の製品を。
MATLAB
MATLAB编码器™
Cコンパイラ(ほとんどのプラットフォーム用に,既定のCコンパイラがMATLABに付属しています)。サポトされているコンパラのリストは,サポトされるコンパラを参照してください。
墨西哥人设置
を使用して既定のコンパ@ @ラを変更できます。既定のコンパ@ @ラの変更を参照してください。
フォルダの作成と関連ファルのコピ
この例では次のファ@ @ルを使用します。
ファ@ @ル名 | ファ@ @ルの種類 | 説明 |
---|---|---|
sobel.m |
関数のコ,ド | Matlabによるソ,ベルフィルタ,アルゴリズムの実装。sobel.m はメジ(双行列)およびしきい値を入力として取得します。アルゴリズムはメジのエッジを(しきい値に基づいて)検出します。sobel.m はエッジを表示する変更された▪▪メ▪▪ジを返します。 |
hello.jpg |
@ @ @ @ @ @ @ @ @ @ @ @ @ @ | ソベルフィルタによって変更されるメジ。 |
。
ロ,カルの作業フォルダ,を作成します。例:
c: \编码器\ edge_detection
。作業フォルダ,に移動します。
ファereplicationル
sobel.m
とhello.jpg
を例のフォルダ索贝尔
から作業フォルダ,にコピ,します。拷贝文件(fullfile (docroot,“工具箱”,“编码器”,“例子”,“索贝尔”))
イメージに対するソーベルフィルターの実行
元の转换器メ转换器ジをmatlab行列に読み取り,表示します。
Im = imread(“hello.jpg”);
ソベルフィルタの結果との比較対象としてメジを表示します。
图像(im);
ソベルフィルタアルゴリズムはグレスケルメジで動作します。正規化された値(0.0が黒,1.0が白)を使ってカラーイメージを等価のグレースケールイメージに変換します。
灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
ソベルフィルタに対してmatlab関数を実行するには,グレスケルメジ行列
灰色的
としきい値を関数索贝尔
に渡します。この例では0.7をしきい値に使用します。edgeIm = sobel(灰色,0.7);
変更した
edgeIm
の形式を関数repmat
で変更し,图像
コマンドに渡せるようにします。im3 = repmat(edgeIm, [1 1 3]);图像(im3);
墨西哥関数の生成とテスト
生成されたコードが元のMATLABコードと機能的に等価であり,ランタイムエラーが発生しないことをテストするには,墨西哥人関数を生成します。
codegen报告索贝尔
codegen
は現在の作業フォルダ,にsobel_mex
という名前のmex関数を生成します。ソベルフィルタに対してmex関数を実行するには,グレスケルメジ行列
灰色的
としきい値を関数sobel_mex
に渡します。この例では0.7をしきい値に使用します。edgeImMex = sobel_mex(灰色,0.7);
変更した
edgeImMex
の形式を関数repmat
で変更し,图像
コマンドに渡せるようにします。im3Mex = repmat(edgeImMex, [1 1 3]);图像(im3Mex);
このメジはmatlab関数を使用して作成された。
sobel.m用の main 関数の例の生成
アプリケーション用にカスタム主要関数を作成することはできますが,主要関数の例は生成されたコードを組み込む際に役立つテンプレートを提供します。
ソ、ベルフィルタ、用に主関数の例を生成するには、次の手順に従います。
Cスタティックラescブラリ用に構成オブジェクトを作成します。
CFG = code .config(“自由”);
C / c++ソースコード,スタティックライブラリ,ダイナミックライブラリおよび実行可能ファイルの構成オブジェクトに対して,設定
GenerateExampleMain
はmain関数の例の生成を制御します。この設定はmain関数の例を生成してもコンパ主机ルはしない“GenerateCodeOnly”
に,既定で設定されます。この例では,GenerateExampleMain
設定の値は変更しないでください。構成オブジェクトを使用してcスタティックラescブラリを生成します。
codegen报告配置cfg索贝尔
スタティックラaapl . cer .スタティックラaapl . cer . cercodegen / lib /索贝尔
に格納されています。メンファルの例は,サブフォルダcodegen / lib /索贝尔/例子
に格納されています。
メaapl . cer .メaapl . cer . cer
ファereplicationルc
とmain.h
を例子
サブフォルダ,で変更しないでください。変更すると,コ,ドの再生成時にMATLAB编码器でメ▪▪ンファ▪▪ルの例が再生成されません。生成されたファ@ @ルに対する変更が検出されたことを警告します。
ファereplicationルc
とmain.h
をフォルダcodegen / lib /索贝尔/例子
から別の場所へコピ,します。この例では,ファereplicationルを現在の作業フォルダーへコピーします。新しい場所でファイルを変更します。
生成されたmain関数の例の変更
主関数の例は動的に割り当てられたデ、タなどのデ、タを宣言して、ゼロ値に初期化します。これは,ゼロ値に設定された引数でエントリポイント関数を呼び出しますが,エントリポイント関数から返される値は使用しません。
Cの主関数はアプリケ,ションの要件を満たしていなければなりません。この例では,ソーベル フィルター アプリケーションの要件を満たすように main 関数の例を変更しています。
この例では,ソベルフィルタアプリケションが次を実行するように,ファルc
を変更しています。
バナリファルからグレルメ。
ソ,ベルフィルタ,アルゴリズムを適用する。
変更された▪▪メ▪ジをバ▪▪ナリファ▪▪ルに保存する。
主机関数の変更
次を実行するように主要
関数を変更します。
グレスケルメジデタとしきい値を含むファルを入力引数として受け入れます。
グレスケルメジデタストリムのアドレスとしきい値を入力引数として指定して関数
main_sobel
を呼び出します。
主要
関数で次を実行します。
宣言
空白(命令行参数个数)
と(空白)argv
を削除します。変数
文件名
を宣言し,グレスケルメジデタを含むバナリファルの名前を保持します。Const char *文件名
変数
阈值
を宣言し,しきい値を保持します。双阈值;
変数
fd
を宣言し,アプリケ,ションが文件名
から読み取るグレスケルメジデタのアドレスを保持します。文件* fd;
3の引数をチェックする
如果
ステ,トメントを追加します。if (argc != 3) {printf("期望2个参数:文件名和阈值\n");退出(1);}
グレスケルメジデタを含むファルの入力引数
argv [1]
を文件名
に代入します。文件名= argv[1];
しきい値の入力引数
argv [2]
を阈值
に代入し,入力を文字列から双の数値に変換します。阈值= atof(argv[2]);
名前が
文件名
に指定されているグレスケルメジデタを含んだファルを開きます。デ,タストリ,ムのアドレスをfd
に代入します。Fd = fopen(文件名,"rb");
実行可能ファ@ @ルが
文件名
を開くことを検証するには,fd
の値が零
の場合にプログラムを終了する如果
ステ,トメントを記述します。if (fd == NULL) {exit(-1);}
入力引数
fd
と阈值
を指定してmain_sobel
を呼び出し,main_sobel
の関数呼び出しを置き換えます。main_sobel (fd,阈值);
sobel_terminate
を呼び出した後,グレスケルメジファルを閉じます。文件关闭(fd);
初期化関数argInit_d1024xd1024_real_Tの変更
メ▪▪ンファ▪▪ルの例で,関数argInit_d1024xd1024_real_T
はソーベルフィルターに渡すイメージに対して動的に割り当てられた可変サイズの配列(emxArray)を作成します。この関数はemxArrayを既定サesc escズに初期化し,emxArrayの要素を0にします。これは初期化されたemxArrayを返します。
ソーベルフィルターアプリケーションの場合,バイナリファイルからグレースケールイメージデータをemxArrayに読み取るように関数を変更します。
関数argInit_d1024xd1024_real_T
で次を実行します。
入力引数
无效
を引数文件* fd
と置き換えます。この変数は関数が読み取るグレスケルメジデタを指します。静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd)
グレスケルメジ行列
灰色的
の次元と一致するように変数iv2
の値を変更します。iv2
はargInit_d1024xd1024_real_T
で作成されるemxArrayの次元のサズ値を保持します。静态int iv2[2] = {484, 648};
Matlabは列優先の形式でデ,タを格納し,cは行優先の形式で行列デ,タを格納します。次元を適宜宣言します。
グレスケルメジデタから読み取る値を保持する変数
元素
を定義します。双元素;
为
ル,プの構成を変更し,从文件中读
コマンドを内部为
ルプに追加してデタ点を正規化メジから元素
に読み取ります。Fread (&element, 1, sizeof(element), fd);
为
ル,プ内部で元素
をemxArrayデ,タの値セットとして代入します。Result ->data[b_j0 + Result ->size[0] * b_j1] = element;
関数saveImageの作成
Matlab関数sobel.m
はMATLAB配列とインターフェイスを取りますが,ソーベルフィルターアプリケーションはバイナリファイルとインターフェイスを取ります。
ソベルフィルタアルゴリズムで変更されたメジをバナリファルに保存するには,関数saveImage
を作成します。関数saveImage
はemxArrayのデタをバナリファルに書き込みます。これは関数argInit_d1024xd1024_real_T
で使用する構成と同様の構成を使用します。
c
ファ@ @ルで次のことを行います。
emxArray
edgeImage
のアドレスを入力として受け取り,出力タesc escプvoidをもesc esc関数saveImage
を定義します。(emxArray_uint8_T *edgeImage) {}
変数
b_j0
と変数b_j1
を関数argInit_d1024xd1024_real_T
で定義する場合と同じように定義します。int b_j0;int b_j1;
emxArrayから読み取るデ,タを格納するように変数
元素
を定義します。uint8_T元素;
変更された▪▪メ▪ジの書き込み用にバ▪▪ナリファ▪▪ル
edge.bin
を開きます。edge.bin
のアドレスを文件* fd
に代入します。FILE *fd = fopen("edge.bin", "wb");
実行可能ファ@ @ルが
edge.bin
を開くことを検証するには,fd
の値が零
の場合にプログラムを終了する如果
ステ,トメントを記述します。if (fd == NULL) {exit(-1);}
入れ子にされた
为
ル,プの構成を関数argInit_d1024xd1024_real_T
の構成と同じように書き込みます。For (b_j0 = 0;b_j0 < edgeImage->size[0U];B_j0 ++) {for (b_j1 = 0;b_j1 < edgeImage->size[1U];B_j1 ++) {}}
内部
为
ルプで,変更されたメジデタの値を元素
に代入します。element = edgeImage->data[b_j0 + edgeImage->size[0] * b_j1];
元素
の代入後,元素
の値をファ@ @ルedge.bin
に書き込みます。Fwrite (&element, 1, sizeof(element), fd);
为
ル,プの構成後,fd
を閉じます。文件关闭(fd);
関数main_sobelの変更
この主関数の例では,関数main_sobel
はグレスケルのデタと変更されたメジにemxArraysを作成します。これは,グレスケルメジのemxArrayを初期化する関数argInit_d1024xd1024_real_T
を呼び出します。main_sobel
は,emxArraysと,初期化関数argInit_real_T
が関数索贝尔
に返すしきい値0の両方を渡します。関数main_sobel
が終了すると,関数索贝尔
の結果を破棄します。
ソ,ベルフィルタ,アプリケ,ションの場合,関数main_sobel
を次に変更します。
グレスケルメジデタのアドレスとしきい値を入力として受け取ります。
argInit_d1024xd1024_real_T
を使用してアドレスからデ,タを読み取ります。しきい値
阈值
でデ,タをソ,ベルフィルタ,アルゴリズムに渡します。saveImage
を使用して結果を保存します。
関数main_sobel
で次を実行します。
引数
文件* fd
と双阈值
をも関数と入力引数を置き換えます。main_sobel(FILE *fd, double threshold)
入力引数
fd
をargInit_d1024xd1024_real_T
の関数呼び出しに渡します。originalImage = argInit_d1024xd1024_real_T(fd);
関数呼び出し内のしきい値の入力を
阈值
をも索贝尔
に置き換えます。sobel(originalImage, threshold, edgeImage);
関数
索贝尔
を呼び出した後,入力edgeImage
をも関数saveImage
を呼び出します。saveImage (edgeImage);
関数宣言の変更
関数宣言に加えた変更と一致させるには,関数宣言に次の変更を加えます。
関数
* argInit_d1024xd1024_real_T
の入力を文件* fd
に変更します。静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd);
関数
main_sobel
の入力を文件* fd
と双阈值
に変更します。static void main_sobel(FILE *fd, double threshold);
関数
saveImage
を追加します。(emxArray_uint8_T *edgeImage);
@ @ @ @ @ @ @ @ @ @ @ @ @ @
c
で使用する入出力関数の場合,ヘッダ,ファ,ルstdio . h
を▪▪ンクル▪▪ドファ▪▪ルリストに追加します。
# include < stdio . h >
変更されたファ@ @ルc
の内容
ソ,ベルフィルタ,アプリケ,ションの生成
作業フォルダ,に移動します(現在作業フォルダ,以外にいる場合)。
Cスタンドアロンの実行可能ファescルに構成オブジェクトを作成します。
CFG = code .config(exe”);
構成オブジェクトと変更された主要関数を使用して,ソーベルフィルターにCスタンドアロンの実行可能ファイルを生成します。
codegen报告配置cfg索贝尔cmain.h
既定では,MATLABをWindows®プラットフォムで実行している場合,実行可能ファルsobel.exe
は現在の作業フォルダ,に生成されます。MATLABをWindows 以外のプラットフォームで実行している場合、ファイルの拡張子はそのプラットフォームに対応する拡張子になります。既定の設定では、実行可能ファイルの生成されたコードはフォルダーcodegen / exe /索贝尔
にあります。
ソ,ベルフィルタ,アプリケ,ションの実行
Matlab行列
灰色的
が現在matlabワ,クスペ,スにない場合は,作成します。Im = imread(“hello.jpg”);
灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
行列
灰色的
を打开外部文件
と写入文件
コマンドを使用してバ▪▪ナリファ▪▪ルに書き込みます。アプリケーションはこのバイナリ ファイルを読み取ります。Fid = fopen(“gray.bin”,' w ');写入文件(fid,灰色,“双”);文件关闭(fid);
実行可能ファaapl . exeルを実行して,ファaapl . exeル
gray.bin
およびしきい値0.7を渡します。この例をWindowsプラットフォ,ムのMATLABで実行するには,次を行います。
系统('sobel.exe gray.bin 0.7');
実行可能ファ▪▪ルはファ▪▪ル
edge.bin
を生成します。
結果として得た▪▪メ▪▪ジの表示
打开外部文件
と从文件中读
コマンドを使用して,ファedge.bin
をmatlab行列edgeImExe
に読み取ります。Fd = fopen(“edge.bin”,“r”);edgeImExe = fread(fd, size(灰色),“uint8”);文件关闭(fd);
行列
edgeImExe
を関数repmat
に渡し,。im3Exe = repmat(edgeImExe, [1 1 3]);图像(im3Exe);
@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @