当前位置: 首页 > news >正文

LabelMe扩展工具栏开发:自定义工具按钮添加方法

LabelMe扩展工具栏开发:自定义工具按钮添加方法

【免费下载链接】labelmeImage Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).项目地址: https://gitcode.com/gh_mirrors/lab/labelme

LabelMe是一款强大的图像多边形标注工具,支持多边形、矩形、圆形、线条、点和图像级标志的标注。本文将详细介绍如何为LabelMe扩展工具栏,添加自定义工具按钮,帮助用户根据自身需求优化标注工作流程。

工具栏结构解析

LabelMe的工具栏系统基于Qt框架构建,核心实现位于labelme/widgets/tool_bar.py文件中。ToolBar类继承自QtWidgets.QToolBar,并重写了addAction方法以实现自定义按钮布局:

class ToolBar(QtWidgets.QToolBar): def __init__(self, title): super(ToolBar, self).__init__(title) # 布局设置代码... def addAction(self, action): if isinstance(action, QtWidgets.QWidgetAction): return super(ToolBar, self).addAction(action) btn = QtWidgets.QToolButton() btn.setDefaultAction(action) btn.setToolButtonStyle(self.toolButtonStyle()) self.addWidget(btn) # 居中对齐设置...

主窗口的工具栏在labelme/app.py中初始化,通过toolbar方法创建并添加工具按钮:

def toolbar(self, title, actions=None): toolbar = ToolBar(title) toolbar.setObjectName("%sToolBar" % title) toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) if actions: utils.addActions(toolbar, actions) self.addToolBar(Qt.TopToolBarArea, toolbar) return toolbar

自定义工具按钮添加步骤

1. 准备图标资源

首先需要准备工具按钮所需的图标,建议使用32x32像素的PNG格式图片,放置在labelme/icons/目录下。例如,创建一个自定义的测量工具图标measure.png

2. 创建工具按钮动作

labelme/app.py的MainWindow类中,找到工具按钮定义区域,添加新的动作定义:

# 在action = functools.partial(utils.newAction, self)之后添加 measureTool = action( self.tr("&Measure Tool"), self.measureToolCallback, "Ctrl+M", # 快捷键 "measure", # 图标名称(对应icons/measure.png) self.tr("Measure distances between points"), enabled=False, )

3. 实现工具功能

在MainWindow类中实现工具按钮对应的功能方法:

def measureToolCallback(self): """测量工具功能实现""" self.canvas.setMode("measure") self.status(self.tr("Measure tool activated: Click to set measurement points"))

需要在Canvas类(labelme/widgets/canvas.py)中添加对应的鼠标事件处理逻辑,实现测量功能。

4. 将按钮添加到工具栏

找到工具栏初始化代码,将新创建的动作添加到工具列表:

self.actions.tool = ( open_, opendir, openPrevImg, openNextImg, save, deleteFile, None, createMode, editMode, duplicate, delete, undo, brightnessContrast, None, fitWindow, zoom, None, selectAiModel, measureTool, # 添加自定义工具按钮 )

5. 更新菜单和快捷键

将新工具添加到上下文菜单和快捷键配置中,确保用户可以通过多种方式访问:

self.actions.menu = ( # 现有菜单项... measureTool, # 添加到上下文菜单 # 其他菜单项... )

在配置文件labelme/config/default_config.yaml中添加快捷键配置:

shortcuts: # 现有快捷键... measure_tool: "Ctrl+M"

工具栏扩展效果展示

成功添加自定义工具按钮后,LabelMe的工具栏将显示新的功能按钮,用户可以通过点击或快捷键激活该工具。

LabelMe工具栏扩展效果展示,新增的测量工具按钮已添加到工具栏中

高级自定义技巧

1. 添加下拉菜单工具

对于功能相关的工具,可以创建下拉菜单按钮:

# 创建菜单 measureMenu = QtWidgets.QMenu() measureMenu.addAction(distanceMeasureAction) measureMenu.addAction(areaMeasureAction) # 创建下拉按钮 measureToolButton = QtWidgets.QToolButton() measureToolButton.setMenu(measureMenu) measureToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) measureToolButton.setDefaultAction(measureTool) # 添加到工具栏 measureAction = QtWidgets.QWidgetAction(self) measureAction.setDefaultWidget(measureToolButton)

2. 动态启用/禁用工具

根据当前应用状态动态控制工具按钮的可用性:

def updateMeasureToolState(self): """根据当前选择状态更新测量工具状态""" has_selected_shapes = len(self.labelList.selectedItems()) > 0 self.actions.measureTool.setEnabled(has_selected_shapes)

3. 工具状态持久化

通过配置系统保存工具的偏好设置:

# 保存工具状态 self.settings.setValue("tools/measureToolEnabled", True) # 加载工具状态 measure_enabled = self.settings.value("tools/measureToolEnabled", True, type=bool)

总结

通过扩展LabelMe的工具栏,用户可以根据特定标注需求添加自定义功能,显著提升标注效率。本文介绍的方法涵盖了从按钮创建到功能实现的完整流程,同时提供了高级自定义技巧,帮助开发者进一步优化工具体验。

LabelMe的模块化设计使得工具栏扩展变得简单直观,只需遵循本文所述步骤,即可快速实现自定义工具按钮的添加。对于有特殊标注需求的用户来说,掌握工具栏扩展方法将极大增强LabelMe的适用性。

【免费下载链接】labelmeImage Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).项目地址: https://gitcode.com/gh_mirrors/lab/labelme

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/478286/

相关文章:

  • Agentic容错机制:系统故障的自动恢复能力
  • Miller在DevOps中的应用:日志分析与监控数据处理最佳实践
  • Agentic性能基准测试:与其他AI工具平台的对比
  • ProcessHacker自定义列配置:打造个性化进程监控视图
  • Gorilla学习资源大全:从入门教程到高级技术白皮书
  • 揭秘tui.image-editor架构设计:Command模式与Canvas分层技术解析
  • PyCaret NLP功能:文本分类任务从零开始
  • Stanford Alpaca指令改写技术:提升模型理解能力的方法
  • OCRmyPDF与大数据平台集成:在Hadoop中处理海量PDF的完整指南
  • StyleTTS 2推理指南:Colab云端部署与本地API调用的最佳实践
  • ProcessHacker系统性能报告生成:导出专业监控数据的教程
  • Gorilla安全审计工具:检测API调用中的潜在风险与漏洞
  • mmdetection数据增强库对比:Albu与MMDetection
  • RWKV-Runner进阶技巧:自定义配置与性能优化,让模型运行如丝般顺滑
  • 如何使用Envoy AI Gateway快速集成多AI服务?5分钟上手教程
  • DCGAN-tensorflow项目解析:核心组件与TensorFlow实现原理详解
  • OCRmyPDF与太空探索:处理航天器传回的扫描数据
  • gh_mirrors/car/carbon的插件开发指南:扩展功能的终极教程
  • 终极HTTPSnippet CLI使用手册:命令行参数全解析
  • Raspberry Pi Pico上玩转U8g2:嵌入式开发实战指南
  • 因果推断从未如此简单:DoWhy四步流程轻松实现干预效果估计
  • ProcessHacker低资源模式:让老旧设备高效运行的终极配置指南
  • 如何快速上手swirl?3分钟安装指南带你开启R语言学习之旅
  • Armchair高级功能:iTunes Affiliate代码集成与收益优化
  • 我给AI助手装了一项技能Skill——自动写博客并发布到博客园
  • OrchardCore未来发展路线图:2024年值得期待的新功能预览
  • 解决网络丢包难题:LPCNet的PLC技术让语音通话更稳定
  • 深入理解 eBPF:开启内核可编程时代,重塑后端基础设施
  • 如何用csvkit快速解决80%的数据转换难题?从Excel到JSON的完美过渡
  • 探索pdfminer.six的核心功能:从文本提取到布局分析的完整解析