Matlab App Designer中创建多个可自定义点ROI的代码优化方法
Matlab App Designer 多可拖拽点ROI优化实现方案
第一步:新增App公共存储属性
先在App Designer的属性编辑区添加公共属性,用来持久化存储ROI对象和对应坐标,避免回调函数运行完变量被释放:
properties (Access = public) roiArray % 存储所有点ROI对象的数组 posArray % 存储所有点ROI对应坐标的数组 roiCount = 3 % 需要生成的ROI数量,调整数量直接修改该值即可 end
第二步:重写StartButtonPushed回调代码
用循环替代重复的drawpoint声明,同时给每个ROI绑定位置更新事件,保证拖拽后坐标自动同步到存储数组中:
function StartButtonPushed(app, event) % 清空已有ROI避免重复添加 if ~isempty(app.roiArray) delete(app.roiArray); end imshow('peppers.png','Parent',app.ImageAxes); % 初始化存储数组 app.roiArray = gobjects(app.roiCount,1); app.posArray = zeros(app.roiCount,2); % 循环生成ROI,无需重复编写drawpoint语句 for i = 1:app.roiCount app.roiArray(i) = drawpoint(app.ImageAxes,'Label',"ROI_"+i); app.posArray(i,:) = round(app.roiArray(i).Position); % 绑定ROI移动事件,拖拽时自动更新坐标 addlistener(app.roiArray(i),'ROIMoved',@(src,evt) updatePos(app,src)); end drawnow; end
第三步:新增坐标同步辅助函数
在App的方法编辑区添加私有函数,用来在ROI被拖拽时自动更新存储的坐标值:
methods (Access = private) function updatePos(app,src) % 匹配被移动ROI的索引,更新对应坐标 idx = find(app.roiArray == src); app.posArray(idx,:) = round(src.Position); end end
功能说明
- 调整ROI数量仅需修改属性
roiCount的取值,无需修改循环逻辑 - 所有ROI均支持自由拖拽,最新坐标会自动同步到
app.posArray,可在App其他任意回调中直接读取该数组获取实时坐标 - 不需要ROI序号标签的话,删除
drawpoint语句里的'Label',"ROI_"+i参数即可
内容的提问来源于stack exchange,提问作者elyraz
相关产品推荐
相关产品推荐

