主要内容

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

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

这个例子展示了如何生成和修改主要功能,您可以使用一个例子,当你建立可执行。

先决条件

完成这个示例中,安装以下产品:下载188bet金宝搏

  • MATLAB

  • MATLAB编码器™

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

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

创建一个文件夹,复制有关文件

在本例中使用的文件:

文件名称 文件类型 描述
sobel.m 函数代码 Sobel过滤算法的MATLAB实现。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过滤算法作用于灰度图像。将彩色图像转换为一个等价的灰度图像归一化值(1.0 0.0黑色、白色)。

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

    edgeIm =索贝尔(灰色,0.7);
  5. 显示修改后的形象,重新格式化的矩阵edgeIm与函数repmat这样你就可以通过它图像命令。

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

生成并测试一个墨西哥人的功能

  1. 测试生成的代码的功能相当于原始MATLAB代码和运行时错误不发生,生成一个墨西哥人的功能。

    codegen报告索贝尔

    codegen生成一个墨西哥人命名函数sobel_mex在当前工作目录中。

  2. Sobel过滤器的墨西哥人函数运行,通过灰度图像矩阵灰色的和阈值函数sobel_mex。这个示例使用阈值0.7。

    edgeImMex = sobel_mex(灰色,0.7);
  3. 显示修改后的形象,重新格式化的矩阵edgeImMex与函数repmat这样你就可以通过它图像命令。

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

    这张图片是一样的使用MATLAB函数创建的图像。

为sobel.m生成一个例子的主要功能

虽然您可以编写一个定制的主要功能为您的应用程序,主要功能提供了一个例子一个模板来帮助您将生成的代码。

生成一个例子Sobel过滤器的主要功能:

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

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

    配置对象的C / c++源代码,静态库,动态库和可执行文件,设置GenerateExampleMain控制生成示例的主要功能。设置被设置“GenerateCodeOnly”默认情况下,生成的例子主要功能但不编译它。对于这个示例,不改变的价值GenerateExampleMain设置。

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

    codegen报告配置cfg索贝尔

静态库的生成的文件在文件夹中codegen / lib /索贝尔。这个例子主要子文件夹中的文件codegen / lib /索贝尔/例子

内容示例c主要文件

复制的例子主要文件

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

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

修改生成的主要功能

这个例子主要功能声明并初始化数据,包括动态分配数据,为零值。它调用入口点函数与参数设置为零值,但它不使用入口点函数返回的值。

C主要功能必须满足您的应用程序的需求。这个示例修改的例子主要功能满足需求Sobel过滤应用程序。

这个示例修改文件c所以Sobel过滤器的应用程序:

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

  • 应用Sobel过滤算法。

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

修改功能主要

修改函数主要:

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

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

在函数主要:

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

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

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

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

    文件* fd;
  5. 添加一个如果声明,检查三个参数。

    如果(命令行参数个数! = 3){printf("预计2参数:文件名和阈值\ n”);退出(1);}
  6. 指定输入参数argv [1]文件包含灰度图像数据文件名

    文件名= argv [1];
  7. 指定输入参数argv [2]的阈值阈值,将输入从一个字符串转换为一个数字翻倍。

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

    fd = fopen(文件名,rb);
  9. 确认可执行文件可以打开文件名,写一如果声明退出程序的价值fd

    如果(fd = = NULL){退出(1);}
  10. 替换的函数调用main_sobel通过调用main_sobel与输入参数fd阈值

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

    文件关闭(fd);

修改功能主要

修改初始化函数argInit_d1024xd1024_real_T

在主文件的例子中,函数argInit_d1024xd1024_real_T创建一个动态分配的适应可变数组(emxArray)传递给Sobel过滤器的图像。该函数初始化emxArray默认大小和emxArray的元素为0。它将返回emxArray初始化。

Sobel过滤应用程序,修改函数读取灰度图像数据从emxArray二进制文件。

在函数argInit_d1024xd1024_real_T:

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

    静态emxArray_real_T * argInit_d1024xd1024_real_T(文件* fd)
  2. 改变变量的值idx0idx1灰度图像矩阵的尺寸相匹配灰色的。这些变量持有emxArray的尺寸的大小值argInit_d1024xd1024_real_T创建。

    int idx0 = 484;int idx1 = 648;

    MATLAB矩阵数据存储在列为主的格式,而C存储矩阵中的数据行存储格式。申报相应的尺寸。

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

    结果= emxCreate_real_T (484、648);
  4. 定义一个变量元素持有从灰度图像数据中读取的值。

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

    从文件中读(元素1 sizeof(元素),fd);
  6. 循环,分配元素作为emxArray数据值集。

    结果- >数据大小[0]- > [idx0 +结果* idx1] =元素;

修改初始化函数argInit_d1024xd1024_real_T

写函数saveImage

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

索贝尔的保存已修改的图像滤波算法的二进制文件,创建一个函数saveImage。这个函数saveImage写数据从一个emxArray到一个二进制文件中。它使用一个类似的建筑使用的一个函数argInit_d1024xd1024_real_T

在文件中c:

  1. 定义的函数saveImage这需要emxArray的地址edgeImage作为输入和输出类型无效。

    静态孔隙saveImage (emxArray_uint8_T * edgeImage) {}
  2. 定义的变量idx0idx1好像是在函数中定义的argInit_d1024xd1024_real_T

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

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

    文件* fd = fopen(”优势。本”、“白平衡”);
  5. 确认可执行文件可以打开edge.bin,写一如果声明退出程序的价值fd

    如果(fd = = NULL){退出(1);}
  6. 写一个嵌套循环结构的函数argInit_d1024xd1024_real_T

    (idx0 = 0;idx0 < edgeImage - >大小[0 u];idx0 + +) {(idx1 = 0;idx1 < edgeImage - >大小[1 u];idx1 + +) {}}
  7. 内部的内在的循环,分配的值修改图像数据元素

    元素= edgeImage - >数据[idx0 + edgeImage[0] - >大小* idx1);
  8. 赋值后元素,写的价值元素到文件edge.bin

    写入文件(元素1 sizeof(元素),fd);
  9. 循环构造,近fd

    文件关闭(fd);

函数saveImage

修改函数main_sobel

主要功能的示例中,这个函数main_sobel为数据创建emxArrays灰度和修改图像。它调用的函数argInit_d1024xd1024_real_T初始化的emxArray灰度图像。main_sobel通过emxArrays和阈值(0),初始化函数argInit_real_T返回的函数索贝尔。当这个函数main_sobel结束,它丢弃函数的结果索贝尔

Sobel过滤应用程序,修改功能main_sobel:

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

  • 读取数据的地址使用argInit_d1024xd1024_real_T

  • 将数据传递给索贝尔与阈值滤波算法阈值

  • 保存结果使用saveImage

在函数main_sobel:

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

    静态孔隙main_sobel(文件* fd,双阈值)
  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(文件* fd);
  2. 改变函数的输入main_sobel文件* fd双阈值

    静态孔隙main_sobel(文件* fd,双阈值);
  3. 添加的功能saveImage

    静态孔隙saveImage (emxArray_uint8_T * edgeImage);

修改函数声明

修改包含文件

你使用的输入/输出功能c,添加头文件stdio . h包含的文件列表。

# include < stdio . h >

包括修改文件

修改文件的内容c

c

生成Sobel过滤应用程序

  1. 导航到工作目录中如果你不现在。

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

    cfg = coder.config (exe”);
  3. Sobel C生成一个独立的可执行的过滤器使用配置对象和修改后的主要功能。

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

默认情况下,如果你是在Windows上运行MATLAB®平台,可执行sobel.exe在当前工作目录中生成。如果您正在运行MATLAB Windows以外的一个平台上,该平台的文件扩展名是相应的扩展。默认情况下,生成的代码的可执行文件的文件夹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。

    在MATLAB在Windows平台上运行示例:

    系统(索贝尔。exe灰色。本0.7”);

    可执行生成的文件edge.bin

显示的图像

  1. 读取文件edge.bin成一个MATLAB矩阵edgeImExe使用打开外部文件从文件中读命令。

    fd = fopen (“edge.bin”,“r”);edgeImExe =从文件中读(fd、大小(灰色)“uint8”);文件关闭(fd);
  2. 通过矩阵edgeImExe的函数repmat并显示图像。

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

    MATLAB的图像与图像匹配和墨西哥人功能。

相关的话题