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);
第三个:自动驾驶感知系统
https://u.wechat.com/MFl-TPiUT-Xb0P2U7aOxIZo (二维码自动识别)
智能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硬件的程序,打包后,安装使用过程,没有出现出错。其他同学,如果遇到问题,可以在此留言。