基于AI识别数据的Vue.js图像框选标注

在数字化时代,图像识别技术的应用越来越广泛,尤其是在车牌识别、人脸识别等领域。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件,该组件不仅允许用户在图片上绘制多个区域,加载文字,还提供了清空功能。这种技术可以与AI识别技术相结合,实现在图片上框出识别的区域和文字标注,例如识别车牌号码等。

技术栈简介

为了实现这一功能,我们将使用以下技术:

  1. Vue.js:一个渐进式的JavaScript框架,用于构建用户界面。
  2. HTML5 Canvas:HTML5提供的一个元素,允许通过JavaScript在网页上绘制图形。
  3. JavaScript:用于实现交互逻辑和处理用户输入。

实现步骤

1. 创建Vue组件

首先,我们需要创建一个Vue组件,它将包含图片和用于绘制的画布。

<template>
  <div>
    <div style="margin-bottom: 10px">
      <el-button type="primary" @click="initVideo">开始识别</el-button>
      <el-button type="primary" @click="clearCanvas">清空画布</el-button>
    </div>
    <div class="imageContainer">
      <img  id="img" src="../../assets/img/vehicle.png" alt="">
      <div ref="drawArea" class="draw-area">
        <!-- Canvas将被useDraw函数动态创建并添加到DOM中 -->
      </div>
    </div>
  </div>
</template>

2. 引入绘制逻辑

我们将使用一个自定义的JavaScript模块 autoDraw.js,它封装了绘制逻辑。这个模块提供了初始化画布、绘制图形和文字、清除画布等功能,可去资源库下载完整文件。

import autoDraw from "../../util/autoDraw.js";

3. 初始化和控制绘制

在Vue组件的 methods 中,我们定义了 initDrawclearCanvas 方法来初始化画布和清除绘制。

export default {
  data() {
    return {
      list:[
        {
          name:"粤A·0932L 蓝牌",
          graphCoordinateList: [
            { x: 0.29, y: 0.51 },
            { x: 0.375, y: 0.52 },
            { x: 0.373, y: 0.59 },
            { x: 0.29, y: 0.58 }
          ],
        },
        {
          name:"粤A·G33385 绿牌",
          graphCoordinateList: [
            { x: 0.71, y: 0.56 },
            { x: 0.81, y: 0.57 },
            { x: 0.81, y: 0.64 },
            { x: 0.709, y: 0.63 }
          ], 
        }
      ],
      drawInstances: [], // 保存useDraw的实例
    };
  },
  mounted(){
  },
  methods: {
    // 加载画布
    initDraw(regionData) {
      console.log(regionData,'进入');
      const drawArea = this.$refs.drawArea;
      const img = document.getElementById('img'); // 获取图片元素
      // 获取图片的宽度和高度
      const imgWidth = img.offsetWidth;
      const imgHeight = img.offsetHeight;
      const options = {
        canvasStyle: {
          lineWidth: 5,
          strokeStyle: "red",
          fillStyle: "rgba(255, 0, 0, 0)",
        },
        // x和y是图片上的相对坐标,坐标值的范围从 0 到 1,其中 (0,0) 代表图片左上角,(1,1) 代表图片右下角。
        initPoints: regionData.graphCoordinateList.map(point => {
          // 将比例值转换为像素坐标
          return {
            x: point.x * imgWidth,
            y: point.y * imgHeight
          };
        }),
        onComplete: (points) => {
          console.log("绘图完成,坐标点:", points);
        },
        onClear: () => {
          console.log("画布已清空");
        },
      };
      // 初始化useDraw,并保存实例引用
      const drawInstance = autoDraw();
      drawInstance.init(drawArea, options);
      // 绘制区域名称
      const textX = regionData.graphCoordinateList[0].x * imgWidth - 10;
      const textY = regionData.graphCoordinateList[0].y * imgHeight - 10;
      drawInstance.drawText(textX, textY, regionData.name, "red", "24px Arial");
      // 保存实例
      this.drawInstances.push(drawInstance);
    },
    // 获取数据判断是否加载画布
    initVideo() {
      this.$nextTick(res=>{
        console.log(this.list,'图片区域数据');
        if(this.list.length > 0){
          // 如果有值则渲染区域出来
          this.list.forEach((regionData) => {
            this.initDraw(regionData);
          });
        }
      })
    },
    // 清空画布
    clearCanvas(){
      this.drawInstances.forEach(instance => {
        instance.onClear();
      });
      this.drawInstances = []; // 清空实例数组
    }
  },
  // 在组件销毁前清理资源
  beforeDestroy() {
  },
};

4. 样式设置

最后,我们需要为图片容器和画布设置样式,以确保它们正确显示。

<style lang="scss" scoped>
  .imageContainer {
    position: relative;
    width: 100%;
    max-width: 100%; /* 根据图片尺寸调整 */
    height: 700px;
    img{
      width: 100%;
      height: 100%;
    }
    .draw-area {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
    }
  }
</style>

结论

通过上述步骤,我们成功地在Vue.js应用中实现了一个交互式的图片框选和文字标注组件。该组件可以根据AI识别数据在图片上进行区域框选和文字标注,适用于车牌识别等场景。这种技术可以应用于教育、游戏、图像编辑等多个领域,为用户提供更加丰富和个性化的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-71-简化路径

题解&#xff1a; 1、以"/"作为分隔符对字符串进行分割得到数组names; 2、初始化一个栈stack&#xff08;python中的栈使用列表实现&#xff09;&#xff1b; 3、遍历数组names&#xff1b;如果当前元素为".."且栈不为空&#xff0c;则将弹出栈顶元素&a…

不考虑光影、背景、装饰,你的可视化大屏摆脱不了平淡。

如果在可视化大屏的设计中不考虑光影、背景和装饰&#xff0c;确实难以摆脱平淡。光影效果可以为大屏增添立体感和层次感&#xff0c;吸引观众的注意力。 合适的背景能营造出特定的氛围&#xff0c;使数据展示更具情境感。而装饰元素则可以起到点缀和美化的作用&#xff0c;提…

无人机悬停精度算法!

一、主要算法类型 PID控制算法&#xff1a; PID控制算法是一种常用的闭环控制算法&#xff0c;通过计算目标值与当前值的误差&#xff0c;并根据比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;、微分&#xff08;D&#xff09;三个参数来调整控制输出&#x…

049_python基于Python的热门微博数据可视化分析

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

Metasploit渗透测试之探索漏洞利用

概述 到目前为止&#xff0c;我们已经学习了如何利用漏洞&#xff0c;但不知道它们是如何工作的。尽管所有漏洞利用模块都经过了彻底验证&#xff0c;但了解它们的构建方式总是有好处的。作为渗透测试人员&#xff0c;知道如何编写自己的模块&#xff0c;或者简单地向现有模块…

【性能优化】安卓性能优化之CPU优化

【性能优化】安卓性能优化之CPU优化 CPU优化及常用工具原理与文章参考常用ADB常用原理、监控手段原理监控手段多线程并发解决耗时UI相关 常见场景排查CPU占用过高常用系统/开源分析工具AndroidStudio ProfilerSystraceBtracePerfettoTraceView和 Profile ANR相关ANR原理及常见场…

Android 图片相识度比较(pHash)

概述 在 Android 中&#xff0c;要比对两张 Bitmap 图片的相似度&#xff0c;常见的方法有基于像素差异、直方图比较、或者使用一些更高级的算法如 SSIM&#xff08;结构相似性&#xff09;和感知哈希&#xff08;pHash&#xff09;。 1. 基于像素的差异比较 可以逐像素比较…

Java基础-注解机制详解

文章目录 注解基础Java内置注解内置注解- Override内置注解 - Deprecated内置注解 - SuppressWarnings 元注解元注解 - Target元注解 - Retention & RetentionTarget元注解 - Documented元注解 - Inherited 注解与反射接口自定义注解 深入理解注解Java8提供了哪些新的注解&…

【React系列三】—React学习历程的分享

一、组件实例核心—Refs 通过定义 ref 属性可以给标签添加标识 字符串形式的Refs 这种形式已经不再推荐使用&#xff0c;官方不建议使用 https://zh-hans.legacy.reactjs.org/docs/refs-and-the-dom.html#legacy-api-string-refs 回调形式的Refs <script type"te…

nginx精讲

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

计算广告第三版pdf

需要该书pdf版本的同学点赞&#xff0c;私信我&#xff1a;

给哔哩哔哩bilibili电脑版做个手机遥控器

前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而&#xff0c;电脑版的bilibili不能通过手机控制视频翻页和调节音量&#xff0c;这意味着观看视频时需要一直坐在电脑旁边。那么&#xff0c;有没有办法制作一个手机遥控器来控制bilibili电脑版呢&#xff1f; 首先…

WPF MVVM模式实现DataGrid编辑

本文是一个MVVM模式开发的基础教程&#xff0c;完全手写实现&#xff0c;未借助三方框架&#xff0c;适用于初学者 要实现DataGrid的编辑&#xff0c;步骤如下&#xff1a; 1、创建两个窗口&#xff0c;第一个窗口用于显示DataGrid&#xff0c; 布局如下&#xff1a; 这个界…

(3) c++基本代码

main函数 main函数只有可执行程序才需要&#xff0c;如果是动态库等则无需main函数。 main函数标准的写法是 #include <iostream> using namspace std; int main(void) {// 业务代码return 0; } 当然以上代码只是最简单的案例&#xff0c;其中代表main函数值是int&#…

TypeScript中 元组、枚举enum、type

元组&#xff1a; let arr : [string, number] [hello, 3]; let arr2 : [number, boolean?] [44];//问号可选的let arr3 : [number, ...string[]] [34, a, b, c];//任意多个字符串&#xff0c;也可以没有 let arr4 : [number, ...string[]] [34]; 枚举&#xff1a; //e…

【C++进阶】之C++11的简单介绍(一)

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

【CSS、JS】监听transitionend多次触发的原因

现有代码如下&#xff0c;移入红色内容区域触发动画&#xff0c;监听动画触发&#xff0c;但是每次触发控制台会打印4次 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content…

低功耗4G模组采集温湿度传感器数据~ 超全教程!不会的小伙伴看这篇!

在物联网&#xff08;IoT&#xff09;快速发展的今天&#xff0c;温湿度传感器作为环境监测的重要设备&#xff0c;被广泛应用于农业、工业、智慧城市等领域。本文将详细介绍如何使用低功耗4G模组Air780E采集温湿度传感器数据并实现网页查看&#xff0c;帮助初学者快速上手。 一…

springboot汉妆养生会馆网站-计算机毕业设计源码96229

目录 摘要 Abstract 1 绪论 1.1选题背景 1.2研究意义 1.3系统开发目标 2相关技术介绍 2.1 Java编程语言 2.2 B/S模式 2.3 MySQL简介 2.4 SpringBoot框架 3.汉妆养生会馆网站的设计与实现系统分析 3.1 可行性分析 3.1.1技术可行性分析 3.1.2经济可行性分析 3.1.3…

canvas小蜘蛛

一. 效果 二. 代码 <!--* Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git* Date: 2024-10-2…