主要内容

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

アプリケ,ションにおけるCの,主の例の使用

この例では,メジのエッジ検出を行う単純なソベルフィルタを実装するmatlab®コドからc実行可能ファルをビルドする方法を示します。実行可能ファイルはディスクからイメージを読み取り,ソーベルフィルターアルゴリズムを適用して,変更されたイメージを保存します。

この例では,実行可能ファイルをビルドする際に使用する主要関数の例を生成して変更する方法を示します。

必要条件

この例を実行するには,次の製品を。

  • MATLAB

  • MATLAB编码器™

  • Cコンパイラ(ほとんどのプラットフォーム用に,既定のCコンパイラがMATLABに付属しています)。サポトされているコンパラのリストは,サポトされるコンパラを参照してください。

    墨西哥人设置を使用して既定のコンパ@ @ラを変更できます。既定のコンパ@ @ラの変更を参照してください。

フォルダの作成と関連ファルのコピ

この例では次のファ@ @ルを使用します。

ファ@ @ル名 ファ@ @ルの種類 説明
sobel.m 関数のコ,ド Matlabによるソ,ベルフィルタ,アルゴリズムの実装。sobel.mはメジ(双行列)およびしきい値を入力として取得します。アルゴリズムはメジのエッジを(しきい値に基づいて)検出します。sobel.mはエッジを表示する変更された▪▪メ▪▪ジを返します。
hello.jpg @ @ @ @ @ @ @ @ @ @ @ @ @ @ ソベルフィルタによって変更されるメジ。

ファesc escルsobel。Mの内容

你好。jpgの内容

  1. ロ,カルの作業フォルダ,を作成します。例:c: \编码器\ edge_detection

  2. 作業フォルダ,に移動します。

  3. ファereplicationルsobel.mhello.jpgを例のフォルダ索贝尔から作業フォルダ,にコピ,します。

    拷贝文件(fullfile (docroot,“工具箱”“编码器”“例子”“索贝尔”))

イメージに対するソーベルフィルターの実行

  1. 元の转换器メ转换器ジをmatlab行列に読み取り,表示します。

    Im = imread(“hello.jpg”);
  2. ソベルフィルタの結果との比較対象としてメジを表示します。

    图像(im);

  3. ソベルフィルタアルゴリズムはグレスケルメジで動作します。正規化された値(0.0が黒,1.0が白)を使ってカラーイメージを等価のグレースケールイメージに変換します。

    灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
  4. ソベルフィルタに対してmatlab関数を実行するには,グレスケルメジ行列灰色的としきい値を関数索贝尔に渡します。この例では0.7をしきい値に使用します。

    edgeIm = sobel(灰色,0.7);
  5. 変更したedgeImの形式を関数repmatで変更し,图像コマンドに渡せるようにします。

    im3 = repmat(edgeIm, [1 1 3]);图像(im3);

墨西哥関数の生成とテスト

  1. 生成されたコードが元のMATLABコードと機能的に等価であり,ランタイムエラーが発生しないことをテストするには,墨西哥人関数を生成します。

    codegen报告索贝尔

    codegenは現在の作業フォルダ,にsobel_mexという名前のmex関数を生成します。

  2. ソベルフィルタに対してmex関数を実行するには,グレスケルメジ行列灰色的としきい値を関数sobel_mexに渡します。この例では0.7をしきい値に使用します。

    edgeImMex = sobel_mex(灰色,0.7);
  3. 変更したedgeImMexの形式を関数repmatで変更し,图像コマンドに渡せるようにします。

    im3Mex = repmat(edgeImMex, [1 1 3]);图像(im3Mex);

    このメジはmatlab関数を使用して作成された。

sobel.m用の main 関数の例の生成

アプリケーション用にカスタム主要関数を作成することはできますが,主要関数の例は生成されたコードを組み込む際に役立つテンプレートを提供します。

ソ、ベルフィルタ、用に主関数の例を生成するには、次の手順に従います。

  1. Cスタティックラescブラリ用に構成オブジェクトを作成します。

    CFG = code .config(“自由”);

    C / c++ソースコード,スタティックライブラリ,ダイナミックライブラリおよび実行可能ファイルの構成オブジェクトに対して,設定GenerateExampleMainはmain関数の例の生成を制御します。この設定はmain関数の例を生成してもコンパ主机ルはしない“GenerateCodeOnly”に,既定で設定されます。この例では,GenerateExampleMain設定の値は変更しないでください。

  2. 構成オブジェクトを使用してcスタティックラescブラリを生成します。

    codegen报告配置cfg索贝尔

スタティックラaapl . cer .スタティックラaapl . cer . cercodegen / lib /索贝尔に格納されています。メンファルの例は,サブフォルダcodegen / lib /索贝尔/例子に格納されています。

ファaapl . exeルmain.cの例の内容

メaapl . cer .メaapl . cer . cer

ファereplicationルcmain.h例子サブフォルダ,で変更しないでください。変更すると,コ,ドの再生成時にMATLAB编码器でメ▪▪ンファ▪▪ルの例が再生成されません。生成されたファ@ @ルに対する変更が検出されたことを警告します。

ファereplicationルcmain.hをフォルダcodegen / lib /索贝尔/例子から別の場所へコピ,します。この例では,ファereplicationルを現在の作業フォルダーへコピーします。新しい場所でファイルを変更します。

生成されたmain関数の例の変更

主関数の例は動的に割り当てられたデ、タなどのデ、タを宣言して、ゼロ値に初期化します。これは,ゼロ値に設定された引数でエントリポイント関数を呼び出しますが,エントリポイント関数から返される値は使用しません。

Cの主関数はアプリケ,ションの要件を満たしていなければなりません。この例では,ソーベル フィルター アプリケーションの要件を満たすように main 関数の例を変更しています。

この例では,ソベルフィルタアプリケションが次を実行するように,ファルcを変更しています。

  • バナリファルからグレルメ。

  • ソ,ベルフィルタ,アルゴリズムを適用する。

  • 変更された▪▪メ▪ジをバ▪▪ナリファ▪▪ルに保存する。

主机関数の変更

次を実行するように主要関数を変更します。

  • グレスケルメジデタとしきい値を含むファルを入力引数として受け入れます。

  • グレスケルメジデタストリムのアドレスとしきい値を入力引数として指定して関数main_sobelを呼び出します。

主要関数で次を実行します。

  1. 宣言空白(命令行参数个数)(空白)argvを削除します。

  2. 変数文件名を宣言し,グレスケルメジデタを含むバナリファルの名前を保持します。

    Const char *文件名
  3. 変数阈值を宣言し,しきい値を保持します。

    双阈值;
  4. 変数fdを宣言し,アプリケ,ションが文件名から読み取るグレスケルメジデタのアドレスを保持します。

    文件* fd;
  5. 3の引数をチェックする如果ステ,トメントを追加します。

    if (argc != 3) {printf("期望2个参数:文件名和阈值\n");退出(1);}
  6. グレスケルメジデタを含むファルの入力引数argv [1]文件名に代入します。

    文件名= argv[1];
  7. しきい値の入力引数argv [2]阈值に代入し,入力を文字列から双の数値に変換します。

    阈值= atof(argv[2]);
  8. 名前が文件名に指定されているグレスケルメジデタを含んだファルを開きます。デ,タストリ,ムのアドレスをfdに代入します。

    Fd = fopen(文件名,"rb");
  9. 実行可能ファ@ @ルが文件名を開くことを検証するには,fdの値がの場合にプログラムを終了する如果ステ,トメントを記述します。

    if (fd == NULL) {exit(-1);}
  10. 入力引数fd阈值を指定してmain_sobelを呼び出し,main_sobelの関数呼び出しを置き換えます。

    main_sobel (fd,阈值);
  11. sobel_terminateを呼び出した後,グレスケルメジファルを閉じます。

    文件关闭(fd);

変更したmain関数

初期化関数argInit_d1024xd1024_real_Tの変更

メ▪▪ンファ▪▪ルの例で,関数argInit_d1024xd1024_real_Tはソーベルフィルターに渡すイメージに対して動的に割り当てられた可変サイズの配列(emxArray)を作成します。この関数はemxArrayを既定サesc escズに初期化し,emxArrayの要素を0にします。これは初期化されたemxArrayを返します。

ソーベルフィルターアプリケーションの場合,バイナリファイルからグレースケールイメージデータをemxArrayに読み取るように関数を変更します。

関数argInit_d1024xd1024_real_Tで次を実行します。

  1. 入力引数无效を引数文件* fdと置き換えます。この変数は関数が読み取るグレスケルメジデタを指します。

    静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd)
  2. グレスケルメジ行列灰色的の次元と一致するように変数iv2の値を変更します。iv2argInit_d1024xd1024_real_Tで作成されるemxArrayの次元のサズ値を保持します。

    静态int iv2[2] = {484, 648};

    Matlabは列優先の形式でデ,タを格納し,cは行優先の形式で行列デ,タを格納します。次元を適宜宣言します。

  3. グレスケルメジデタから読み取る値を保持する変数元素を定義します。

    双元素;
  4. ル,プの構成を変更し,从文件中读コマンドを内部ルプに追加してデタ点を正規化メジから元素に読み取ります。

    Fread (&element, 1, sizeof(element), fd);
  5. ル,プ内部で元素をemxArrayデ,タの値セットとして代入します。

    Result ->data[b_j0 + Result ->size[0] * b_j1] = element;

変更された初期化関数argInit_d1024xd1024_real_T

関数saveImageの作成

Matlab関数sobel.mはMATLAB配列とインターフェイスを取りますが,ソーベルフィルターアプリケーションはバイナリファイルとインターフェイスを取ります。

ソベルフィルタアルゴリズムで変更されたメジをバナリファルに保存するには,関数saveImageを作成します。関数saveImageはemxArrayのデタをバナリファルに書き込みます。これは関数argInit_d1024xd1024_real_Tで使用する構成と同様の構成を使用します。

cファ@ @ルで次のことを行います。

  1. emxArrayedgeImageのアドレスを入力として受け取り,出力タesc escプvoidをもesc esc関数saveImageを定義します。

    (emxArray_uint8_T *edgeImage) {}
  2. 変数b_j0と変数b_j1を関数argInit_d1024xd1024_real_Tで定義する場合と同じように定義します。

    int b_j0;int b_j1;
  3. emxArrayから読み取るデ,タを格納するように変数元素を定義します。

    uint8_T元素;
  4. 変更された▪▪メ▪ジの書き込み用にバ▪▪ナリファ▪▪ルedge.binを開きます。edge.binのアドレスを文件* fdに代入します。

    FILE *fd = fopen("edge.bin", "wb");
  5. 実行可能ファ@ @ルがedge.binを開くことを検証するには,fdの値がの場合にプログラムを終了する如果ステ,トメントを記述します。

    if (fd == NULL) {exit(-1);}
  6. 入れ子にされたル,プの構成を関数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 ++) {}}
  7. 内部ルプで,変更されたメジデタの値を元素に代入します。

    element = edgeImage->data[b_j0 + edgeImage->size[0] * b_j1];
  8. 元素の代入後,元素の値をファ@ @ルedge.binに書き込みます。

    Fwrite (&element, 1, sizeof(element), fd);
  9. ル,プの構成後,fdを閉じます。

    文件关闭(fd);

関数saveImage

関数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で次を実行します。

  1. 引数文件* fd双阈值をも関数と入力引数を置き換えます。

    main_sobel(FILE *fd, double threshold)
  2. 入力引数fdargInit_d1024xd1024_real_Tの関数呼び出しに渡します。

    originalImage = argInit_d1024xd1024_real_T(fd);
  3. 関数呼び出し内のしきい値の入力を阈值をも索贝尔に置き換えます。

    sobel(originalImage, threshold, edgeImage);
  4. 関数索贝尔を呼び出した後,入力edgeImageをも関数saveImageを呼び出します。

    saveImage (edgeImage);

変更された関数main_sobel

関数宣言の変更

関数宣言に加えた変更と一致させるには,関数宣言に次の変更を加えます。

  1. 関数* argInit_d1024xd1024_real_Tの入力を文件* fdに変更します。

    静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd);
  2. 関数main_sobelの入力を文件* fd双阈值に変更します。

    static void main_sobel(FILE *fd, double threshold);
  3. 関数saveImageを追加します。

    (emxArray_uint8_T *edgeImage);

変更された関数宣言

@ @ @ @ @ @ @ @ @ @ @ @ @ @

cで使用する入出力関数の場合,ヘッダ,ファ,ルstdio . hを▪▪ンクル▪▪ドファ▪▪ルリストに追加します。

# include < stdio . h >

変更された▪▪ンクル▪▪ドファ▪▪ル

変更されたファ@ @ルcの内容

c

ソ,ベルフィルタ,アプリケ,ションの生成

  1. 作業フォルダ,に移動します(現在作業フォルダ,以外にいる場合)。

  2. Cスタンドアロンの実行可能ファescルに構成オブジェクトを作成します。

    CFG = code .config(exe”);
  3. 構成オブジェクトと変更された主要関数を使用して,ソーベルフィルターにCスタンドアロンの実行可能ファイルを生成します。

    codegen报告配置cfg索贝尔cmain.h

既定では,MATLABをWindows®プラットフォムで実行している場合,実行可能ファルsobel.exeは現在の作業フォルダ,に生成されます。MATLABをWindows 以外のプラットフォームで実行している場合、ファイルの拡張子はそのプラットフォームに対応する拡張子になります。既定の設定では、実行可能ファイルの生成されたコードはフォルダーcodegen / exe /索贝尔にあります。

ソ,ベルフィルタ,アプリケ,ションの実行

  1. Matlab行列灰色的が現在matlabワ,クスペ,スにない場合は,作成します。

    Im = imread(“hello.jpg”);
    灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
  2. 行列灰色的打开外部文件写入文件コマンドを使用してバ▪▪ナリファ▪▪ルに書き込みます。アプリケーションはこのバイナリ ファイルを読み取ります。

    Fid = fopen(“gray.bin”' w ');写入文件(fid,灰色,“双”);文件关闭(fid);
  3. 実行可能ファaapl . exeルを実行して,ファaapl . exeルgray.binおよびしきい値0.7を渡します。

    この例をWindowsプラットフォ,ムのMATLABで実行するには,次を行います。

    系统('sobel.exe gray.bin 0.7');

    実行可能ファ▪▪ルはファ▪▪ルedge.binを生成します。

結果として得た▪▪メ▪▪ジの表示

  1. 打开外部文件从文件中读コマンドを使用して,ファedge.binをmatlab行列edgeImExeに読み取ります。

    Fd = fopen(“edge.bin”“r”);edgeImExe = fread(fd, size(灰色),“uint8”);文件关闭(fd);
  2. 行列edgeImExeを関数repmatに渡し,。

    im3Exe = repmat(edgeImExe, [1 1 3]);图像(im3Exe);

    @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @

関連するトピック