news 2026/9/14 9:08:49

CVAT 矩形标注完全指南:旋转矩形、Shift 角度吸附与 By 4 Points 四极值点绘制原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CVAT 矩形标注完全指南:旋转矩形、Shift 角度吸附与 By 4 Points 四极值点绘制原理

CVAT 矩形标注完全指南:旋转矩形、Shift 角度吸附与 By 4 Points 四极值点绘制原理

【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat

本文围绕 CVAT 文档《Annotation with rectangles》展开,系统讲解 CVAT 中标注矩形(Rectangle)的两种核心技巧:通过旋转点(rotation point)绘制带角度的旋转矩形(按住 Shift 可按 15° 固定步进旋转),以及源自学术界"四极值点"(By 4 points)高效包围框绘制方法。读完后,你不仅能熟练完成矩形标注的实操,还能从前端源码层面理解矩形的数据表示、绘制事件流与命中测试算法的实现细节。

前置知识:Shape 模式与 Track 模式

矩形标注发生在 CVAT 标注编辑器的绘制流程中。开始之前,建议先了解两个基础概念:

  • Shape 模式(单帧形状):矩形只存在于当前帧;
  • Track 模式(跨帧跟踪对象):矩形框随对象在视频帧间延续,支持自动插值(Interpolate)、自动边界(Autoborder)等能力。

这两者在 CVAT 文档中分别对应 Shape mode (basics) 与 Track mode (basics),本文的所有操作(包括键盘快捷键ShapeTrackEsc)都建立在这两种模式之上。

矩形的数据表示:4 个点 + 旋转角

在深入操作之前,先明确 CVAT 中矩形是如何被表示的。从源码 cvat-core/src/annotations-objects/rectangle-shape.ts 可以确认,一个矩形实例的坐标点(points)固定为 4 个值:

points = [xtl, ytl, xbr, ybr]

即左上角(top-left)与右下角(bottom-right)两个对角点的坐标,旋转角(rotation/angle)作为形状属性单独存储。构造时还会通过checkNumberOfPoints校验点数合法性(rectangle-shape.ts)。这一表示意味着:无论用"两点拖拽"还是"四极值点"方式绘制,最终落盘的矩形数据结构完全一致——差异只在前端绘制交互阶段。

旋转矩形:rotation point、中心旋转与 15° 吸附

基本操作

  • 拖动矩形上的rotation point(旋转控制点)即可旋转矩形;
  • 旋转是围绕矩形中心进行的;
  • 按住Shift再拖动,旋转角度会被限制为15° 的整数倍(固定角度吸附);
  • 旋转过程中会实时显示当前的旋转角度数值。

源码视角:旋转矩形的命中测试

"围绕中心旋转"这一点在命中测试(判断光标是否在矩形内、用于点击选中)中有直接体现。RectangleShape提供静态方法distance,其算法(rectangle-shape.ts):

  1. [xtl, ytl, xbr, ybr]求出矩形中心(cx, cy)
  2. 将光标坐标(x, y)-angle绕中心做反向旋转(rotatePoint),把"旋转的矩形"问题转换回"正放矩形"坐标系;
  3. 若旋转后的点不落在[xtl, xbr] × [ytl, ybr]区间内,返回null(光标在框外);
  4. 否则返回该点到四条边的最短距离min(rotX - xtl, rotY - ytl, xbr - rotX, ybr - rotY),这个距离可用于判断光标是否靠近框边(决定显示移动/缩放手柄等行为)。

也就是说,旋转并不改变矩形的存储结构,选中与编辑逻辑始终通过"绕中心旋转坐标系"来处理,这也解释了为什么 UI 上的旋转是围绕中心点而非某个角点。

By 4 Points:四极值点快速绘制矩形

这是文档介绍的第二种矩形绘制方法,也是本篇的实操重点。该方法是一种高效的包围框(bounding box)标注方式,最早由一篇学术论文(arXiv:1708.02750)提出:与其拖出一个近似框再手动修正,不如直接点击目标物体的四个"极值点",让算法自动推导出正交包围盒。

第一步:在绘制选项中切换到 By 4 Points

按下S(Shape)或T(Track)进入绘制模式前,先打开 "Draw new rectangle" 弹窗,在Drawing method中选择By 4 points

该选项在 UI 源码中对应 draw-shape-popover.tsx:仅当 2D 场景下形状类型为矩形时渲染Radio.Group,提供By 2 Points(经典拖拽)与By 4 Points(四极值点)两个互斥选项。选项值来自前端画布包的枚举(canvasModel.ts):

export enum RectDrawingMethod { CLASSIC = 'By 2 points', EXTREME_POINTS = 'By 4 points', }

第二步:依次点击物体的四个极值点

ShapeTrack进入绘制模式后,依次点击物体轮廓上的四个物理极值点:

  1. 最上(top-most)点;
  2. 最下(bottom-most)点;
  3. 最左(left-most)点;
  4. 最右(right-most)点。

点击第四个点后绘制自动完成,无需再次确认;按Esc可随时取消编辑。四极值点绘制过程如下动图所示:

源码视角:drawBoxBy4Points 的完整事件流

四极值点的绘制实现在画布绘制处理器中。入口在 drawHandler.ts:当形状类型为rectanglerectDrawingMethod === RectDrawingMethod.EXTREME_POINTS时调用drawBoxBy4Points(),否则走经典的两点拖拽drawBox()

drawBoxBy4Points的具体逻辑(drawHandler.ts):

  1. 以隐藏折线收集点击点:在 SVG 画布上创建一个opacity: 0stroke-width: 0的临时polygon,通过其 SVG 绘制插件的drawstart/drawpoint/undopoint事件统计已点击的点数(支持撤销一个点);
  2. 第四点触发完成:当numberOfPoints === 4时,调用getBBox()取得四个极值点的最小外接正交矩形(axis-aligned bounding box),即points = [bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height]
  3. 归一化为标准矩形坐标:经getFinalRectCoordinates(points, true)换算为画布坐标系下的[xtl, ytl, xbr, ybr]
  4. 约束校验后提交:调用checkConstraint('rectangle', [xtl, ytl, xbr, ybr])校验(例如非空尺寸),通过后以points: [xtl, ytl, xbr, ybr]和绘制耗时(Date.now() - this.startTimestamp)调用onDrawDone,交由上层创建 Shape/Track 对象。

可以看到,"四极值点 → 自动完成"的本质就是:以四个极值点构造的最小外接正交矩形,恰好等价于目标的正交包围盒,因此该方法在保证框选精度的同时避免了拖拽式绘制的反复修正。这也与上文的数据表示一致——最终提交的坐标正是[xtl, ytl, xbr, ybr]四点结构。

质量与回归验证

CVAT 的 Cypress 端到端测试中,矩形 Shape 与 Track 标签的创建流程有专门用例覆盖,可参考 tests/cypress/e2e/actions_objects2/case_8_rectangle_shape_track_label.js;该文件中的四极值点绘制场景也验证了"第四点自动完成"的交互契约。若你在自建标注流程或二次开发中修改了绘制交互,可直接运行相关端到端用例回归。

小结

能力操作要点对应源码位置
旋转矩形拖动 rotation point,绕中心旋转;Shift 吸附 15° 步进并实时显示角度rectangle-shape.ts(绕中心旋转的命中测试)
绘制方式选择Draw new rectangle 弹窗中选择 By 2 Points / By 4 PointscanvasModel.ts、draw-shape-popover.tsx
四极值点绘制依次点击上、下、左、右四个极值点,第四点自动完成;Esc 取消drawHandler.ts
统一数据表示无论哪种方式,矩形均为[xtl, ytl, xbr, ybr]+ 旋转角rectangle-shape.ts

掌握这两种绘制方式后,你可以按任务类型灵活选择:需要带角度框(如倾斜的车辆、建筑)时用旋转矩形;对大量正交目标的标注追求速度时,By 4 Points 能以更少的修正操作达到更高的框选精度。

【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 9:07:15

DeepSeek大模型与ESMap数字孪生融合技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 9:07:01

小米手机照片视频高效检索全攻略

1. 小米设备照片/视频检索需求解析作为小米手机用户,我们每天都会拍摄大量照片和视频。当存储空间积累到几千甚至上万文件时,如何快速找到特定内容就成了刚需。不同于其他品牌手机,小米的MIUI系统提供了多种原生检索方式,每种方法…

作者头像 李华
网站建设 2026/9/14 9:06:33

RISC-V核间中断IPI原理与IMSIC实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 9:05:57

Windows平铺式窗口管理器GlazeWM:Rust打造的原生生产力工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 9:05:54

家庭教育中的技术债:代际沟通的系统升级方案

1. 亲子冲突背后的"技术债"隐喻 当孩子沉迷手机而父母束手无策时,当青春期子女拒绝沟通而家长只会怒吼时,这些场景就像运行着不同版本操作系统的设备——虽然同处一个家庭网络,却因协议不兼容而不断产生数据包丢失。技术债&#xf…

作者头像 李华
网站建设 2026/9/14 9:03:34

高效博客创作:从明确项目标题到结构化关键词的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华