zoukankan      html  css  js  c++  java
  • MATLAB GUI程序打包成.exe的方法流程和注意事项

    Matlab GUI程序打包成.exe的功能,对Matlab GUI程序而言,无疑是一种解脱。

    比如,重在算法设计和数据测试的自动驾驶ADAS感知系统。

    流程

    第一步:打开编译工具

    在Matlab命令窗口,输入 deploytool函数。

    deploytool

    出现application Compiler 窗口,如下图

    第二步:设置编译信息

    在这里,可以设置多类信息:

    A GUI程序信息

    毕竟要为GUI程序,打包成.exe文件。需要GUI程序信息,包括GUI主程序,

    B 软件信息

    目标.exe文件的封面、作者联系信息、软件功能描述

    C GUI程序的支持包

    这是非常重要的支持信息。Matlab工具箱集合非常强大,便于程序开发,但是在打包过程中,也就需要把支持包,都要打包附带。

    D 设置目标.exe文件打包后的存储路径

    E 软件执行所依赖的所有文件和文件夹

     

    第三步:设置打包方式

    这里打包方式,取决于Matlab Runtime的来源设置。

    A 来自Web

    打包速度快,体积小。用户得到.exe文件后,安装时,需要下载Matlab runtime,占用时间。

    B 打包者,下载,并入到打包后的文件中

    打包速度慢,但是用户根据简单提示,就能安装使用.exe文件。

    最后,点击Package,执行打包过程

    执行完成之后,得到系统提示。

     1 for_redistribution
     2 ----MyAppInstaller_web.exe
     3 for_redistribution_files_only
     4 ----myCameraGUI.exe
     5 ----readme.txt
     6 ----splash.png
     7 for_testing
     8 ----mccExcludedFiles.log
     9 ----myCameraGUI.exe
    10 ----readme.txt
    11 ----requiredMCRProducts.txt
    12 ----splash.png

    这是打包输出后的文件目录。

    当用户电脑有对应版本的Matlab Runtime时,只需要运行 for_testing 文件夹中的文件。

    如果没有,就需要for_redistribution文件夹中的文件,安装Matlab Runtime。

    案例

    第一个:基于USB镜头的实时影像获取与显示

    编译方式: Web式打包

    源代码:

     1 function varargout = myCameraGUI(varargin)
     2 gui_Singleton = 1;
     3 gui_State = struct('gui_Name',       mfilename, ...
     4                    'gui_Singleton',  gui_Singleton, ...
     5                    'gui_OpeningFcn', @myCameraGUI_OpeningFcn, ...
     6                    'gui_OutputFcn',  @myCameraGUI_OutputFcn, ...
     7                    'gui_LayoutFcn',  [] , ...
     8                    'gui_Callback',   []);
     9 if nargin && ischar(varargin{1})
    10     gui_State.gui_Callback = str2func(varargin{1});
    11 end
    12 
    13 if nargout
    14     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    15 else
    16     gui_mainfcn(gui_State, varargin{:});
    17 end
    18 
    19 function myCameraGUI_OpeningFcn(hObject, eventdata, handles, varargin)
    20 
    21 handles.output = hObject;
    22 
    23 handles.video = videoinput('winvideo', 1);
    24 set(handles.video,'TimerPeriod', 0.05, ...
    25 'TimerFcn',['if(~isempty(gco)),'...
    26 'handles=guidata(gcf);'... % Update handles
    27 'image(getsnapshot(handles.video));'... % Get picture using GETSNAPSHOT and put it into axes using IMAGE
    28 'set(handles.cameraAxes,''ytick'',[],''xtick'',[]),'... % Remove tickmarks and labels that are inserted when using IMAGE
    29 'else '...
    30 'delete(imaqfind);'... % Clean up - delete any image acquisition objects
    31 'end']);
    32 triggerconfig(handles.video,'manual');
    33 handles.video.FramesPerTrigger = Inf; % Capture frames until we manually stop it
    34 
    35 % Update handles structure
    36 guidata(hObject, handles);
    37 
    38 % UIWAIT makes mycameragui wait for user response (see UIRESUME)
    39 uiwait(handles.myCameraGUI);
    40 
    41 
    42 % --- Outputs from this function are returned to the command line.
    43 function varargout = myCameraGUI_OutputFcn(hObject, eventdata, handles)
    44 handles.output = hObject;
    45 varargout{1} = handles.output;
    46 
    47 
    48 % --- Executes on button press in startStopCamera.
    49 function startStopCamera_Callback(hObject, eventdata, handles)
    50 % Start/Stop Camera
    51 if strcmp(get(handles.startStopCamera,'String'),'Start Camera')
    52     % Camera is off. Change button string and start camera.
    53     set(handles.startStopCamera,'String','Stop Camera')
    54     start(handles.video)
    55     set(handles.startAcquisition,'Enable','on');
    56     set(handles.captureImage,'Enable','on');
    57     
    58 else
    59     % Camera is on. Stop camera and change button string.
    60     set(handles.startStopCamera,'String','Start Camera')
    61     stop(handles.video)
    62     set(handles.startAcquisition,'Enable','off');
    63     set(handles.captureImage,'Enable','off');
    64 end
    65 
    66 % --- Executes on button press in captureImage.
    67 function captureImage_Callback(hObject, eventdata, handles)
    68 
    69 frame = get(get(handles.cameraAxes,'children'),'cdata'); % The current displayed frame
    70 save('testframe.mat', 'frame');
    71 disp('Frame saved to file ''testframe.mat''');
    72 
    73 
    74 % --- Executes on button press in startAcquisition.
    75 function startAcquisition_Callback(hObject, eventdata, handles)
    76 if strcmp(get(handles.startAcquisition,'String'),'Start Acquisition')
    77     % Camera is not acquiring. Change button string and start acquisition.
    78     set(handles.startAcquisition,'String','Stop Acquisition');
    79     trigger(handles.video);
    80 else
    81     % Camera is acquiring. Stop acquisition, save video data,
    82     % and change button string.
    83     stop(handles.video);
    84     disp('Saving captured video...');
    85     
    86     videodata = getdata(handles.video);
    87     save('testvideo.mat', 'videodata');
    88     disp('Video saved to file ''testvideo.mat''');
    89     
    90     start(handles.video); % Restart the camera
    91     set(handles.startAcquisition,'String','Start Acquisition');
    92 end
    93 
    94 % --- Executes when user attempts to close myCameraGUI.
    95 function myCameraGUI_CloseRequestFcn(hObject, eventdata, handles)
    96 
    97 delete(hObject);
    98 delete(imaqfind);

    第二个:Matlab计算器

    编译方式:集成式打包

    calculator本身只有2.5m,代码可能只有6k.但是打包后的文件,达到850M。

    这是M语言的弊端。类似的状况有LabVIEW语言编程,想要打包成.exe,也产生一个体积巨大的安装包。

     1 function varargout = calculator(varargin)
     2 
     3 gui_Singleton = 1;
     4 gui_State = struct('gui_Name',       mfilename, ...
     5                    'gui_Singleton',  gui_Singleton, ...
     6                    'gui_OpeningFcn', @calculator_OpeningFcn, ...
     7                    'gui_OutputFcn',  @calculator_OutputFcn, ...
     8                    'gui_LayoutFcn',  [] , ...
     9                    'gui_Callback',   []);
    10 if nargin && ischar(varargin{1})
    11     gui_State.gui_Callback = str2func(varargin{1});
    12 end
    13 
    14 if nargout
    15     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    16 else
    17     gui_mainfcn(gui_State, varargin{:});
    18 end
    19 
    20 function calculator_OpeningFcn(hObject, eventdata, handles, varargin)
    21 
    22 handles.output = hObject;
    23 
    24 % Update handles structure
    25 guidata(hObject, handles);
    26 
    27 % --- Outputs from this function are returned to the command line.
    28 function varargout = calculator_OutputFcn(hObject, eventdata, handles) 
    29 
    30 varargout{1} = handles.output;
    31 
    32 
    33 
    34 function edit1_Callback(hObject, eventdata, handles)
    35 
    36 input1 = str2num(get(hObject,'String'));
    37 if (isempty(input1))
    38     set(hObject,'String','0');
    39 end
    40 guidata(hObject,handles);
    41 
    42 
    43 % --- Executes during object creation, after setting all properties.
    44 function edit1_CreateFcn(hObject, eventdata, handles)
    45 
    46 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    47     set(hObject,'BackgroundColor','white');
    48 end
    49 
    50 
    51 function edit2_Callback(hObject, eventdata, handles)
    52 
    53 input2 = str2num(get(hObject,'String'));
    54 if (isempty(input2))
    55     set(hObject,'String','0');
    56 end
    57 guidata(hObject,handles);
    58 
    59 
    60 % --- Executes during object creation, after setting all properties.
    61 function edit2_CreateFcn(hObject, eventdata, handles)
    62 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    63     set(hObject,'BackgroundColor','white');
    64 end
    65 
    66 
    67 
    68 function answer_Callback(hObject, eventdata, handles)
    69 
    70 function answer_CreateFcn(hObject, eventdata, handles)
    71 
    72 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    73     set(hObject,'BackgroundColor','white');
    74 end
    75 
    76 
    77 % --- Executes on button press in AddPushbutton.
    78 function AddPushbutton_Callback(hObject, eventdata, handles)
    79 
    80 input111 = get(handles.edit1,'String');
    81 input222 = get(handles.edit2,'String');
    82 total = str2num(input111) + str2num(input222)
    83 c = num2str(total)
    84 
    85 set(handles.answer,'String',c);
    86 guidata(hObject,handles);

    第三个:自动驾驶感知系统

     (二维码自动识别)

    智能USV实时感知系统是一套用于自动驾驶装备(无人车、船)智能感知的应用系统。其中,传感器硬件主要包括:camera * 6、stereo camera * 2、radar * 1、GPS、IMU、4G 通信。主要功能:实现对自动驾驶装备的架势环境进行实时感知,以辅助自动驾驶的控制决策,具体包括:GPS定位、车牌目标识别、汽车识别、雷达探测。目标属性有:ID、定位、距离、相对方位。

    软件自2020.04.28开发。欢迎用户朋友,联系380545156@qq.com反馈意见,共同优化。

    这个部分,就不提供代码了。欢迎交流。

    注意事项

    1.Matlab Runtime的下载

    说实话,我现在还是没有安装独立的Matlab Runtime。在解决这个问题的过程中,花费了一天的时间,到最后还是没有解决。但是,通过其他方式,避免了Matlab Runtime的下载。

    补充一下:Matlab Runtime已经成功下载。

    2.编译时间

    集成式打包时间,非常长。第一次编译,需要耐心。

    3. 涉及到硬件的GUI程序的打包

    目前,仅仅涉及到多个USB硬件的程序,打包后,安装使用过程,没有出现出错。其他同学,如果遇到问题,可以在此留言。

     

  • 相关阅读:
    定义字符串数组
    ifconfig 修改IP
    空指针与野指针的区别
    GDB和Core Dump使用笔记
    雅虎(ycsb)测试hbase(压测)
    decode函数的几种用法
    NVL函数:空值转换函数
    hive行转列,列转行
    case when then else end用法
    hive中一般取top n时,row_number(),rank,dense_ran()常用三个函数
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13665248.html
Copyright © 2011-2022 走看看