主要内容

在应用程序中使用一个示例C Main

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

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

先决条件

要完成此示例,请安装以下产品:s manbetx 845

  • MATLAB

  • MATLAB编码器™

  • C编译器(对于大多数平台,MATLAB提供了一个默认的C编译器)。有关支持的编译器列表,请参见万博1manbetx万博1manbetx支持编译器

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

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

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

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

sobel.m文件的内容

hello.jpg内容

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

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

  2. 导航到工作文件夹。

  3. 复制文件sobel.m而且hello.jpg从示例文件夹索贝尔到您的工作文件夹。

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

在图像上运行Sobel Filter

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

    我= imread (“hello.jpg”);
  2. 显示图像作为与索贝尔滤波结果比较的基础。

    图像(im);

  3. Sobel滤波算法作用于灰度图像。将彩色图像转换为具有标准化值的等效灰度图像(黑色为0.0,白色为1.0)。

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

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

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

生成并测试MEX函数

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

    codegen报告索贝尔

    codegen生成一个MEX函数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函数,但示例main函数提供了一个模板来帮助您合并生成的代码。

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

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

    cfg = coder.config (“自由”);

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

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

    codegen报告配置cfg索贝尔

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

示例主文件Main .c

复制示例主文件

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

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

修改生成的示例主函数

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

C main函数必须满足应用程序的要求。这个示例修改了示例main函数,以满足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(filename, "rb");
  9. 验证可执行文件是否可以打开文件名,写一如果的值时退出程序的-statementfd

    if (fd == NULL) {exit(-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(FILE *fd)
  2. 更改变量的值idx0而且idx1匹配灰度图像矩阵的尺寸灰色的.这些变量保存emxArray的尺寸的大小值argInit_d1024xd1024_real_T创建。

    Int idx0 = 484;Int idx1 = 648;

    MATLAB以列为主格式存储矩阵数据,而C以行为主格式存储矩阵数据。相应地声明维度。

  3. 的值emxCreate_real_T函数的图像大小。

    result = emxCreate_real_T(484, 648);
  4. 定义一个变量元素保存从灰度图像数据读入的值。

    双元素;
  5. 改变-循环构造从归一化图像读入数据点元素通过添加一个从文件中读通往内心的命令循环。

    Fread (&element, 1, sizeof(element), fd);
  6. 循环,分配元素为emxArray数据设置的值。

    Result ->data[idx0 + Result ->size[0] * idx1] = element;

修改初始化函数argInit_d1024xd1024_real_T

写函数saveImage

MATLAB函数sobel.m但Sobel过滤器应用程序与二进制文件接口。

要将Sobel滤波算法修改的图像保存到二进制文件中,请创建一个函数saveImage.这个函数saveImage将emxArray中的数据写入二进制文件。它使用的结构与函数使用的结构类似argInit_d1024xd1024_real_T

在文件中c

  1. 定义的函数saveImage它接受emxArray的地址edgeImage作为输入,并具有输出类型void。

    (emxArray_uint8_T *edgeImage) {}
  2. 定义的变量idx0而且idx1就像在函数中定义的一样argInit_d1024xd1024_real_T

    int idx;int idx1;
  3. 定义的变量元素存储从emxArray读取的数据。

    uint8_T元素;
  4. 打开二进制文件edge.bin用于写入修改后的图像。指定的地址edge.bin文件* fd

    FILE *fd = fopen("edge.bin", "wb");
  5. 验证可执行文件是否可以打开edge.bin,写一如果的值时退出程序的-statementfd

    if (fd == NULL) {exit(-1);}
  6. 写一个嵌套-循环构造就像函数中的那个argInit_d1024xd1024_real_T

    For (idx0 = 0;idx0 < edgeImage - >大小[0 u];Idx0 ++) {for (idx1 = 0;idx1 < edgeImage - >大小[1 u];Idx1 ++) {}}
  7. 内部的内在的-loop,将修改后的图像数据赋值给元素

    element = edgeImage->data[idx0 + edgeImage->size[0] * idx1];
  8. 在为元素,将值写入元素到文件edge.bin

    Fwrite (&element, 1, sizeof(element), 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 filter应用,请修改该函数main_sobel:

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

  • 从地址中读取数据argInit_d1024xd1024_real_T

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

  • 使用saveImage

在函数main_sobel

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

    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

    saveImage (edgeImage);

修改函数main_sobel

修改函数声明

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

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

    静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd);
  2. 改变函数的输入main_sobel文件* fd而且双阈值

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

    静态void saveImage(emxArray_uint8_T *edgeImage);

修改函数声明

修改包含文件

中使用的输入/输出函数c,添加头文件stdio . h到包含的文件列表。

# include < stdio . h >

包括修改文件

修改后的文件内容c

c

生成Sobel过滤器应用程序

  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. 运行可执行文件,将文件传递给它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);

    该图像与MATLAB和MEX函数生成的图像相匹配。

相关的话题