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

标注工具核心代码解析——load_image【canvas.py]

🏗️ 图像加载函数设计思路分析

📋 执行流程图

开始↓
🧹 清理旧场景↓
📊 加载图像数据 (numpy数组)↓
🖼️ 创建图像显示项 (Z=0, 底层)↓
🎭 创建蒙版显示项 (Z=1, 上层)↓
🎨 设置图像内容↓
📐 调整场景边界↓
👁️ 切换到查看模式↓
完成

🎯 核心设计理念

📚 分层架构

Z=1: 蒙版层 (标注结果)
Z=0: 图像层 (原始图像)
  1. 🔄 数据双重存储
    • self.image_data (numpy) → 用于算法处理
    • self.image_item (QPixmap) → 用于界面显示
  1. 🛡️ 安全机制
    • 先清理 → 再加载 (避免内存泄漏)
    • 加载后进入查看模式 (防止误操作)

📸 load_image 函数逐行解析

def load_image(self, image_path: str):# 🧹 清理场景:移除之前加载的所有图形项,为新图像做准备self.clear()# 🤖 【已注释】Segment Anything 相关代码# if self.mainwindow.use_segment_anything:#     self.mainwindow.segany.reset_image()# 📊 图像数据处理:使用PIL读取图像并转换为numpy数组# 这样便于后续的图像处理和分析操作self.image_data = np.array(Image.open(image_path))# 🤖 【已注释】Segment Anything 图像预处理逻辑# 包含了单通道转三通道、格式验证等功能# if self.mainwindow.use_segment_anything and self.mainwindow.can_be_annotated:#     if self.image_data.ndim == 3 and self.image_data.shape[-1] == 3:  # 三通道图#         self.mainwindow.segany.set_image(self.image_data)#     elif self.image_data.ndim == 2:  # 单通道图#         self.image_data = self.image_data[:, :, np.newaxis]#         self.image_data = np.repeat(self.image_data, 3, axis=2)  # 转换为三通道#         self.mainwindow.segany.set_image(self.image_data)#     else:#         self.mainwindow.statusbar.showMessage(#             "Segment anything don't support the image with shape {} .".format(self.image_data.shape))# 🖼️ 创建图像显示项:QGraphicsPixmapItem是Qt中用于显示像素图的图形项self.image_item = QtWidgets.QGraphicsPixmapItem()# 📚 设置图层顺序:Z值决定图形项的堆叠顺序,0表示最底层# 图像作为背景层,应该在最底部self.image_item.setZValue(0)# ➕ 添加到场景:将图像项加入到QGraphicsScene中进行管理# QGraphicsScene负责管理所有图形项的位置、碰撞检测等self.addItem(self.image_item)# 🎭 创建蒙版显示项:用于显示分割结果或高亮区域self.mask_item = QtWidgets.QGraphicsPixmapItem()# 📚 蒙版层级设置:Z值为1,确保蒙版显示在图像上方# 这样标注结果可以覆盖在原图像上self.mask_item.setZValue(1)# ➕ 添加蒙版到场景self.addItem(self.mask_item)# 🎨 加载并显示图像:将图像文件转换为Qt可显示的Pixmap格式# QPixmap是Qt中优化的图像显示格式self.image_item.setPixmap(QtGui.QPixmap(image_path))# 📐 设置场景边界:根据图像的实际大小调整场景的可视范围# boundingRect()返回图像项的边界矩形,确保场景完全包含图像self.setSceneRect(self.image_item.boundingRect())# 👁️ 切换到查看模式:禁用编辑功能,进入纯浏览状态# 防止用户在图像刚加载时误操作self.change_mode_to_view()
http://www.xdnf.cn/news/955351.html

相关文章:

  • NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
  • 深度解析:DDoS攻击及其防御策略
  • 【深度解析】以太坊中的挖矿难度调整机制:从动态调节到“冰河时代”的倒计时
  • FOPLP vs CoWoS
  • 二、ROS2完成Docker容器和宿主机通信,使用ros2 topic list看到,但是无法echo
  • 驭码 CodeRider 2.0 产品体验:智能研发的革新之旅
  • OceanBase 桌面版
  • 从零开始了解数据采集(二十八)——制造业数字孪生
  • Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
  • 基于FPGA的PID算法学习———实现P比例控制算法
  • 协同过滤算法进行电影推荐
  • java教程笔记(十三)-synchronized和ReentrantLock
  • Hilt vs Dagger2:Android 依赖注入框架对比
  • 2025年css+html面试题
  • PH热榜 | 2025-06-07
  • 有限自动机到正规文法转换器v1.0
  • 土建施工员考试:建筑施工技术重点知识有哪些?
  • Java中方法调用参数传递机制的理解和示例验证
  • NFT模式:数字资产确权与链游经济系统构建
  • 什么是VR全景展示?VR全景展示的用途
  • 微信小程序云开发平台MySQL的连接方式
  • STA(Station)模式与AP(Access Point)模式
  • LeetCode - 260. 只出现一次的数字 III
  • 镜像里切换为普通用户
  • VBA高级应用30例应用4:利用键盘设置来阻止自动运行事件
  • 研读论文《Attention Is All You Need》(14)
  • React---day11
  • 基于vue框架的多媒体教室管理系统72d6w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Redis群集
  • 沙箱虚拟化技术虚拟机容器之间的关系详解