主要内容

在应用程序中使用示例C MAIN

此示例显示如何从MATLAB构建一个可执行文件®代码,实现了一个简单的Sobel过滤器,对图像执行边缘检测。可执行文件从磁盘读取图像,应用Sobel过滤算法,然后保存修改后的图像。

这个示例展示了如何生成和修改一个示例主函数,您可以在构建可执行文件时使用这个主函数。

先决条件

要完成此示例,请安装以下产品:下载188bet金宝搏

  • MATLAB

  • Matlab Coder™

  • C编译器(对于大多数平台,MATLAB提供默认的C编译器)。有关支持的编译器列表,请参阅金宝app金宝app支持编译器

    您可以使用墨西哥人设置更改默认编译器。看到改变默认的编译器

创建文件夹并复制相关文件

你在这个例子中使用的文件是:

文件名称 文件类型 描述
sobel.m 函数代码 MATLAB实现Sobel过滤算法。sobel.m以图像(表示为双矩阵)和阈值作为输入。该算法基于阈值检测图像中的边缘。sobel.m返回显示边缘的修改图像。
hello.jpg 图像文件 Sobel滤镜修改的图像。

文件的内容sobel.m

hello.jpg的内容

将示例文件复制到本地工作目录。

  1. 创建一个本地工作文件夹。例如,c: \编码器\ edge_detection

  2. 导航到工作文件夹。

  3. 复制文件sobel.mhello.jpg从示例文件夹中索贝尔到您的工作文件夹。

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

在图像上运行Sobel过滤器

  1. 将原始图像读入MATLAB矩阵并显示它。

    我= imread ('hello.jpg');
  2. 将图像显示为与Sobel滤波器结果进行比较的基础。

    图像(im);

  3. Sobel滤波算法对灰度图像进行处理。将彩色图像转换为具有归一化值(0.0为黑色,1.0为白色)的等效灰度图像。

    灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
  4. 运行MATLAB函数进行Sobel滤波,通过灰度图像矩阵灰色的和函数的阈值索贝尔.本例使用0.7作为阈值。

    edgeIm = sobel(灰色,0.7);
  5. 要显示修改后的图像,请重新格式化矩阵edgeIm与函数repmat这样你就可以把它传递给图片命令。

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

生成并测试MEX功能

  1. 要测试生成的代码在功能上等同于原始MATLAB代码,并且不会发生运行时错误,生成MEX函数。

    codegen报告索贝尔

    codegen生成一个名为sobel_mex.在当前工作文件夹中。

  2. 要为Sobel过滤器运行MEX函数,请传递灰度图像矩阵灰色的和函数的阈值sobel_mex..本例使用0.7作为阈值。

    edgeImMex = sobel_mex(灰色,0.7);
  3. 要显示修改后的图像,请重新格式化矩阵edgeImMex与函数repmat这样你就可以把它传递给图片命令。

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

    这个图像与使用MATLAB函数创建的图像相同。

为sobel.m生成一个主函数示例

尽管您可以为应用程序编写自定义的main函数,但是示例main函数提供了一个模板来帮助您合并生成的代码。

为Sobel过滤器生成一个示例主函数:

  1. 为C静态库创建配置对象。

    cfg = coder.config('lib');

    对于C/ c++源代码、静态库、动态库和可执行文件的配置对象,设置GenerateExampleMain控制示例主要功能的生成。设置设置为“GenerateCodeOnly”默认情况下,它生成示例main函数,但不编译它。对于本例,不要更改GenerateExampleMain设置。

  2. 使用配置对象生成C静态库。

    codegen报告配置CFG.索贝尔

为静态库生成的文件在文件夹中codegen / lib /索贝尔.示例主文件在子文件夹中codegen / lib /索贝尔/例子

主文件示例的内容Main .c

复制示例主文件

不修改文件cmain.h例子子文件夹。如果你这样做了,当你重新生成代码时,MATLAB编码器不重新生成示例主文件。它会警告您它检测到生成文件的更改。

复制文件cmain.h从文件夹中codegen / lib /索贝尔/例子到另一个位置。对于本例,将文件复制到当前工作文件夹。修改新位置中的文件。

修改主功能生成示例

示例main函数声明并初始化数据(包括动态分配的数据)为零。它调用参数设为0的入口点函数,但不使用入口点函数返回的值。

C主要功能必须符合您申请的要求。此示例修改示例主要功能以满足Sobel过滤器应用程序的要求。

这个例子修改了这个文件c这样,Sobel过滤器应用程序:

  • 从二进制文件中读取灰度图像。

  • 采用Sobel滤波算法。

  • 将修改后的图像保存为二进制文件。

修改main函数

修改函数主要:

  • 接受包含灰度图像数据和阈值的文件作为输入参数。

  • 调用这个函数main_sobel以灰度图像数据流的地址和阈值作为输入参数。

在函数主要

  1. 删除声明空白(命令行参数个数)(空白)argv

  2. 声明的变量文件名保存包含灰度图像数据的二进制文件的名称。

    const char *文件名;
  3. 声明的变量阈值保持阈值。

    双阈值;
  4. 声明的变量FD.保存应用程序从中读取的灰度图像数据的地址文件名

    文件* fd;
  5. 加一个如果语句检查三个参数。

    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){退出(-1);}
  10. 替换函数调用main_sobel通过呼叫main_sobel输入参数FD.阈值

    main_sobel (fd,阈值);
  11. 调用后关闭灰度图像文件sobel_terminate.

    文件关闭(fd);

修改功能主要

修改初始化函数argInit_d1024xd1024_real_T

在示例主文件中,函数argInit_d1024xd1024_real_T为您传递给Sobel过滤器的图像创建动态分配的可变大小阵列(emxArray)。此函数将EMXARRAY初始化为默认大小,并且EMXARRAY的元素为0.返回初始化的EMXARRAY。

对于Sobel过滤器应用程序,修改函数以将灰度图像数据从二进制文件读入EmxArray。

在函数argInit_d1024xd1024_real_T

  1. 替换输入参数无效与参数文件* fd.该变量指向函数读入的灰度图像数据。

    静态emxarray_real_t * arginit_d1024xd1024_real_t(文件* fd)
  2. 更改变量的值IV2.来匹配灰度图像矩阵的维数灰色的IV2.保存emxArray的大小值argInit_d1024xd1024_real_T创造。

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

    MATLAB以列主要格式存储矩阵数据,而C以行主要格式存储矩阵数据。相应地声明尺寸。

  3. 定义一个变量元素保存从灰度图像数据中读入的值。

    双元素;
  4. 改变为了-loop构造,从标准化图像中读取数据点元素通过添加一个从文件中读向内指令为了循环。

    欺诈(&元素,1,尺寸(元素),fd);
  5. 为了循环,分配元素设置为emxArray数据的值。

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

修改初始化函数arginit_d1024xd1024_real_t

写入函数saveImage

Matlab功能sobel.m与MATLAB数组接口,但Sobel过滤器应用程序接口二进制文件。

要将Sobel Filtering算法修改的图像保存到二进制文件,请创建函数saveImage.功能saveImage将数据从emxArray写入二进制文件。它使用的构造与函数使用的构造相似argInit_d1024xd1024_real_T

在文件中c

  1. 定义的函数saveImage获取emxArray的地址edgeImage作为输入,输出类型为void。

    static void saveImage(emxArray_uint8_T *edgeImage) {}
  2. 定义的变量b_j0b_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){退出(-1);}
  6. 写一个嵌套为了-loop构造函数argInit_d1024xd1024_real_T

    For (b_j0 = 0;b_j0 < edgeImage - >大小[0 u];B_j0 ++) {for (b_j1 = 0;b_j1 < edgeImage - >大小[1 u];B_j1 ++) {}}
  7. 内部的内在的为了- 从修改的图像数据分配值元素

    元素= edgeImage->data[b_j0 + edgeImage->size[0] * b_j1];
  8. 作业完成后元素,写入值元素到文件edge.bin

    fwrite(&元素,1,sizeof(元素),fd);
  9. 为了循环构造,近FD.

    文件关闭(fd);

函数saveImage

修改main_sobel函数

在示例main函数中,该函数main_sobel为灰度和修改后的图像的数据创建emxArrays。它调用函数argInit_d1024xd1024_real_T初始化灰度图像的emxArray。main_sobel通过emxArrays和初始化函数的阈值0argInit_real_T返回函数索贝尔.当功能时main_sobel结束时,它将丢弃函数的结果索贝尔

对于Sobel过滤器应用程序,修改该函数main_sobel:

  • 以灰度图像数据的地址和阈值作为输入。

  • 使用从地址读取数据argInit_d1024xd1024_real_T

  • 将数据传递给带有阈值的Sobel滤波算法阈值

  • 使用以下命令保存结果saveImage

在函数main_sobel

  1. 用参数替换函数的输入参数文件* fd双阈值

    static void main_sobel(FILE *fd, double threshold)
  2. 传递输入参数FD.的函数调用argInit_d1024xd1024_real_T

    originalImage之下= argInit_d1024xd1024_real_T (fd);
  3. 替换函数调用中的阈值输入索贝尔阈值

    索贝尔(originalImage之下,阈值,edgeImage);
  4. 在调用函数之后索贝尔,调用函数saveImage与输入edgeImage

    SaptImage(eddeImage);

修改函数main_sobel.

修改函数声明

要匹配您对函数定义所做的更改,请对函数声明进行以下更改:

  1. 改变函数的输入* argInit_d1024xd1024_real_T文件* fd

    静态emxarray_real_t * arginit_d1024xd1024_real_t(文件* fd);
  2. 改变函数的输入main_sobel文件* fd双阈值

    static void main_sobel(FILE *fd, double threshold);
  3. 添加的功能saveImage

    静态void saptimage(emxarray_uint8_t * edgeImage);

修改函数声明

修改包含文件

用于输入/输出函数c,添加标题文件stdio . h到所包含的文件列表。

# include < stdio . h >

包括修改文件

修改文件内容c

c

生成Sobel Filter应用程序

  1. 如果您目前不在工作文件夹中,请导航到该工作文件夹。

  2. 为C独立可执行文件创建一个配置对象。

    cfg = coder.config(exe”);
  3. 使用配置对象和修改后的main函数为Sobel过滤器生成一个C独立的可执行文件。

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

默认情况下,如果你在Windows上运行MATLAB®平台,可执行sobel.exe在当前工作文件夹中生成。如果您在Windows以外的平台上运行MATLAB,则文件扩展名是该平台的相应扩展名。默认情况下,为可执行文件生成的代码在文件夹中codegen / exe /索贝尔

运行Sobel过滤器应用程序

  1. 创建MATLAB矩阵灰色的如果它目前不在你的MATLAB工作区:

    我= 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. 运行可执行文件,将文件传递给它灰色阈值为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);

    图像匹配的图像来自MATLAB和MEX函数。

相关的话题