首页 > 其他分享 >VUE 图片识别

VUE 图片识别

时间:2023-12-22 10:00:47浏览次数:28  
标签:VUE ratio point ctx imgElement canvasOutput const 识别 图片

1、安装依赖

// 安装Element-UI
npm install element-ui --save
// 安装 ocr 和 ocrdet
npm i @paddlejs-models/[email protected] --save
npm i @paddlejs-models/[email protected] --save

2、完整代码

<!--
 * @Descripttion: 图片识别
 * @version: 0.0.1
 * @Author: PengShuai
 * @Date: 2023-12-21 10:03:47
 * @LastEditors: PengShuai
 * @LastEditTime: 2023-12-22 09:41:50
-->
<template>
  <div class="imageRecognition">
    <div class="upFile">
      <el-upload
        class="upload-demo"
        action="abc"
        :auto-upload="false"
        :on-change="onHandleChange"
        :show-file-list="false"
      >
        <el-button size="medium" type="primary"
          >上传图片<i class="el-icon-upload el-icon--right"></i
        ></el-button>
      </el-upload>
    </div>
    <div class="box">
      <div class="left">
        <img :src="image" ref="image" />
      </div>
      <div class="center">
        <canvas ref="canvas"></canvas>
      </div>
      <div class="right">
        <div ref="text" class="text" :style="textStyle">
          <p v-for="(text, index) in texts" :key="index">{{ text }}</p>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import * as ocr from '@paddlejs-models/ocr'
import { drawBox } from '@/utils/ocrUtils'
export default {
  name: 'imageRecognition',
  data() {
    return {
      image: '',
      texts: [],
      textStyle: {
        width: '',
        height: '',
      },
    }
  },
  mounted() {
    this.initPage()
  },
  methods: {
    /**
     *@Descripttion:页面初始化
     *@Author: PengShuai
     *@Date: 2023-12-21 10:49:26
     */
    async initPage() {
      const loading = this.$loading({
        lock: true,
        text: '模型加载中......',
        spinner: 'el-icon-loading',
        background: 'rgba(255, 255, 255, 0.95)',
      })
      try {
        // 模型初始化
        await ocr.init()
        this.$message({
          message: '加载成功',
          type: 'success',
        })
        loading.close()
      } catch (err) {
        this.$message({
          message: '加载失败,请刷新页面',
          type: 'error',
        })
        loading.close()
      }
    },
    /**
     *@Descripttion:上传事件
     *@Author: PengShuai
     *@Date: 2023-12-21 10:49:36
     */
    onHandleChange(file) {
      this.image = URL.createObjectURL(file.raw)

      setTimeout(() => {
        this.getRecognize()
      }, 600)
    },

    async getRecognize() {
      const image = this.$refs.image
      const canvas = this.$refs.canvas
      const res = await ocr.recognize(image)
      const { text, points } = res
      drawBox(points, image, canvas)
      this.textStyle.width = image.width - 40 + 'px'
      this.texts = text
    },
  },
}
</script>

<style lang="less" scoped>
.imageRecognition {
  .box {
    display: flex;
    div {
      flex: 1;
    }
  }
}
</style>

3、{ drawBox } utils文件夹下创建 ocrUtils.js

// utils文件夹下创建 ocrUtils.js
export function drawBox(points, imgElement, canvasOutput) {
  canvasOutput.width = imgElement.width
  canvasOutput.height = imgElement.height
  const ratio = imgElement.naturalHeight / imgElement.height

  const ctx = canvasOutput.getContext('2d')
  ctx.drawImage(imgElement, 0, 0, canvasOutput.width, canvasOutput.height)
  points.forEach((point) => {
    // 开始一个新的绘制路径
    ctx.beginPath()
    // 设置线条颜色为红色
    ctx.strokeStyle = 'red'
    // 设置路径起点坐标
    ctx.moveTo(point[0][0] / ratio, point[0][1] / ratio)
    ctx.lineTo(point[1][0] / ratio, point[1][1] / ratio)
    ctx.lineTo(point[2][0] / ratio, point[2][1] / ratio)
    ctx.lineTo(point[3][0] / ratio, point[3][1] / ratio)
    ctx.closePath()
    ctx.stroke()
  })
}

export function drawText(text, points, imgElement, canvasOutput) {
  canvasOutput.width = imgElement.width
  canvasOutput.height = imgElement.height
  const ratio = imgElement.naturalHeight / imgElement.height

  const ctx = canvasOutput.getContext('2d')
  points.forEach((point, index) => {
    // 开始一个新的绘制路径
    ctx.beginPath()
    // 设置线条颜色为红色
    ctx.strokeStyle = 'red'
    // 设置路径起点坐标
    ctx.moveTo(point[0][0] / ratio, point[0][1] / ratio)
    ctx.lineTo(point[1][0] / ratio, point[1][1] / ratio)
    ctx.lineTo(point[2][0] / ratio, point[2][1] / ratio)
    ctx.lineTo(point[3][0] / ratio, point[3][1] / ratio)
    ctx.closePath()
    ctx.stroke()

    ctx.font = '30px 黑体'
    ctx.fillText(
      text[index],
      point[3][0] / ratio,
      point[3][1] / ratio,
      point[1][0] / ratio - point[0][0] / ratio
    )
  })
}


4、示例

标签:VUE,ratio,point,ctx,imgElement,canvasOutput,const,识别,图片
From: https://www.cnblogs.com/psmart/p/17920637.html

相关文章

  • Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创
    一、前言能够写出简单易用而又不失功能强大的组件,一直是我的追求,简单主要体现在易用性,不能搞一些繁琐的流程和一些极难使用的API接口,或者一些看不懂的很难以理解的函数名称,一定是要越简单越好。功能强大主要体现在功能的完整性,常规的接口肯定是必备的,然后在默认值方面,尽量将值设......
  • Vue插件
    功能:用于增强vue本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。 定义插件(新建一个plugins.js文件):exportdefault{install(Vue,x,y,z){console.log(x,y,z)//全局过滤器Vue.filter('m......
  • 图片名中文翻译成英文
    1.图片名只保留中文importosimportreimportunicodedatadefis_chinese(char):"""判断一个字符是否是中文。"""returnunicodedata.category(char).startswith('Lo')defretain_chinese(filename):"""保留文件名中的中文字......
  • 爬虫_初步(爬取豆瓣图片)
    引用python库fromurllib.requestimporturlopenimporturllib.request,urllib.errorimportre 找到本机的headers headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/120.0.0.0Sa......
  • Vue3实现电商放大镜效果
    效果实现:功能拆解:左侧滑块跟随鼠标移动右则大图放大效果实现鼠标移入控制滑块和大图显示隐藏滑块跟随鼠标移动思路:获取到当前的鼠标在盒子内的相对位置(useMouseInElement),控制滑块跟随鼠标移动(left/top)获取鼠标相对位置控制滑块跟随移动有效移动范围内的计算逻辑......
  • vue-quill
    官网:https://vueup.github.io/vue-quill/引入vue-quill当前版本:"@vueup/vue-quill":"^1.2.0"npminstall@vueup/vue-quill@latest全局设置import{QuillEditor}from'@vueup/vue-quill';constapp=createApp(App);app.component(......
  • 伪造网页数据(每个文件夹抽指定数量的图片并重命名)
    (承接"公共标,特殊标"的结构)1.对于指定父目录结构,每个文件夹抽指定数量的随机图片。importosimportshutilimportrandomdeffind_image_folders(parent_directory):#查找包含图片的文件夹image_folders=[]forroot,dirs,filesinos.walk(parent_direc......
  • vue3 + vant4 :form表单中,搭配 Popup 和 Field 实现vant-picker组件,设置默认值及默认选
    环境:vue3,vant4背景:Picker作为用于辅助表单填写,搭配Popup和Field。页面需要给picker设置默认值,city为温州,但是在popup弹出时,picker没有选中温州这个选项,还时停留在杭州。解决方案:看了很多解决方案,设置default-indexset,ColumnIndex。都尝试了,还是不行。而且这些方法,其实在v......
  • 记录--Vue自动生成组件名
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助unplugin-generate-component-name一款用于以文件夹名或者setup标签写入名字来自动生成Vue组件名的插件。项目地址功能......
  • 羚通视频智能分析平台:安防视频汇聚,危险区域行人入侵算法识别与检测预警
    随着科技的不断发展,安防领域也在不断地进行创新和升级。羚通视频智能分析平台,作为一款领先的安防视频汇聚平台,凭借其强大的功能和高效的性能,已经成为了许多企业和机构的首选。本文将详细介绍羚通视频智能分析平台在危险区域行人入侵算法识别和检测预警方面的应用。一、羚通视频智......