1 转换

一般Matlab中的代码,有一部分方法是无法转换成C++的,例如图像化UI、文件写出等接口。一般做转换的话,需要把业务逻辑从界面中抽取出来,去除与界面相关的代码,把需要显示的值,作为函数的返回值。

1.1 转换例子

例如下面的例子,可以从中提取主要的业务逻辑代码:

提取前的源代码:

function varargout = untitled(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function untitled_OpeningFcn(hObject, eventdata, handles, varargin)

set(handles.Dimension,'String',''); % 属性纬度
set(handles.Numbers,'String',''); % 对象个数
set(handles.Clusters,'String',''); % 训练准确率
set(handles.RecNum,'String',''); % 识别对象

handles.output = hObject;

guidata(hObject, handles);

function varargout = untitled_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;
% 载入数据
function Load_Callback(hObject, eventdata, handles)
% 数据载入控制
global Myfig;
global Convfig;
global TrFig;
load('Fig.mat');
load('Oliver.mat');
bar = waitbar(0,'读取数据中...');
for i=1:100
    str=['训练中...',num2str(100*i/100),'%'];    % 百分比形式显示处理进程,不需要删掉这行代码就行
    waitbar(i/100,bar,str)                       % 更新进度条bar,配合bar使用
end
close(bar);  
Myfig = gRGB;
Convfig = gRGB1;
TrFig = gRGB2;
% data1 = Data1;
set(handles.Dimension,'String',num2str(size(FigData,2))); % 属性维度
set(handles.Numbers,'String',num2str(size(FigData,1))); % 对象个数
set(handles.Clusters,'String',[num2str(85.50),'%']);

function Exit_Callback(hObject, eventdata, handles)
delete(handles.figure1);
close all;

function Iteration_Callback(hObject, eventdata, handles)

function Dimension_Callback(hObject, eventdata, handles)

function Dimension_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function Numbers_Callback(hObject, eventdata, handles)

function Numbers_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function Clusters_Callback(hObject, eventdata, handles)

function Clusters_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
% 展示图片
function Perform_Callback(hObject, eventdata, handles)

cla reset
global Myfig;
global Convfig;
global TrFig;
Cope = get(handles.RecNum,'String');
   if isempty(Cope)
    pause(0.25);
    h=msgbox('请先选择识别对象(1-400)');
    uiwait(h,5);
   else
    TotG=uint8(Convfig{str2num(Cope)}); % 原始模型
    axes(handles.Net);
    imshow(TotG)
    hold on
    axes(handles.ObjFunction);
    TotG1=uint8(Myfig{str2num(Cope)}); % 改进模型
    imshow(TotG1)
    axes(handles.axes4);
    TotG2=uint8(TrFig{str2num(Cope)}); % 待检测模型
    imshow(TotG2)
    hold off
   end

function RecNum_Callback(hObject, eventdata, handles)

function RecNum_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

提取后的代码:

function [TotG, TotG1, TotG2]=t2(Cope)

oliver = coder.load('Oliver.mat'); 

Myfig = oliver.gRGB;
Convfig = oliver.gRGB1;
TrFig = oliver.gRGB2;

TotG=uint8(Convfig{Cope});
TotG1=uint8(Myfig{Cope});
TotG2=uint8(TrFig{Cope});

用于测试的示例代码:

clear all;
clc;
close all;

[TotG, TotG1, TotG2]=dealImage(3);

1.2 详细转换过程

这里转换用的MATLAB Coder,转换过程如下:

  • 1,使用如下功能进行转换; 在这里插入图片描述
  • 2,输入需要被转换的方法(如果该方法,还调用了其他方法,也只用填写这个主方法即可); 在这里插入图片描述
  • 3,输入测试用例方法(自动检测的数据类型,需要根据需要更改);

在这里插入图片描述 例如在另一个例子中,如果使用了自动检测的,就会爆出如下的错误:

在这里插入图片描述 这是改写前的数据类型:

在这里插入图片描述 这是改写后的数据类型: 在这里插入图片描述

  • 4,检测生成的c++代码; 在这里插入图片描述 5,选择生成的类型、语言、工具链,,Mores Setting可以设置配置的硬件;

在这里插入图片描述

2 注意事项

用于生成c++代码的matlab代码,要需要做一些改写。例如,预先定义变量。

这是原始版本:

indexc = find(Label==iii(1));
indexc = indexc(c);

Result1{1} = 'rank 1';
for i=2:length(indexc)+1
    Result1{i}=data1{indexc(i-1)};
end

这是改写后的版本:

Result1 = cell(dataSize,1);
dataSize=size(data,1);
    
for i=1:dataSize
   Result1{i}='000';
end

Result1{1} = 'rank 1';
for i=2:length(indexc)+1
   Result1{i}=data1{indexc(i-1)};
end

在这里插入图片描述

用生成c++代码时,用到的一些Matlab方法

在这里插入图片描述

在这里插入图片描述

3 实例

图像显示

矩阵信息显示

后续补充