[特殊字符] Vue 3 + Fabric.js:我造了一个支持旋转矩形(OBB)的 Web 标注工具

vue2+Fabric.js库的使用(1)--Fabric的介绍 基于vue2+Fabric.js进行项目搭建,开发图形编辑器 阅读详情

做计算机视觉(CV)的同学都知道,模型好不好,数据是老大。但找一个好用的Web 端标注工具其实挺难的。

市面上的开源工具,要么是基于老旧的 jQuery/Vanilla JS,想二改集成到现代的前端项目里非常痛苦;要么功能太简单,只能画水平框(AABB),一旦遇到航拍图、遥感、或者倾斜摆放的物体(比如货架上的商品),就束手无策了。

为了解决这个问题,也为了让标注体验能对标桌面端软件(像 LabelImg),我用 Vue 3 (TypeScript) 和 Fabric.js 撸了一个开源项目:Vue Fabric Annotator。
请添加图片描述

💡 为什么你要关注这个项目?
如果你是前端开发者,想学习Canvas 复杂交互;或者你是算法工程师,需要一个轻量级、能集成、支持 OBB 的数据标注后台,这个项目应该能帮到你。

它主要解决了三个痛点:

原生支持旋转矩形(OBB):不再是简单的拉框,支持任意角度旋转,适合高精度场景。
现代技术栈:Vue 3 + Composition API + TS + Element Plus,代码结构清晰,看着舒服,改着容易。
性能与体验:解决了 Canvas 中常见的“卡顿”和“状态不同步”问题,几百个框也能流畅跑。
✨ 核心功能:不只是画个框

  1. AABB 与 OBB 双模式切换
    这是最硬核的功能。很多工具只能画正框,但这个工具支持:

标准模式:画水平框,适合通用物体。
旋转模式:拖拽旋转控制点,或者用快捷键 R/E 精细调整角度。
智能拟合:我还加了个“紧贴模式”和“正向模式”的算法,自动计算最小外接矩形,强迫症福音。
在这里插入图片描述
在这里插入图片描述

  1. 像用设计软件一样标注
    标注是体力活,效率第一。我参考了专业设计软件的交互逻辑:

鼠标中心缩放:指哪打哪,不用反复拖滚动条。
中键平移:按住中键(或 Alt)就能拖拽画布,非常顺滑。
全键盘流:
WASD 微调尺寸(像素级调整)。
Ctrl+Z / Ctrl+Y 撤销重做(这是真的撤销栈,不是简单的删掉上一步)。
Ctrl+C / Ctrl+V 跨图复制粘贴(保留尺寸和角度,标重复物体神器)。
3. 数据管家
导出格式:支持 YOLO 和 COCO 格式,导出来就能直接丢给 PyTorch 跑训练。
智能避让:你肯定遇到过标注框太密,Label 文字叠在一起看不清的情况。我写了个算法,让 Label 文字自动寻找“安全位置”,尽量不遮挡关键像素。
🛠️ 技术复盘:哪怕不复用代码,思路也值得一看
作为一个开源项目,光有 UI 没用,底层的坑我都替大家踩完了。这里分享几个开发过程中遇到的技术难点:

难点一:Fabric.js 的坐标系地狱
Fabric.js 的变换矩阵(Matrix)很强,但直接拿给后端训练是个灾难。因为它包含缩放、倾斜、位移等各种参数,而后端只需要简单直观的 (cx, cy, w, h, angle)。

解法:我没有直接用 Fabric 的属性,而是手写了一套几何算法。利用 QR分解 从矩阵中提取纯净的旋转角度和尺寸;同时实现了一个 getGeometricPoints 函数,反算出四个顶点的绝对世界坐标。
难点二:Vue 响应式 vs Canvas 指令式
Vue 是数据驱动的,Canvas 是对象驱动的。如果不处理好,很容易出现“数据变了画布没变”或者“画布变了数据没同步”的 Bug。

解法:实现了一套严谨的双向绑定机制。利用 watch 监听 Vue 数据变化驱动 Canvas 渲染,同时利用 Fabric 的事件系统反向更新 Vue 数据。中间加了防抖(Debounce)和锁机制,防止死循环。
难点三:无损历史记录
Canvas 的 toJSON 虽然方便,但在标注场景下太重了,而且容易丢失自定义的业务属性(比如 object_id)。

解法:我自己实现了一个 History Stack。在撤销/重做时,不是简单的“清空重画”,而是基于对象 ID 进行增量状态同步 (syncCanvasStateForHistory)。这样无论你撤销多少次,对象的引用关系都不会乱。
🚀 跑起来试试
环境要求 Node.js 16+ 即可。

1. 克隆下来

git clone https://github.com/Nuaawly/vue-fabric-annotator.git
cd vue-fabric-annotator

2. 装包

npm install

3. 跑起来

npm run dev
🤝 碎碎念
这个项目目前托管在 GitHub 上,协议是宽松的 MIT。

如果你正好需要一个 Web 标注工具,或者想研究一下 Vue3 和 Fabric.js 怎么结合,欢迎来玩!

如果有 Bug 或者新需求(比如想要多边形分割 Segmentation),欢迎提 Issue 或者 PR。如果觉得还不错,辛苦去 GitHub 点个 Star ⭐️,这对我真的很重要!

👉 GitHub 传送门:https://github.com/Nuaawly/vue-fabric-annotator

vue结合 Fabric.js 实现鼠标拖动画布、滚轮缩放画布的功能 1. 效果展示 vue 结合 fabric.js 用canvas画布画底图 实现鼠标拖动画布底图 实现鼠标滚动对画布底图进行放大缩小 2. 引入 fabric.js 2.1 npm 安装 npm install fabric --save 2.2 main.js 导入 import { fabric } from 'fabric' Vue.use(fabric); 3.3 vue 页面实... 阅读详情

相关推荐

利用vue+fabric.js获取图片坐标,并实现图片拖拽、旋转、拉伸等功能

什么是Fabric.js? Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Canvas提供所缺少的对象模型, svg parser, 交互和一整套其他不可或缺的工具。 为什么要使用Fabric.js? Canvas提供一个好的画布能力, 但是Api不够友好。绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一些复杂的效果,就不是那么方便了。Fabri...

weixin_42252416的博客 1万+

在vue3中初使用fabricjs

在vue3中初使用fabricjs

rookieWeb的博客 3209

fabricJs 在vue项目中的实战记录(四)添加文字以及文字的操作[字体大小、颜色、字间距、行间距、透明度、加粗、斜体、下划线、删除线、对齐方式、字体设置]

在阅读以下文章的基础上查看本篇笔记: 第一篇:fabricJs 在vue项目中的实战记录(一)引入以及初始化 第二篇:fabricJs 在vue项目中的实战记录(二)fabricjs设置海报背景(图片以及纯色) 第三篇:fabricJs 在vue项目中的实战记录(三)元素的上移层级、下移层级以及删除 1、前言: // 1、let Shape = new fabric.Textbox('字体内容', currentOptionCss) : currentOptionCss=>字体样式 // 2、im.

weixin_43839317的博客 7529

Vue3使用fabric.js实现可以加载图片与绘制功能的画布

Vue3 使用 fabric.js 实现加载图片并且满足绘制功能(设置画笔,设置橡皮擦,设置颜色,设置画笔与橡皮擦的粗细等功能)的画布

weixin_62328265的博客 3969

vue-fabricjs:FabricFabricJS对象作为VueJS组件

vue-fabricjs :red_heart: 文件正在建设中 安装 npm install --save vue-fabricjs 用法 捆绑器(Webpack,汇总) import Vue from 'vue' import { vueFabric } from '../vue-fabricjs' Vue . use ( vueFabric ) 发展 启动视觉测试 npm run dev 建造 将的js和css捆绑到dist文件夹: npm run build 执照

vue-fabric-next:Vue 3的fabric.js库包装

Vue 3 +打字稿+ Vite 该模板将帮助您开始在Vite中使用Vue 3和Typescript进行开发。 推荐的IDE设置 + 。 确保在设置中启用vetur.experimental.templateInterpolationService ! 如果使用[removed] 是当前处于RFC阶段的功能。 要获得语法的正确IDE支持,请使用而不是Vetur(并禁用Vetur)。 TS中.vue导入的类型支持 由于TypeScript无法处理.vue导入的类型信息,因此默认情况下将它们.vue为通用Vue组件类型。 在大多数情况下,如果您真的不在乎模板之外的组件prop类型,那么这很好。 但是,如果您希望在.vue导入中获取实际的道具类型(例如,在使用手动h(...)调用时获取道具验证),则可以使用以下代码: 如果使用手掌 运行Volar: Switch TS Plug

fabric实战经验以及bug解决

本项目是使用vue3、vite、fabric的定制化,进行开发其中项目有npm下载以及后续改为引用定制化下载的包进行开发。这是一个简单使用dom。感兴趣的可以拉取代码自行修改,有意者欢迎加入进来,大家一起来开发一个功能强大的画板。fabric自定义dom实例演示地址fabric官网(全英文的)源码地址: 创建画布实例。等:创建不同类型的图形对象。: 将图形对象添加到画布中。: 从画布中移除指定的图形对象。: 控制是否开启绘图模式。: 监听指定事件,并执行回调函数。: 获取当前选中的图形对象。

m0_68736646的博客 3102

基于vue3.x 、Typescript、vite、Element plus等,适配手机、平板、pc 的后台开源免费模板库

基于vue3.x 、Typescript、vite、Element plus等,适配手机、平板、pc 的后台开源免费模板库(vue2.x请切换vue-prev-admin分支)

1、Fabric.js 入门(vue3 + vite + ts)

此处背景引用的是外部svg,这里只介绍了宽高设置和背景设置,更多配置可去。这只是简单的创建一个页面,更多配置尽请期待…我项目中使用的是这个版本…

beauty_600的博客 3607

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1467

fabric.js 在vue中的使用

Fabric.js 用法总结 (在vue中使用时,因为this的指向不同,所以在Fabric.js方法内部,this是无法使用指向外部的值的) 这只是我在使用fabric.js的过程中的一些总结,文章底部有一个fabric入门的链接,新手入门可以先看一下,适合新手 1. canvas.setBackgroundImage(require('../assets/logo.png')...

看风听雨 1万+

树莓派与OpenCV实现人脸识别(OpenCV安装篇)

主要看了以下两位博客的文章完成的,也遇到了不少的坑,在这里一一填补说明。 链接: https://blog.csdn.net/weixin_42163073/article/details/107308759. 链接: https://blog.csdn.net/weixin_42573595/article/details/108526850. 树莓派与OpenCV实现人脸识别(OpenCV安装篇)一、材料准备:二、系统烧录三、安装OpenCV依赖项四、下载OpenCV-4.3.0五、为OpenCV配置P

weixin_45880057的博客 1万+

【前端开发】Vue + Fabric.js + Element-plus 实现简易的H5可视化图片编辑器

目录前言一 、实战效果技术选型核心功能代码实现二、Fabric.js 简介安装创建画布监听画布事件鼠标事件监听设置画布背景设置背景颜色向画布添加图层对象获取当前选中的对象控制图层层级将画布导出成图片下载为图片画布状态记录清除对象/图层清除画布 前言 canves 绘图的运用是前端必知必会的基础,但是canves 本身并不好用,而fabric.js是基于canves的一个绘图框架库,用起来可比canves友好多了!接下来带你看看案例和初识fabric.js~ 一 、实战效果 编辑前: 编辑中: 技术选型

go 1万+

VMware VSAN 高级参数介绍(测试用)

VSAN 的策略驱动让我们看到了VSAN无穷的潜力,其设计思路相当新颖,在一个基础资源池上使用策略就能实现不同对象的区分服务,而目前没有其他厂家能到VMware这样的高度。 VSAN 呈现给用户配置很简单,但实际上设计及后台比较复杂。笔者无意间发现了VSAN的隐藏高级参数设置,有很多好玩的选项想分享出来。这些参数全部是针对每主机进行设置的。VSAN 中有很多默认设置,这些设置应该都是研发人员多次测试得出的最优值,修改可能导致环境异常,并不建议修改! 目录 参数1:全闪配置下 SSD 写缓存最大.

山水牧羊 2030

java链接opc报异常org.jinterop.dcom.common.JIException: Access is denied解决

记录一下这次从发现问题到解决问题的过程 项目是通过java链接OPC,读取数据,并且发送数据的 程序一直运行正常,最近客户反馈说无法读取数据,通过查看,发现访问异常了。花了2天的时间才解决了这个异常。 org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please c

机器学习菜鸟 1万+

记录--Vue3 + Fabricjs 定制国庆专属头像

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 生在国旗下,长在春风里!国庆将至,采黎为大家带来 定制头像2.0(国庆头像),让我们用代码的形式为祖国庆生!欢迎大家点赞收藏加关注哦 前言 想看效果或者想定制春节头像的小伙伴请直奔 效果区域; 想一睹定制头像2.0小工具的原理及实现思路请耐心阅读,本文代码片段较多~ 在线定制 ???????????? 定制头像入口, 体验地址 ???????????? ????????????...

林恒的博客 576

高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)

本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。

weixin_29232121的博客 495

vue3+fabric绘制检测区域

Vue3.2.x出来之后,调研了下周边相关的东西,觉着在新项目中可以使用,于是乎,先弄个Demo试试水。vite2.x+vue3.2.6+fabric+ant-design-vue 当然fabric之前没使用过,所以也参考了网上一些其他人使用方式,非常感谢!!!使用vite开发,启动和打包确实快,是个不错的脚手架选择。现在vue3 使用composition api写法,比起之前更加的碎片化,要记得的知识点也多了些,之前几乎就是this横扫一切,要是写过react的同学,一定不会陌生,因为这种写法和reac

TravelAlone的博客 2882

目标检测旋转增强源码带方向

解法1: import cv2 import math import numpy as np import os def get_degree(p1,p0): aaa = math.degrees(math.atan2((p1[1] - p0[1]), (p1[0] - p0[0]))) if aaa < 0: aaa = 360 + aaa aaa = (aaa + 90) if aaa > 360: aa...

jacke121的专栏 2083

OpenClaw对接本地大模型:Llama3/Qwen/ChatGLM全适配,完全私有化部署

OpenClaw对接本地大模型,是企业级AI智能体落地的必经之路——它不仅解决了数据隐私和合规问题,还能大幅降低成本、提升响应速度、实现定制化。这篇文章我给大家完整拆解了两套部署方案:Ollama(新手首选,5分钟搞定)和vLLM(生产环境首选,高性能),覆盖了Llama3/Qwen/ChatGLM三大主流模型,还有真实的落地案例、高级优化、踩坑避坑指南,看完你就能零代码完成完全私有化的部署。从零开发自定义工具,给OpenClaw添加专属业务能力;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 808

Fabric.js在vue2中使用

Fabric.js安装 这里我是基于vue来使用的,先安装上Fabric.js npm install fabric 在main.js中 import fabric from 'fabric' Vue.use(fabric); Fabric 提供了 7 种基础形状: fabric.Circle (圆) fabric.Ellipse (椭圆) fabric.Line (线) fabric.Polyline (多条线绘制成图形) fabric.triangle (三角形) fabric.Rect (

只要微微辣的博客 2875

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用fabric.js 快速开发一个图片编辑器

源码在GitHub上,总结下使用fabric.js开发一个编辑器需要用到哪些知识点。 预览地址:https://nihaojob.github.io/vue

nihaojob123的博客 961

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Vue3 + Fabricjs 定制国庆专属头像

😉_马上国庆了,分享一下利用Vue来实现的定制私有国庆头像,自己动手丰衣足食😉 _生在国旗下,长在春风里!国庆将至,采黎为大家带来,让我们用代码的形式为祖国庆生!欢迎大家哦。

Pompey_wp的博客 464

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

vue2+Fabric.js库的使用(3)--Fabric的画布详解

本文介绍了Fabric画布的一些操作,便于了解画布的一些延展,为后续项目做基础

M_lucklu的博客 6575

vue2+Fabric.js库的使用(4)--Fabric的对象/图形详解

本文章主要是介绍绘制图形/对象的操作,前面是对画布的操作,这里介绍了对象的操作

M_lucklu的博客 2816
Jokenplus
博客等级 码龄7年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值