主要内容

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

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

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

先决条件

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

  • MATLAB

  • Matlab Coder™

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

    您可以使用mex-设置更改默认编译器。看更改默认编译器

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

本例中使用的文件包括:

文件名 文件类型 描述
sobel.m 功能代码 一种用MATLAB实现的Sobel滤波算法。sobel.m以图像(表示为双矩阵)和阈值作为输入。该算法基于阈值检测图像中的边缘。sobel.m返回显示边缘的修改图像。
你好,jpg 图像文件 Sobel过滤器修改的图像。

sobel.m .文件的内容

hello.jpg内容

要将示例文件复制到本地工作文件夹,请执行以下操作:

  1. 创建一个本地工作文件夹。例如,c:\coder\edge\u检测

  2. 导航到工作文件夹。

  3. 复制文件sobel.m你好,jpg从示例文件夹Sobel.到您的工作文件夹。

    COPYFILE(FullFile(Docroot,'工具箱''编码器'“例子”'sobel'))

在图像上运行Sobel过滤器

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

    Im = imread(“hello.jpg”);
  2. 显示图像作为与Sobel过滤器结果进行比较的基础。

    图像(im);

  3. Sobel过滤算法在灰度图像上运行。将彩色图像转换为具有归一化值的等效灰度图像(0.0为Black,1.0 for White)。

    灰色=(0.2989*double(im(:,:,1))+0.5870*double(im(:,:,2))+0.1140*double(im(:,:,3))/255;
  4. 要运行Sobel过滤器的MATLAB功能,请传递灰度图像矩阵灰色的以及函数的阈值Sobel..此示例使用0.7阈值。

    edgeim = Sobel(灰色,0.7);
  5. 要显示修改后的图像,请重新格式化矩阵edgeim与函数雷普马特所以你可以把它传递给图像命令。

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

生成和测试一个MEX函数

  1. 要测试生成的代码在功能上与原始MATLAB代码等价,并且不会出现运行时错误,请生成一个MEX函数。

    编码基因-报告Sobel.

    编码基因生成一个名为mex函数sobel_mex在当前工作文件夹中。

  2. 要运行Sobel过滤器的MEX函数,需要传递灰度图像矩阵灰色的以及函数的阈值sobel_mex.此示例使用0.7阈值。

    edgeImMex = sobel_mex(灰色,0.7);
  3. 要显示修改后的图像,请重新格式化矩阵埃杰默克斯与函数雷普马特所以你可以把它传递给图像命令。

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

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

为Sobel.M生成一个示例主函数

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

要生成Sobel过滤器的示例主函数,请执行以下操作:

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

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

    对于C / C ++源代码,静态库,动态库和可执行文件的配置对象,设置GenerateExampleMain控制示例主函数的生成。设置为'generatocodeonly'默认情况下,它生成示例主函数,但不编译它。对于本例,请不要更改GenerateExampleMain环境。

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

    编码基因-报告-Config.cfgSobel.

静态库的生成文件位于文件夹中codegen/lib/sobel. 示例主文件位于子文件夹中codegen/lib/sobel/examples

示例主文件main.c的内容

复制示例主文件

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

复制文件main.cmain.h从文件夹中codegen/lib/sobel/examples到另一个地方。对于此示例,将文件复制到当前工作文件夹。修改新位置中的文件。

修改生成的示例主函数

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

C主函数必须满足应用程序的要求。这个示例修改了示例主函数,以满足Sobel过滤器应用程序的要求。

此示例修改该文件main.c因此,Sobel过滤器应用程序:

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

  • 应用Sobel过滤算法。

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

修改函数main

修改函数主要:

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

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

在函数中主要

  1. 删除声明无效(argc)(空白)argv

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

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

    双阈值;
  4. 声明的变量fd持有应用程序读入的灰度图像数据的地址文件名

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

    如果(argc!=3) {printf(“应为2个参数:文件名和阈值\n”);退出(-1);}
  6. 指定输入参数argv [1]为包含灰度图像数据的文件文件名

    filename = argv [1];
  7. 指定输入参数argv [2]的阈值门槛,将输入从字符串转换为双精度数字。

    阈值= atof(argv [2]);
  8. 打开包含在中指定名称的灰度图像数据的文件文件名. 将数据流的地址分配给fd

    fd = fopen(文件名,“rb”);
  9. 以验证可执行文件是否可以打开文件名,写一篇如果- 如果值为价值,则退出程序fd无效的

    if(fd == null){exit(-1);}
  10. 替换for的函数调用索贝尔大街通过调用索贝尔大街与输入参数fd门槛

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

    fclose(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. 更改变量的值iv2匹配灰度图像矩阵的尺寸灰色的iv2保存要显示的emxArray尺寸的大小值argInit_d1024xd1024_real_T创建。

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

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

  3. 定义变量元素持有从灰度图像数据中读取的值。

    双元素;
  4. 改变-loop构造,从标准化图像中读取数据点元素通过添加一个弗瑞德命令到内心-循环。

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

    结果 - >数据[b_j0 +结果 - > size [0] * b_j1] =元素;

修改初始化函数argInit_d1024xd1024_real_T

写入函数saveImage

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

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

在文件中main.c

  1. 定义的函数保存图片获取emxArray的地址edgeImage.作为输入并具有输出类型空隙。

    静态void 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. 写一个嵌套-loop构造函数argInit_d1024xd1024_real_T

    for(b_j0 = 0; b_j0  size [0u]; b_j0 ++){for(b_j1 = 0; b_j1  size [1u]; b_j1 ++){}}
  7. 内部的内在的-loop,将修改后的图像数据赋值给元素

    元素=边缘图像->数据[b_j0+边缘图像->大小[0]*b_j1];
  8. 分配后元素,写入值元素到文件edge.bin

    fwrite(&元素,1,sizeof(元素),fd);
  9. 之后-loop构造,关闭fd

    fclose(FD);

功能救存器

修改函数main_sobel

在示例主函数中,功能索贝尔大街为灰度和修改后的图像的数据创建Emxarray。它调用函数argInit_d1024xd1024_real_T初始化灰度图像的emxArray。索贝尔大街通过emxArrays和初始化函数的阈值0真的吗返回函数Sobel..当这个函数索贝尔大街结束时,它将丢弃函数的结果Sobel.

对于Sobel过滤器应用程序,修改函数索贝尔大街:

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

  • 使用从地址读取数据argInit_d1024xd1024_real_T

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

  • 使用以下命令保存结果:保存图片

在函数中索贝尔大街

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

    静态void main_sobel(文件* FD,双阈值)
  2. 传递输入参数fd调用的函数argInit_d1024xd1024_real_T

    originalImage之下= argInit_d1024xd1024_real_T (fd);
  3. 的函数调用中输入的阈值Sobel.门槛

    索贝尔(originalImage之下,阈值,edgeImage);
  4. 调用函数后Sobel.,调用函数保存图片输入edgeImage.

    SaptImage(eddeImage);

修改函数main_sobel

修改函数声明

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

  1. 更改功能的输入*argInit_d1024xd1024_real_T文件*fd

    static emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd); / /配置文件
  2. 更改功能的输入索贝尔大街文件*fd双阈值

    静态void main_sobel(文件* FD,双阈值);
  3. 添加函数保存图片

    静态void saptimage(emxarray_uint8_t * edgeImage);

修改的函数声明

修改包含文件

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

#包括

修改的包含文件

修改文件内容main.c

main.c

生成Sobel过滤器应用程序

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

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

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

    编码基因-报告-Config.cfgSobel.main.cmain.h

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

运行Sobel过滤器应用程序

  1. 创建MATLAB矩阵灰色的如果当前不在MATLAB工作区中:

    Im = imread(“hello.jpg”);
    灰色=(0.2989*double(im(:,:,1))+0.5870*double(im(:,:,2))+0.1140*double(im(:,:,3))/255;
  2. 写出矩阵灰色的使用的是二进制文件福彭写入文件命令。应用程序读入这个二进制文件。

    fid = fopen (“gray.bin”' w '); fwrite(fid,灰色,“双”);fclose(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”);edrimimexe = fread(FD,尺寸(灰色),'uint8'); fclose(fd);
  2. 通过矩阵edgeImExe到这个功能雷普马特并显示图像。

    im3exe = repmat(edridimexe,[1 1 3]);图像(IM3EXE);

    图像与MATLAB和MEX函数匹配图像。

相关话题