介绍代码生成与特征匹配和注册

这个例子说明了如何使用MATLAB®编码器™生成C代码的MATLAB文件。这个例子说明如何修改由使用MATLAB代码自动化特性匹配例如使得其被支撑用于码生成。金宝app这个例子突出了一些代码生成的总体要求,以及一些你必须准备MATLAB代码的具体行动。一旦MATLAB代码准备代码生成,您使用codegen命令生成相应的C-MEX功能。最后,为了验证效果,例如向您展示如何运行MATLAB生成的C-MEX功能,其输出与MATLAB代码的输出比较。

这个示例需要MATLAB编码器许可证。

设置你的C编译器

要运行这个例子,你必须能够访问一个C编译器,您必须使用“MEX -setup”命令进行配置。欲了解更多信息,请参阅设置您的C编译器

决定是在MATLAB下运行还是作为一个独立的应用程序运行

生成的代码可以作为C-MEX文件在MATLAB环境中运行,也可以作为独立的可执行文件或与另一个独立可执行文件链接的共享实用程序在MATLAB环境中运行。有关设置代码生成选项的详细信息,请参阅codegen命令。

墨西哥人可执行文件

这个例子生成一个可执行MEX MATLAB环境内部运行。

生成在MATLAB中运行的C-MEX可执行文件也可以是最终生成独立代码的工作流中的重要的第一步。mex -文件的输入和输出可以在MATLAB环境中进行检查,在MATLAB环境中可以使用可视化和其他类型的工具进行验证和分析。您还可以选择以生成的C代码或通过MATLAB引擎运行单个命令。若要通过MATLAB运行,请将相关命令声明为外在的,这意味着当需要运行该特定命令生成的代码将重新进入MATLAB环境。这是在案件有用的任一个孤立的命令还没有代码生成支持,或者如果你想不生成代码中嵌入特定的命令(如绘图命令)。金宝app

独立的可执行文件

如果目标是将代码部署到另一个应用程序,那么将需要一个独立的可执行文件。第一步是适当地配置MATLAB编码器。例如,告诉它您想要一个独立的可执行文件的一种方法是使用MATLAB Coder IDE创建一个MATLAB编码器项目,并将该项目配置为生成一个模块或可执行文件。可以使用Generate页面上的Build type小部件中的C/ c++静态库或C/ c++可执行选项来实现这一点。这个IDE是可用的导航如下:

-单击“应用程序”选项卡-向下滚动到“MATLAB编码器”-在“MATLAB编码器项目”对话框中,单击“确定”

您还可以使用定义配置对象

一个= coder.config( 'EXE')

以及对象传递到MATLAB命令行上的译码器命令。当你创建一个独立的可执行文件,你必须写自己的main.c(或main.cpp中)。请注意,当你创建一个独立的可执行文件,也有导入或导出的可执行文件和MATLAB环境之间的数据没有现成的工具。其中一个选项是使用“负载-ascii”与您的文件用printf / fprintf中的文件(在你的手写main.c中),然后将数据导入到MATLAB。

打出来的算法的计算部分到一个单独的功能的MATLAB

MATLAB编码器需要MATLAB代码是在一个函数的形式,以产生C语言代码。请注意,它通常是没有必要生成C代码对所有问题的MATLAB代码。通常希望将代码分离成主计算部,从该C代码生成是所需的,和一个线束或驱动程序,它不需要生成C代码 - 代码将在MATLAB运行。线束可以含有可视化和其他核查助剂是不实际被测系统的一部分。对于本实施例的主算法的代码驻留在一个调用的函数visionRecovertformCodeGeneration_kernel.m

如前所述重新架构了代码之后,您必须检查代码的其余部分是否使用了MATLAB编码器支持的功能。金宝app有关受支持的命令的列表,请参金宝app见MATLAB Coder文档。有关受支持的语言构造的列表,金宝app请参阅MATLAB语言功能支持C / C ++代码生成金宝app

在包含主算法的函数中提供MATLAB编码器不支持的有限的可视化或其他功能,这可能会很方便,我们希望编译这些功能。金宝app在这些情况下,您可以将这些项声明为“外部的”(使用code . extr)。只有在将C代码生成到MATLAB mex文件中,并且这些函数将在解释的MATLAB模式下实际运行时,才有可能实现这种功能。如果生成用于独立使用的代码,那么外部函数要么被忽略,要么生成错误,这取决于代码生成引擎是否确定它们会影响结果。因此,必须对代码进行适当的架构设计,以便在最终需要独立的可执行文件时,外部函数不会对相关代码产生重大影响。

最初的示例使用showMatchedFeatures和imshowpair例程来可视化结果。这些例程被提取到一个新函数中featureMatchingVisualization_extrinsic.m。这个函数声明外在的。

运行仿真

内核文件visionRecovertformCodeGeneration_kernel.m有两个输入参数。第一个输入是原始图像,第二个输入是被旋转和缩放扭曲的图像。

%定义原始图像原始= imread ('cameraman.tif');通过调整大小然后旋转原始图像来定义失真图像标度= 0.7;J = imresize(原始的,尺度);THETA = 30;扭曲= imrotate(J,THETA);调用生成的mex文件[matchedOriginalLoc, matchedDistortedLoc,thetaRecovered,scaleRecovered,回收] =visionRecovertformCodeGeneration_kernel(原始的、扭曲的);
scaleRecovered = 0.701003 thetaRecovered = 30.235065

将MATLAB函数编译成一个MEX文件

现在使用的代码生成功能编译visionRecovertformCodeGeneration_kernel功能成MEX文件。你可以指定“-report”选项生成编译报告显示原始MATLAB代码并进行了C代码生成过程中产生的相关的文件。您可能希望创建一个临时目录,MATLAB编码器可以创建新的文件。注意,生成的MEX文件具有相同的名称与_mex原来的MATLAB文件附加,除非你使用-o选项来指定可执行文件的名称。

MATLAB编码器要求您指定所有输入参数的属性。一种简单的方法是使用-args选项在命令行通过示例定义输入属性。有关更多信息,请参见输入规格。由于输入visionRecovertformCodeGeneration_kernel.m是一对图像,我们定义这两个输入具有以下属性:

  • 上限[10001000]的运行时可变大小

  • 数据类型uint8

定义输入图像的属性imageTypeAndSize = coder.typeof(UINT8(0),[1000 1000],[真真]);compileTimeInputs = {imageTypeAndSize,imageTypeAndSize};codegenvisionRecovertformCodeGeneration_kernel.m-报告arg游戏compileTimeInputs;
代码生成成功:打开(“codegen\mex\visionRecovertformCodeGeneration_kernel\html\report.mldatx”)查看报告。

运行生成的代码

[matchedOriginalLocCG,matchedDistortedLocCG,thetaRecoveredCG,scaleRecoveredCG,recoveredCG] =visionRecovertformCodeGeneration_kernel_mex(原始的、扭曲的);
scaleRecovered = 0.701003 thetaRecovered = 30.235065

清理

清晰的visionRecovertformCodeGeneration_kernel_mex;

比较代码生成的MATLAB代码

如上图所示,MATLAB和CODEGEN恢复的scale和theta都在合理的公差范围内。此外,匹配的点是相同的,如下图所示:

isequal(matchedOriginalLocCG, matchedOriginalLoc) isequal(matchedtedloccg, matchedtedloc)
ans = logical 1

附录

本例中使用了以下辅助函数。