利用纯m文件生成ui(二)
利用纯m文件生成ui之简单版canny边缘提取
布局部分
%get the cannyedge of the pictures.
%调用说明:
%选择自己图片并且导入点击按钮即可(测试版)
% 版本号V1.0,编写于2019年12月12号 作者:neverland!%%
h = figure('menubar','none',...'NumberTitle','off',... 'Name','20177740--neverland的课程设计',... %窗口对象'Position',[300 120 1000 800],... 'tag','figure1');%坐标轴1axes1 = axes('Units','pixels',...'Parent',h,...'position',[100 200 300 350],...'XTick',[],...'YTick',[],...'Box','on',...'tag','ax0');%坐标轴2axes2 = axes('Units','pixels',...'Parent',h,...'Position',[600 200 300 350],...'XTick',[],...'YTick',[],...'Box','on',...'tag','ax1');%菜单作为控制按钮,选择原始图像m1 = uimenu('parent',h,...'Text','选择原始图像',...'Position',1,...'tag','menu1');%canny边缘提取m2 = uimenu('parent',h,...'Text','Canny边缘提取',...'Position',2,...'tag','menu2');
在这里完成了基本的布局,其中生成了窗口,坐标轴以及2个菜单栏,主要是省事不用利用control去安排它的位置。
最为重要的部分
%%handles = guihandles(h);%%handles.axes1 = axes1;handles.axes2 = axes2;set(m1,'callback',@m1_callback);set(m2,'callback',@m2_callback);guidata(h,handles);
由于生成的是ui界面,你需要一个句柄来存储,而且需要的是gui句柄,所以第一句话guihandles把窗口的对象都放入了handles这个句柄。生成句柄后,把两个坐标轴放入了handles的句柄中去。你可以把中个过程和另外blog里面说的容器一样。先得到了一个容器,注入一些水,需要的时候再抽出来。
set两句话是设置点击菜单栏按钮之后的反应,即两个callback,后面的@是函数的名称,之后在下文会写。
guidata(h,handles)是把h里面的内容都存入了handles中,具体请看下面参数传递部分。
参数传递
Matlab的gui参数传递主要有3种方式
global方式
利用global就比较简单,只要在每个function函数部分都global 变量就可完成传递,但是由于是全局变量,所以无法在这个文件中删除。guidata方式
我做课设的时候用的是这种方式,比较常用的也是这种方式,每个函数前面先guidata(object)部分先读入句柄内已经有的部分,最后再guidata(object,handles)存贮起来。function [] = m1_callback(menu1,eventdata,~)handles = guidata(menu1); %获取句柄内的内容[filename,pathname] = uigetfile({'*.jpg';'*.png';'*.tif';'*.*'},'Please select a pictures')truename = [pathname,filename];p = imread(truename);axes(handles.axes1);imshow(p);handles.op = p;guidata(menu1,handles);
end
例如这里面,handles = guidata(menu1)
先读入了把handles里面的内容读取出来,那么menu1这里面就可以利用,进行完一番操作之后再把menu1做完操作后的东西存入handles里面即可。
3. setup-data & getappdata
这种方式我没有尝试过,但是我刚开始学习时别人就是利用这种方法的。
回调函数部分
前面的设置和参数传递完之后这个回调函数也相对非常重要
回调函数的编写方法是
function [输出] = 名称(object,evendata,handles)
倘若不需要则可以用~代替
这个object名称如果是利用guide生成可以不改,如果利用纯m生成则需要自己选取,否则会冲突,所以建议利用控件的tag属性来命名,这个eventdata是为了兼容将来版本的保留接口,这个ui里没咋用到。handles里我直接省略了。
function [] = m1_callback(menu1,eventdata,~)handles = guidata(menu1); %获取句柄内的内容[filename,pathname] = uigetfile({'*.jpg';'*.png';'*.tif';'*.*'},'Please select a pictures') %获取文件名和路径名truename = [pathname,filename]; %拼接p = imread(truename); axes(handles.axes1); %控制显示的坐标轴imshow(p);handles.op = p; %存储内容进入handles句柄guidata(menu1,handles); %更新handles里面内容end
第一个函数部分首先读入了里面已经有了的句柄这部非常重要否则到时候无法控制坐标轴。
uigetfile是一种交互式选取文件的方法。
axes(handles.axes1)是用显示的坐标轴。
handles.op = p; 为handles又创建了一个op的内容,并且把p即图像赋值给了它。
guidata(menu1,handles)即又将menu1执行完的内容放入了handles里面。
点击上面的选择原始图像,并且选择图像即可。
function [] = m2_callback(menu2,eventdata,~)handles = guidata(menu2);op = handles.op;chicun = size(op);number = numel(chicun);if number == 3op = rgb2gray(op);elseop = op;endcannyedge = edge(op,'canny');axes(handles.axes2);imshow(cannyedge);end
第二个回调函数。handles = guidata(menu2)就不用再解释了
而op = handles.op; 因为之前已经存储过了op需要再找一个变量来存储它,当然你也可以直接调用handles.op因为第一句话已经读入了handles里面有的内容
chicun = size(op);
由于调用库函数的canny边缘提取,无法提取rgb的边缘,所以需要判断是否是3维图像。
cannyedge = edge(op,‘canny’);则是库函数的canny边缘提取
最后是坐标轴控制和显示图像。
完成后就是这样的ui界面了。
总的代码
%get the cannyedge of the pictures.
%调用说明:
%选择自己图片并且导入点击按钮即可(测试版)
% 版本号V1.0,编写于2019年12月12号 作者:neverland!%%
h = figure('menubar','none',...'NumberTitle','off',... 'Name','20177740--neverland的课程设计',... %窗口对象'Position',[300 120 1000 800],... 'tag','figure1');%坐标轴1axes1 = axes('Units','pixels',...'Parent',h,...'position',[100 200 300 350],...'XTick',[],...'YTick',[],...'Box','on',...'tag','ax0');%坐标轴2axes2 = axes('Units','pixels',...'Parent',h,...'Position',[600 200 300 350],...'XTick',[],...'YTick',[],...'Box','on',...'tag','ax1');%菜单作为控制按钮,选择原始图像m1 = uimenu('parent',h,...'Text','选择原始图像',...'Position',1,...'tag','menu1');%canny边缘提取m2 = uimenu('parent',h,...'Text','Canny边缘提取',...'Position',2,...'tag','menu2');%%handles = guihandles(h);%%handles.axes1 = axes1;handles.axes2 = axes2;set(m1,'callback',@m1_callback);set(m2,'callback',@m2_callback);guidata(h,handles);%%回调函数部分function [] = m1_callback(menu1,eventdata,~)handles = guidata(menu1); %获取句柄内的内容[filename,pathname] = uigetfile({'*.jpg';'*.png';'*.tif';'*.*'},'Please select a pictures')truename = [pathname,filename];p = imread(truename);axes(handles.axes1);imshow(p);handles.op = p;guidata(menu1,handles);endfunction [] = m2_callback(menu2,eventdata,~)handles = guidata(menu2);op = handles.op;chicun = size(op);number = numel(chicun);if number == 3op = rgb2gray(op);elseop = op;endcannyedge = edge(op,'canny');axes(handles.axes2);imshow(cannyedge);end
这里面是总的代码,比较简单,少去了许多无用的注释,但是里面藏着许多的内容,对Matlab会有更深的了解。
最后,其实课设写了一个从原理上写canny边缘提取的ui,想要学习的话可以私信我,不过那份代码就需要有偿食用啦!
利用纯m文件生成ui(二)相关推荐
- 利用纯m文件生成ui界面(一)
写blog的背景 这学期课程设计学了关于ui的许多东西,正好在高铁上比较空就想马克一下. 从一开始的用guide再到纯m文件生成ui.是一种飞跃式的增长.技术这东西没有止境,只有一直研究一直做才可能做 ...
- 利用Jhipster JDL文件生成数据库和实体类 注意事项
1.利用 idea 下 Terminal command 命令行键入 命令 jhipster jdl mono1.jdl 来执行 jdl 建库操作时会报错:Cannot read property ' ...
- 如何将一个PPT生成一个二维码?扫码就能查看文件内容
制作文件二维码很简单! PDF文件.PPT文件.图片文件.音频文件.视频文件.Excel文件.Word等,都可以一键上传,然后生成一个可自定义设计.并支持追踪扫描数据的动态二维码. 什么是动态二维码呢 ...
- 如何快速生成A2L文件(ASAP2 Studio):基于“前一版本A2L文件+最新map文件”生成新map文件对应A2L文件
目录 一.ASAP2 Studio概述: 二.如何在ASAP2 Studio中利用"前一版本A2L文件+最新map文件"生成新map文件对应A2L文件: 2.1 在ASAP2 St ...
- 如何把视频文件转换为视频二维码的完整教程
如何把视频文件转换为视频二维码的完整教程 二维码已经不经意间快速地融入了我们的生活,我们可以通过扫描二维码来添加好友.付款等等, 那么,如何让视频生成二维码直接免费观看和实现分享呢? 「 视频二维码 ...
- Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)
说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...
- QT中ui文件生成关联的C++类
在VS2008中给对话框资源添加关联的C++类时,可通过右键菜单"添加类"直接添加关联的C++类,但QT中不支持这样的操作.在QT中在创建界面ui时,可手动也可自动创建ui文件关联 ...
- cfiledialog对话框大小_利用MFC的CFileDialog生成Windows2000文件对话框 (转)
利用MFC的CFileDialog生成Windows2000文件对话框 (转)[@more@] 利用MFC的CFileDialog生成windows2000文件对话框 周鸣扬 自Windows2000 ...
- 把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库
前言 在用Qt做开发时,为了方便快速,一般都使用Qt设计师界面类来做界面相关的布局,这个类在当前工程中是没有.cpp或.h文件的,但主类又有引入了这个头文件,点开转到定义或声明时,是打不开的,如下图: ...
- 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...
解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...
最新文章
- 限时删!一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)
- 【每天一个Linux命令】12. Linux中which命令的用法
- 浅谈分布式 ID 的实践与应用
- WebRTC编译系统之GYP,gn和ninja
- SAP UI5是如何从浏览器读取语言设置并按照优先级排序的
- 自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。
- Quartz 2 Scheduler示例
- python traceback 丢失_基于python traceback实现异常的获取与处理
- 中国移动宣布已开通5G基站近5万个,在50个城市提供5G服务
- JAVA发送HttpClient请求及接收请求结果过程
- 面向对象和结构化程序设计的区别
- UBNT设置AP模式注意事项
- 利用URLOS搭建自己的CDN网站加速节点真是其乐无穷
- 腾讯视频怎么下载 qlv视频怎么转换为MP4格式
- 微流控芯片进样用多通道正负压力控制器的解决方案
- 计算机usb接口指什么,端口是什么?USB口、COM1、COM2、COM3等等又是什么?
- 销毁一颗二叉树--Destroy(Node* root)
- 支付宝小程序手机相册上传多个图片踩坑
- 《Django By Example》读书笔记 01
- HTML+CSS实现百叶窗效果
热门文章
- Ubuntu安装谷歌浏览器Chrome
- Kubernetes能成大事,华为云的眼光“真毒”
- python算方差_Python求均值,方差,标准差的实例
- latex中页眉怎么去掉_latex 去掉页眉
- 杭州电子科技大学计算机非全日制,杭州电子科技大学全日制和非全日制研究生有何区别?...
- cad直线和圆弧倒角不相切_在cad绘制倒圆角的方法技巧步骤详解
- 重新思考路易斯维尔足球品牌
- 微信公众号常见微信吸粉方式
- 同IP不同端口导致session冲突的解决方法
- 在html中加入文本编辑器,富文本编辑器嵌入指定html代码