使用 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 R2017a
和Microsoft 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)