使用 MATLAB coder 将代码从 Registration Estimator 应用程序导出到 C++

Posted

技术标签:

【中文标题】使用 MATLAB coder 将代码从 Registration Estimator 应用程序导出到 C++【英文标题】:Using MATLAB coder to export code from Registration Estimator app to C++ 【发布时间】:2017-06-21 10:37:24 【问题描述】:

您好,我正在尝试使用MATLAB Coder 工具将 MATLAB 中的 Registration Estimator 应用程序自动生成的“默认代码”导出到 C++。

这是我今天生成的示例代码:

function [MOVINGREG] = registerImages(MOVING,FIXED)
%registerImages  Register grayscale images using auto-generated code from Registration Estimator app.
%  [MOVINGREG] = registerImages(MOVING,FIXED) Register grayscale images
%  MOVING and FIXED using auto-generated code from the Registration
%  Estimator App. The values for all registration parameters were set
%  interactively in the App and result in the registered image stored in the
%  structure array MOVINGREG.

% Auto-generated by registrationEstimator app on 21-Jun-2017
%-----------------------------------------------------------


% Convert RGB images to grayscale
FIXED = rgb2gray(FIXED);
MOVING = rgb2gray(MOVING);

% Default spatial referencing objects
fixedRefObj = imref2d(size(FIXED));
movingRefObj = imref2d(size(MOVING));

% Intensity-based registration
[optimizer, metric] = imregconfig('monomodal');
optimizer.GradientMagnitudeTolerance = 1.00000e-04;
optimizer.MinimumStepLength = 1.00000e-05;
optimizer.MaximumStepLength = 6.25000e-02;
optimizer.MaximumIterations = 100;
optimizer.RelaxationFactor = 0.500000;

% Align centers
fixedCenterXWorld = mean(fixedRefObj.XWorldLimits);
fixedCenterYWorld = mean(fixedRefObj.YWorldLimits);
movingCenterXWorld = mean(movingRefObj.XWorldLimits);
movingCenterYWorld = mean(movingRefObj.YWorldLimits);
translationX = fixedCenterXWorld - movingCenterXWorld;
translationY = fixedCenterYWorld - movingCenterYWorld;

% Coarse alignment
initTform = affine2d();
initTform.T(3,1:2) = [translationX, translationY];

% Apply transformation
tform = imregtform(MOVING,movingRefObj,FIXED,fixedRefObj,'similarity',optimizer,metric,'PyramidLevels',3,'InitialTransformation',initTform);
MOVINGREG.Transformation = tform;
MOVINGREG.RegisteredImage = imwarp(MOVING, movingRefObj, tform, 'OutputView', fixedRefObj, 'SmoothEdges', true);

% Store spatial referencing object
MOVINGREG.SpatialRefObj = fixedRefObj;

end

Run-Time Issues 部分的编码器工具中,我收到了几个问题,例如该编码器需要declare the extrinsic。到现在为止还挺好。例如,我添加了:coder.extrinsic('imregconfig'); coder.extrinsic('optimizer');。但我仍然收到如下错误:

尝试从“mxArray”中提取字段“GradientMagnitudeTolerance”。

尝试从“mxArray”中提取字段“MinimumStepLength”。

尝试从“mxArray”中提取字段“MaximumStepLength”。

...

指向带有optimizer.GradientMagnitudeTolerance = 1.00000e-04;(及以下)的行。

我发现通常缺少变量的初始化。但我不知道如何提前初始化属性optimizer.GradientMagnitudeTolerance。谁能帮我解决这个问题?

PS:我正在使用MATLAB R2017aMicrosoft Visual C++ 2017 (C) 编译器

【问题讨论】:

【参考方案1】:

根据https://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation--categorical-list.html#bsl0arh-1 处代码生成支持的函数列表,imregconfig 不支持代码生成。这解释了你首先遇到的问题。添加 coder.extrinsic 意味着 MATLAB Coder 生成的文件将调用 MATLAB 来运行该函数。您只能对需要运行 MATLAB 的 mex 目标执行此操作。 imregconfig 不会生成任何 C 代码。使用此代码无法从外部应用程序生成独立的 C 代码。

当声明为 coder.extrinsic 的函数调用 MATLAB 时,它们会返回一个 mxArray。其余代码只能通过将它传递给 MATLAB 来处理这个 mxArray,即类似的外部函数。从 Coder 的角度来看,这些是不透明类型,因此尝试从 mxArray 中提取字段时会出错。

【讨论】:

嗯,这很糟糕:/您是否建议任何其他方式在 matlab IDE 的“外部”使用此代码? 您可以尝试使用 MATLAB 编译器来编译此代码并创建一个独立的可执行文件。这将在 MATLAB 之外运行。

以上是关于使用 MATLAB coder 将代码从 Registration Estimator 应用程序导出到 C++的主要内容,如果未能解决你的问题,请参考以下文章

使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串

使用 Matlab Coder 将 Matlab m 文件转换为 C/C++ 代码,包括 mex 文件 (mxArray)

无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码

MATLAB Coder 函数在 2014a 中未定义

如何给matlab coder装license

具有外部 C++ 函数的 Matlab:coder.ceval 将结构传递给函数