主要内容

介绍带有特征匹配和注册的代码生成

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

这个例子需要MATLAB Coder许可证。

设置C编译器

要运行这个例子,你必须访问C编译器,并且必须使用'mex -setup'命令进行配置。有关更多信息,请参见开始使用MATLAB编码器(MATLAB编码器)

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

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

墨西哥人可执行文件

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

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

独立的可执行文件

如果将代码部署到另一个应用程序是目标,那么就需要一个独立的可执行文件。第一步是适当地配置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编码器所支持的功能。有关支持的命令列表,请参见MATLAB CoderC/ c++代码生成支持的函数和对象(MATLAB编码器).有关受支持的语言构造的列表,请参见支持C/ c++代码生成的MATLAB语言特性(MATLAB编码器)

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

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

运行仿真

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

%定义原始图像原始= imread (“cameraman.tif”);%定义扭曲的图像调整大小,然后旋转原始图像规模= 0.7;J = imresize(原始、规模);θ= 30;注意,不旋转时,图像逆时针方向旋转你指定一个正的旋转角度。。要顺时针旋转图像,%指定为负。扭曲= imrotate (J,θ);%调用生成的mex文件[matchedOriginalLoc, matchedDistortedLoc thetaRecovered scaleRecovered,...恢复]= visionRecovertformCodeGeneration_kernel(原始的、扭曲的);
scaleRecovered = 0.702550 thetaRecovered = 29.761583

编译MATLAB函数到MEX文件

现在使用的codegen(MATLAB编码器)函数将visionRecovertformCodeGeneration_kernel函数编译到一个mex文件中。您可以指定'-report'选项来生成一个编译报告,其中显示了在C代码生成期间创建的原始MATLAB代码和相关文件。您可能想要创建一个临时目录,在那里MATLAB Coder可以创建新文件。注意,生成的mex文件与附加了_mex的原始MATLAB文件具有相同的名称,除非您使用-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(原始的、扭曲的);
scalercovered = 0.702448 thetaRecovered = 29.908159

清理

清晰的visionRecovertformCodeGeneration_kernel_mex

比较Codegen和MATLAB代码

如上图所示,MATLAB和CODEGEN的恢复尺度和θ都在合理的容忍范围内。并且,匹配点是相同的,如下图所示:

isequal (matchedOriginalLocCG matchedOriginalLoc) isequal (matchedDistortedLocCG matchedDistortedLoc)
Ans =合乎逻辑的1

附录

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

Baidu
map