文档

从包含图像处理功能的应用程序生成代码

这个例子展示了如何使用MATLAB®编码器™来自MATLAB应用程序,使用图像处理工具箱™功能。本示例描述如何设置MATLAB环境,为代码生成准备MATLAB代码,以及如何解决在MATLAB代码中可能遇到的阻止代码生成的任何问题。

设置编译器

这个例子展示了如何指定要使用的C/ c++编译器MATLAB编码器生成代码。

使用墨西哥人函数与设置选项指定要使用的C/ c++编译器MATLAB编码器

墨西哥人设置
MEX配置为使用“Microsoft Visual c++ 2010 (C)”进行C语言编译。警告:MATLAB C和Fortran API已更改为支持超过2^32-1个元素的MATLAB变量。金宝app在不久的将来,您将需要更新您的代码以利用新的API。你可以在//www.tatmou.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html上找到更多信息。要选择不同的C编译器,请从以下选项中选择一个:Microsoft Visual c++ 2012 (C)墨西哥人设置:C: \ matlab \ bin \ win64 \ mexopts \ msvc2012.xml C英特尔c++作曲家XE 2013与微软Visual Studio 2012 (C)墨西哥人设置:C: \ matlab \ bin \ win64 \ mexopts \ intel_c_13_vs2012.xml C英特尔c++作曲家XE 2011与微软Visual Studio 2010 (C)墨西哥人设置:C: \ mexopts \ intel_c_12_vs2010.xml C英特尔c++作曲家XE 2013与微软Visual Studio 2010 (C)墨西哥人设置:C: \ matlab \ bin \ win64 \ mexopts \ intel_c_13_vs2010.xml C Microsoft Visual c++ 2010 (C)墨西哥人C:\MATLAB\R2015a\mex_C_win64.xml C如果要选择不同的语言,请从以下选项中选择一种:mex -setup c++ mex -setup FORTRAN mex -setup FORTRAN

生成代码

这个例子展示了如何从MATLAB代码生成C代码,其中包括图像处理工具箱函数使用MATLAB编码器.为了说明这个过程,本例使用的代码包括一些准备问题和构建问题,在生成代码之前必须克服这些问题。

将以下代码复制到一个文件中并保存,并为其命名cellDetectionMATLAB.m

函数BWfinal = cellDetectionMATLAB(I)cellDetectionMATLAB -使用图像分割检测细胞。[~, threshold] = edge(I,“索贝尔”);fudgeFactor = .5;BWs =边(I,“索贝尔”,阈值* fudgeFactor);图imshow(BWs)标题(二元渐变蒙版);Se90 = strel(“行”, 3, 90);Se0 = strel(“行”, 3,0);BWsdil = imdilate(BWs, [se90 se0]);图imshow(BWsdil)“膨胀梯度掩模”);BWdfill = imfill(BWsdil,“黑洞”);图imshow (BWdfill);标题(“填洞二值图像”);bwnoboard = imclearborder(BWdfill, 4);图imshow(bwnoboard)“已清除的边界图像”);seD = strel(“钻石”1);BWfinal = imerosion (bwnoboard,seD);BWfinal = imerosion (BWfinal,seD);图imshow(BWfinal)标题(“分割图像”);

使用示例图像测试示例代码。使用cell.tif文件,包括在图像处理工具箱中(matlab工具箱\ \ \ imdata \ cell.tif图像).

I = imread(“cell.tif”);Iseg = cellDetectionMATLAB(I);将原始图像和分割后的图像并排显示。Iseg imshowpair(我,“蒙太奇”

在生成C代码之前创建MATLAB代码的副本。因为您修改此代码是为了生成代码,所以最好使用副本。

拷贝文件(“cellDetectionMATLAB.m”“cellDetectionCodeGeneration.m”);

在MATLAB编辑器中打开生成版本函数的代码。作为第一步,将函数签名中的函数名更改为与文件名匹配,并添加MATLAB编码器编译指令% # codegen在函数签名的末尾。该指令指示MATLAB代码分析器诊断阻止成功生成代码的问题。

函数BWfinal = cellDetectionCodeGeneration(I)% # codegen……

打开MATLAB编码器在MATLAB中,选择“应用程序”选项卡,导航到“代码生成”,然后单击MATLAB编码器(或者,您也可以输入编码器在MATLAB命令提示符。)

指定入口点函数的名称,cellDetectionCodeGeneration,按输入

确定代码生成的准备情况。点击下一个(在编码器窗口的右下角)。MATLAB编码器识别可能阻止代码生成的任何问题。示例代码包含5个不支持的函数调用。金宝app

检查准备问题。点击审查问题.在报告中,MATLAB编码器在编辑窗口中显示带有下面列出的准备就绪问题的代码,标记使用imshow不支持代码生成的函数。金宝app

解决准备问题。删除对imshow以及示例中的相关显示代码。对于分割操作,display语句不是必需的。方法中编辑示例代码MATLAB编码器.删除代码后,单击保存以保存编辑并重新运行准备就绪检查。在重新运行就绪检查之后,MATLAB编码器显示了未发现问题消息。

定义函数输入的大小和数据类型。代码中的每个输入必须指定为固定大小、可变大小或常量。有几种方法可以指定输入参数的大小,但最简单的方法是通过给定MATLAB编码器一个调用函数的例子。在文本输入字段中输入调用函数的脚本。在本例中,输入以下代码并按下输入

I = imread(“cell.tif”);Iseg = cellDetectionCodeGeneration(I);

有关定义输入的详细信息,请参见MATLAB编码器文档。后MATLAB编码器返回带有输入类型定义的值,单击下一个

检查运行时问题。即使你做了MATLAB编码器准备就绪检查,在构建过程中可能会出现其他问题,从而阻止代码生成。就绪性检查检查功能依赖关系以确定就绪性,构建过程检查编码模式。您可以使用您输入的相同代码来定义输入类型(已预加载到对话框中)。点击检查问题

此示例包含一个构建问题:它传递了一个数组strel对象imdilate代码生成不支持对象数组。金宝app

处理确定的构建问题。对于本例,必须将调用修改为imdilate避免传递一个strel对象数组。这可以通过替换对的单个调用来实现imdilate有两个单独的调用imdilate每次调用都传递一个strel对象,如下图中突出显示。

重新运行测试构建,以确保您的更改解决了问题。点击检查问题.MATLAB Coder显示一条消息,声明没有检测到任何问题。现在可以生成代码了。点击下一个

选择您想要生成的代码类型并选择目标平台。MATLAB Coder可以生成C或c++源代码,MEX文件,静态库,共享库,或独立的可执行文件。对于生产硬件,您可以从许多选择中进行选择,包括ARM和英特尔处理器。对于本例,选择“源代码”,对于语言,保留C选择生产硬件为通用,设备类型为MATLAB主机。当选择MATLAB主机计算机时,MATLAB Coder将生成依赖于预编译的共享库的代码。“图像处理工具箱”函数使用共享库来保持性能优化。选择完成后,单击生成

生成的代码。当它完成时,MATLAB编码器显示生成的代码。

如果您选择了C/ c++动态库选项,MATLAB编码器生成以下接口。此接口可用于与外部应用程序集成:

类型codegen \ dll \ cellDetectionCodeGeneration \ cellDetectionCodeGeneration.h
/* * cellDetectionCodeGeneration.h * *函数'cellDetectionCodeGeneration'的代码生成* */ #ifndef __CELLDETECTIONCODEGENERATION_H__ #define __CELLDETECTIONCODEGENERATION_H__ /*包含文件*/ # Include  # Include  # Include  # Include  # Include "rtwtypes.h" # Include "cellDetectionCodeGeneration_types.h" /*函数声明*/ #ifdef __cplusplus extern "C" {#endif extern void cellDetectionCodeGeneration(const unsigned char I[30369],boolean_T BWfinal [30369]);#endif #endif /*代码生成结束(cellDetectionCodeGeneration.h

公开的函数签名表示有两个输入。第一个输入期望是一个无符号字符有30369个元素。这用于传递输入图像,对其执行单元格检测。MATLAB中输入图像的类型(uint8)表示为无符号字符.图像的大小为159 x 191,即30369个元素。元素的数量是通过接口指定的,因为输入被定义为固定大小。第二个输入BWfinal预计会是一个boolean_T有30369个元素。这是用来传递一个指向输出图像的指针。

注意,MATLAB和C在内存中存储数组的方式是不同的。MATLAB以列为主序存储数组,C以行为主序存储数组。为了说明这一点,考虑以下数组:

[1 2 3 4]

MATLAB将数组存储在内存中为[1 3 2 4]其中C存储元素为[1 2 3 4].在使用数组时,必须考虑到这种差异。

你也可以使用“C/ c++ executable”选项生成一个独立的可执行文件。在这种情况下,必须指定调用生成代码的主函数。请注意,没有现成的用于导入数据的实用程序。类中的“原子”模拟使用动态内存分配,请参阅MATLAB编码器文档。

点击下一个完成这个过程。MATLAB Coder显示关于它生成的内容的信息。默认情况下,MATLAB Coder创建一个codegen包含生成输出的工作文件夹中的子文件夹。有关生成代码的更多信息,请参见MATLAB编码器文档。

相关的话题

这个话题有用吗?