前言

在视觉项目的开发流程中,数据标注往往是耗时最长却最关键的环节。不管是目标检测、实例分割还是行为识别,高质量的标注数据直接决定了模型的上限。市面上虽有不少开源或商业标注工具,但它们要么功能冗余,要么难以适配特定格式,尤其在工业场景下,常常需要轻量、稳定、支持 YOLO 格式的本地化工具。

本文推荐一套双版本图像标注软件,一个使用 OpenCvSharp,另一个完全依赖 .NET 原生 GDI+,两者功能一致,便于在不同部署环境下灵活选择。

项目介绍

项目是一套 Windows 桌面应用程序,核心目标是提供一套简单、高效、符合工程师操作习惯的矩形框标注工具。

只需打开图像,用鼠标拖拽即可绘制目标区域,系统自动保存为 YOLO 格式的 .txt 文件(归一化中心点坐标)。

工具支持对已有标注进行选中、移动、调整大小,甚至通过 Delete 键删除,极大提升了标注效率和体验。

项目功能

1、支持常见图像格式(JPG、PNG、BMP)的打开与显示;

2、拖拽绘制矩形框,实时预览绘制过程;

3、点击选中标注框,支持整体拖动位置;

4、在选中框的边缘或角点处可调整大小,带有黄色手柄提示;

5、按 Delete 键快速删除当前选中标注;

6、自动加载同名 .txt 文件中的历史标注,避免重复劳动;

7、一键保存所有标注为标准 YOLO 格式,兼容主流训练框架。

项目特点

两个版本均不依赖大型框架(OpenCvSharp 版仅需一个 NuGet 包,GDI+ 版则零外部依赖),启动快、资源占用低,适合在老旧工控机或无网络环境中使用。

更重要的是,两套实现都正确处理了 PictureBox 的 Zoom 缩放模式下的坐标转换问题——这是许多初学者容易忽略的关键点。无论图像如何缩放居中,鼠标点击位置都能准确映射到原始图像像素坐标,确保标注框位置精确无误。

项目技术

OpenCvSharp 版利用 Mat 对象处理图像,通过 Cv2.Rectangle 直接在内存中绘制标注,再转为 Bitmap 显示,适合后续集成 OpenCV 图像处理流程。

而 GDI+ 版则完全基于 .NET 内置的 Graphics、Bitmap 和 Paint 事件,在 OnPaint 中动态绘制图像与标注,性能稳定且无需额外安装运行库。

两者均采用面向对象设计,将标注框封装为 AnnotationRect 类,状态(是否选中)、标签、矩形区域清晰分离,代码结构易于维护和扩展。

项目代码

private void DrawResizeHandles(Mat image, Rect rect)
{
    var handleColor = new Scalar(255, 255, 0); // 黄色手柄
    var handleThickness = -1; // 填充

    // 绘制8个调整手柄
    Cv2.Rectangle(image,
        new Rect(rect.X - HandleSize / 2, rect.Y - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.X + rect.Width / 2 - HandleSize / 2, rect.Y - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.Right - HandleSize / 2, rect.Y - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.X - HandleSize / 2, rect.Y + rect.Height / 2 - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.Right - HandleSize / 2, rect.Y + rect.Height / 2 - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.X - HandleSize / 2, rect.Bottom - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.X + rect.Width / 2 - HandleSize / 2, rect.Bottom - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
    Cv2.Rectangle(image,
        new Rect(rect.Right - HandleSize / 2, rect.Bottom - HandleSize / 2, HandleSize, HandleSize),
        handleColor, handleThickness);
}

项目效果

实际使用效果流畅自然。打开一张 1920×1080 的图像,缩放后仍能精准框选远处的小目标;拖动已标注框时无卡顿,调整手柄响应灵敏;

光标会根据悬停位置智能切换为十字、四向箭头或缩放图标,交互体验接近专业软件。保存的 .txt 文件可直接用于 YOLOv5/v8 等训练流程,省去了格式转换步骤。

项目源码

结构清晰,逻辑集中在单个类或窗体中。以 OpenCvSharp 版为例,ImageAnnotationTool 类封装了全部逻辑:从 UI 构建、事件绑定,到坐标转换、手柄检测、文件读写,每一步都有详细注释。

GDI+ 版则通过重写 Paint 事件实现高效重绘,并利用 BindingList 实现标注列表与 DataGridView 的自动同步,方便查看和调试。两套代码均可作为学习 C# 图形交互编程的优秀示例。

总结

总的来说,这套工具解决真实痛点——让标注回归简单、可靠、高效。它或许没有花哨的界面或多边形支持,但在目标检测的矩形框标注场景下,它足够快、足够准、足够稳。

对于需要快速开发本地标注环境的团队或个人,项目提供了即拿即用的解决方案,也展示了如何在 WinForm 中正确处理缩放图像的交互逻辑。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐