使用canvas,在图片上实现识别标注

本文介绍了如何利用canvas在图片上实现识别标注的功能。核心思想是将图片上传至后端,获取标注物品的坐标和名称,然后使用canvas的绘图功能绘制矩形和文字。详细步骤包括初始化canvas、显示图片、绘制矩形和文字,以及处理标注框的宽高以适应图片缩放。最后给出了标注框部分的完整代码。
部署运行你感兴趣的模型镜像

核心思想

  • 需要将图片传至后端,后端返回需要标注的物品的坐标及识别到的名称,此篇坐标为左上角和右下角;
  • 使用canvas的绘图功能。在现实的图片上绘制矩形,并调整样式。
    实现效果如图:
    在这里插入图片描述

初始化canvas

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

显示图片

  • drawImage接受五个参数:图片、x坐标、y坐标、宽度、高度;
  • 图片、x、y为必须参数;
ctx.drawImage(img, 0,0,width,height)

绘制矩形

  • strokeStyle :描边矩形颜色;
  • rect(x,y,width,height):描边矩形,参数为x坐标、y坐标、宽、高;
  • fillStyle:填充颜色;
  • fillRect(x,y,width,height):填充矩形,参数为x坐标、y坐标、宽、高。
ctx.strokeStyle = 'red';
ctx.rect(x,y,wid,hei);
ctx.fillStyle = 'red';
ctx.fillRect(x,y-20,ctx.measureText(value.cont).width+20,20);

绘制文字

  • font :文字颜色及字体;
  • fillText(文字内容,x,y):填充的文字,参数为文字内容、x坐标、y坐标。
ctx.fillStyle = '#fff';
ctx.font = "16px Arial";
ctx.fillText(文字内容,x,y);

后台数据

const resData = {"data":{"success":"1","cont":[{"pos":[220,71,449,682],"cont":"元气森林"},{"pos":[437,72,660,719],"cont":"元气森林"},{"pos":[794,104,979,653],"cont":"元气森林"}]}}

标注框宽高

  • 后台返回的坐标数据是根据图片原始大小进行抓取,但是页面显示的图片会进行尺寸缩小,所以要计算标注框在页面上显示的大小。
  • img.naturalWidth、img.naturalHeight:图片原始尺寸;
  • img.width、img.height:图片显示尺寸;
  • 宽缩小比例 = (img.naturalWidth - img.width)/img.width;
  • 长缩小比例 = (img.naturalHeight - img.height)/img.height;
  • 实际计算标注框的尺寸 = 实际尺寸 * 缩小比例;

标注框部分完整代码

 const img = document.getElementById('img');
 const canvas = document.getElementById('canvas');
 // 调整画布大小
 canvas.width = img.width;
 canvas.height = img.height;
 const ctx = canvas.getContext('2d');

// 根据数据循环生成标注框
 if(resData.data.cont.length > 0){
     ctx.strokeStyle = 'red';
     // 画布上显示图片
     ctx.drawImage(img, 0,0,img.width,img.height);
     // 计算缩小比率
     const widthrat = (img.naturalWidth - img.width)/img.width;
     const heightrat = (img.naturalHeight - img.height)/img.height;
     resData.data.cont.forEach(value => {
     	// 获取标注框的x、y坐标
         const x = value.pos[0]*widthrat;
         const y = value.pos[1]*heightrat;
         // 获取标注框的宽、高
         const wid = (value.pos[2]-value.pos[0])*widthrat;
         const hei = (value.pos[3]-value.pos[1])*heightrat;
         // 根据获取的数据绘制描边矩形
         ctx.rect(x,y,wid,hei);
         
         // 绘制描边矩形上的红色填充矩形,并稍微调整样式
         ctx.fillStyle = 'red';
         ctx.fillRect(x,y-20,ctx.measureText(value.cont).width+20,20);

		// 绘制填充矩形上的白色文字,并调整坐标
         ctx.fillStyle = '#fff';
         ctx.font = "16px Arial";
         ctx.fillText(value.cont,x+10,y-4);
     })
     ctx.stroke()
 }else{
     ctx.fillStyle = '#000';
     ctx.fillText('图片中无饮料。',10,10);
 }


<img id='img' src={flieData}></img>
<canvas id='canvas' ></canvas>

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 前端功能模块设计 车辆识别数据标注系统的前端需要实现以下核心功能模块: - **用户管理模块**:包括用户注册、登录、权限管理等功能。例如,管理员可以管理不同权限的用户,标注员可以登录系统接收和提交任务。 - **数据标注模块**:支持图像数据的标注操作,如矩形框标注、多边形标注、点标注等,适用于车辆识别中的目标检测任务。 - **数据预处理模块**:实现图像的格式转换、尺寸调整、缩放、旋转等操作,以满足不同的标注需求。 - **标注结果展示模块**:实时展示标注结果,并支持导出为常用格式(如JSON、XML等)。 - **任务管理模块**:支持任务的创建、分配、进度跟踪等功能,确保标注工作的有序进行。 - **质量评估与反馈模块**:提供标注结果的质量评估功能,如标注准确率、一致性检测等,并支持反馈机制,对不合格数据进行修正。 ### 前端技术栈选择 为了实现上述功能,可以采用以下技术栈: #### 1. 前端框架 - **Vue.js**:轻量级且易于上手的渐进式JavaScript框架,适合构建单页应用(SPA),支持组件化开发,适合数据驱动的交互式界面。 - **React.js**:另一种流行的前端框架,具有强大的生态系统和高性能的虚拟DOM机制,适合构建复杂的用户界面。 #### 2. 状态管理 - **Vuex**(适用于Vue)或 **Redux**(适用于React):用于管理全局状态,如用户登录状态、任务列表、标注数据等。 #### 3. UI 组件库 - **Element UI** 或 **Ant Design Vue**:提供丰富的UI组件,简化界面开发。 - **Vuetify**(适用于Vue)或 **Material-UI**(适用于React):基于Material Design的UI组件库,提升用户体验。 #### 4. 图像标注组件 - **OpenLayers** 或 **Leaflet**:用于图像展示和交互操作,支持缩放、拖动、标注等。 - **Fabric.js** 或 **Konva.js**:用于在Canvas实现交互式图形绘制,适合实现矩形框、多边形等标注工具。 - **Label Studio Frontend**:开源的数据标注前端库,可快速集成图像、文本等标注功能。 #### 5. API 请求与通信 - **Axios** 或 **Fetch API**:用于与后端服务进行HTTP通信,获取和提交标注数据。 - **WebSocket**:用于实时通信,如任务状态更新、标注进度推送等。 #### 6. 图像处理与渲染 - **HTML5 Canvas**:用于图像渲染和交互式标注。 - **WebGL**(可选):用于高性能图像处理,适合大规模图像数据的实时渲染。 #### 7. 路由管理 - **Vue Router**(适用于Vue)或 **React Router**(适用于React):实现前端页面的导航和路由控制。 ### 示例代码:图像标注界面(使用Vue + Fabric.js) ```vue <template> <div> <canvas id="annotationCanvas" width="800" height="600"></canvas> <button @click="drawRect">绘制矩形框</button> </div> </template> <script> import { fabric } from 'fabric'; export default { mounted() { this.canvas = new fabric.Canvas('annotationCanvas'); const img = new Image(); img.src = 'path/to/image.jpg'; img.onload = () => { const image = new fabric.Image(img, { left: 0, top: 0, selectable: false }); this.canvas.add(image); }; }, data() { return { canvas: null }; }, methods: { drawRect() { const rect = new fabric.Rect({ left: 100, top: 100, width: 200, height: 100, fill: 'transparent', stroke: 'red', strokeWidth: 2 }); this.canvas.add(rect); } } }; </script> ``` ### 数据交互与后端对接 前端需要与后端进行数据交互,主要包括: - **获取图像数据**:通过HTTP请求从后端获取图像URL或Base64数据。 - **提交标注结果**:将标注的坐标信息(如矩形框的左上角坐标、宽度、高度)以JSON格式提交到后端API。 - **任务状态同步**:通过WebSocket或轮询方式获取任务状态更新,如任务完成、审核通过等。 ### 安全与性能优化 - **权限控制**:确保用户只能访问自己权限范围内的数据和功能。 - **图像缓存**:使用浏览器缓存或CDN加速图像加载。 - **懒加载**:对于大量图像数据,采用懒加载技术,只加载当前可视区域的图像。 - **响应式设计**:适配不同分辨率的屏幕,提升用户体验。 ### 总结 车辆识别数据标注系统的前端开发需要结合现代前端框架(如Vue.jsReact.js)和图像处理库(如Fabric.js或Konva.js),实现图像标注、任务管理、数据交互等功能。通过合理的技术选型和架构设计,可以构建一个高效、稳定、易用的数据标注平台。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值