主要内容

引入特征匹配和注册的代码生成

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

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

设置你的C编译器

要运行这个示例,您必须拥有C编译器的权限,并且必须使用'mex -setup'命令配置它。有关更多信息,请参见开始使用MATLAB编码器(MATLAB编码器)

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

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

墨西哥人可执行文件

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

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

独立的可执行文件

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

在“MATLAB编码器项目”对话框中,单击“确定”

您还可以使用

一个= coder.config (exe)

并将该对象传递给MATLAB命令行中的coder命令。当您创建一个独立的可执行文件时,您必须编写自己的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编码器C/C++代码生成支持的函数和对象金宝app(MATLAB编码器).有关受支持的语言构造的列表,金宝app请参见C/C++代码生成支持的MATLAB语言功能金宝app(MATLAB编码器)

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

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

运行仿真

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

%定义原始图像原始= imread (“cameraman.tif”);定义扭曲的图像通过调整大小,然后旋转原始图像规模= 0.7;J = imresize(original, scale);θ= 30;畸变=不旋转(J, theta);%调用生成的mex文件[matchedOriginalLoc, matchedDistortedLoc,...thetaRecovered,...scaleRecovered,恢复]=...visionRecovertformCodeGeneration_kernel(原始的、扭曲的);
scalereccovered = 0.701003 thetaRecovered = 30.235065

编译MATLAB函数到一个MEX文件

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

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

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

  • 数据类型uint8

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

运行生成的代码

[matchedOriginalLocCG, matchedDistortedLocCG,...thetaRecoveredCG, scaleRecoveredCG, recoveredCG] =...visionRecovertformCodeGeneration\u kernel\u mex(原始、扭曲);
scalereccovered = 0.701003 thetaRecovered = 30.235065

清理

清楚的visionRecovertformCodeGeneration_kernel_mex

比较Codegen和MATLAB代码

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

isequal(matchedOriginalLocCG, matchedOriginalLoc)
Ans = logical 1

附录

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