主要内容

使用特征匹配和注册的代码生成介绍

这个例子展示了如何使用MATLAB®Coder™为MATLAB文件生成C代码。实例说明了如何修改所使用的MATLAB代码使用自动特征匹配查找图像旋转和缩放示例,以支持代码生成。金宝app该示例强调了代码生成的一些一般要求,以及准备MATLAB代码时必须采取的一些具体操作。一旦MATLAB代码准备好代码生成,您就可以使用codegen(MATLAB编码器)命令生成C-MEX函数。最后,为了验证结果,该示例向您展示了如何在MATLAB中运行生成的C-MEX函数,并将其输出与MATLAB代码的输出进行比较。

本例需要MATLAB Coder许可证。

设置C编译器

要运行此示例,您必须能够访问C编译器,并且必须使用'mex -setup'命令对其进行配置。有关更多信息,请参见开始使用MATLAB编码器(MATLAB编码器)

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

生成的代码可以在MATLAB环境中作为C-MEX文件运行,也可以在MATLAB环境外作为独立可执行文件或共享实用程序运行,以链接到另一个独立可执行文件。方法的-config选项,以获得有关设置代码生成选项的详细信息codegen(MATLAB编码器)命令。

墨西哥人可执行文件

这个示例生成一个要在MATLAB环境中运行的MEX可执行文件。

生成一个在MATLAB中运行的C-MEX可执行文件也可以是最终产生独立代码的工作流中很好的第一步。墨西哥文件的输入和输出可以在MATLAB环境中检查,其中可视化和其他类型的验证和分析工具是现成的。您还可以选择作为生成的C代码或通过MATLAB引擎运行单个命令。要通过MATLAB运行,将相关命令声明为coder.extrinsic(MATLAB编码器),这意味着生成的代码在需要运行特定命令时将重新进入MATLAB环境。如果某个单独的命令还不支持代码生成,或者您希望嵌入某些不生成代码的命令(例如plot命令),这将非常有用。金宝app

独立的可执行文件

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

-单击APPS选项卡-向下滚动到MATLAB Coder -在MATLAB Coder项目对话框中,单击确定

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

一个= coder.config (exe)

并将该对象传递给MATLAB命令行的编码器命令。当您创建一个独立的可执行文件时,您必须编写自己的main.c(或main.cpp)。请注意,在创建独立的可执行文件时,没有现成的实用程序用于在可执行文件和MATLAB环境之间导入或导出数据。其中一个选项是使用printf/fprintf到一个文件(在手写的main.c中),然后使用'load -ascii'将数据导入到MATLAB中。

将算法的计算部分分解为一个单独的MATLAB函数

MATLAB Coder要求MATLAB代码以函数的形式生成C代码。请注意,通常没有必要为所讨论的所有MATLAB代码生成C代码。通常需要将代码分离为主要计算部分(需要从中生成C代码)和不需要生成C代码的线束或驱动程序(这些代码将在MATLAB中运行)。该工具可能包含可视化和其他验证辅助,这些辅助实际上不是被测系统的一部分。本例中主要算法的代码驻留在一个名为visionRecovertformCodeGeneration_kernel

一旦代码按照上面所述重新架构,您必须检查其余代码是否使用了MATLAB编码器支持的功能。金宝app有关支持的命令列表,请参阅M金宝appATLAB CoderC/ c++代码生成支持的函数和对象金宝app(MATLAB编码器).有关受支持的语言构造的列表,金宝app请参见支持C/ c++代码生成的MATLAB语言特性金宝app(MATLAB编码器)

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

原始示例使用showMatchedFeatures和imshowpair例程来显示结果。这些例程被提取为一个新函数featureMatchingVisualization_extrinsic.这个函数被声明为外部函数。

运行模拟

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

%定义原始图像原文= imread(“cameraman.tif”);%定义扭曲图像通过调整大小,然后旋转原始图像量表= 0.7;J = imresize(original,scale);Theta = 30;注意,imrotate旋转图像在逆时针方向你指定一个正的旋转角度。。为了顺时针旋转图像,%指定-。扭曲= imrotate(J,-theta);调用生成的mex文件[matchedOriginalLoc, matchedDistortedLoc thetaRecovered scaleRecovered,...恢复]= visionRecovertformCodeGeneration_kernel(原始,扭曲);
scalerrecovered = 0.702550 thetaRecovered = 29.761583

将MATLAB函数编译成MEX文件

现在使用codegen(MATLAB编码器)函数,将visionRecovertformCodeGeneration_kernel函数编译成一个墨西哥文件。您可以指定'-report'选项来生成一个编译报告,其中显示原始MATLAB代码和在C代码生成期间创建的相关文件。您可能想要创建一个临时目录,MATLAB Coder可以在其中创建新文件。注意,生成的mex -文件与原始MATLAB文件具有相同的名称,附加了_mex,除非使用-o选项指定可执行文件的名称。

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

  • 运行时大小可变,上限为[1000 1000]

  • 数据类型uint8

定义输入图像的属性imageTypeAndSize = code .typeof(uint8(0),[1000 1000],[true true]);compileTimeInputs = {imageTypeAndSize,imageTypeAndSize};codegenvisionRecovertformCodeGeneration_kernel.m报告arg游戏compileTimeInputs;
要查看报告,打开('codegen/mex/visionRecovertformCodeGeneration_kernel/html/report.mldatx')

运行生成的代码

[matchedOriginalLocCG, matchedDistortedLocCG,...thetaRecoveredCG、scaleRecoveredCG recoveredCG] =...visionRecovertformCodeGeneration_kernel_mex(原始的、扭曲的);
scalerrecovered = 0.702448 thetaRecovered = 29.908159

清理

清晰的visionRecovertformCodeGeneration_kernel_mex;

比较Codegen与MATLAB代码

如上所示,MATLAB和CODEGEN的恢复尺度和theta都在合理的公差范围内。匹配点完全相同,如下图所示:

isequal (matchedOriginalLocCG matchedOriginalLoc) isequal (matchedDistortedLocCG matchedDistortedLoc)
Ans = logical 1 Ans = logical 1

附录

本例中使用了以下helper函数。