Opencv学习项目1——文字识别

上一次我们使用pytesseract.image_to_boxes来检测字符,今天我们使用pytesseract.image_to_data来检测文本并显示

实战教程

和上一次一样,添加opencv-python和pytesseract库

首先我们先来了解一下pytesseract.image_to_data

pytesseract.image_to_data(img) 是一个 pytesseract 库提供的函数,用于检测图像中的文本,并返回详细的文本框、文本内容及其位置信息。这个函数会返回一个包含每个检测到的文本块信息的字典列表。

每个字典包含以下信息:

  • level: 检测级别(如字块、段落等)
  • page_num: 页码
  • block_num: 块编号
  • par_num: 段落编号
  • line_num: 行号
  • word_num: 单词编号
  • left: 文本框左边缘的 x 坐标
  • top: 文本框顶部的 y 坐标
  • width: 文本框的宽度
  • height: 文本框的高度
  • conf: 文本识别的置信度
  • text: 检测到的文本内容

接一下我们使用代码打印一下pytesseract.image_to_data

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

# 读取图像
img = cv2.imread('3.jpg')
# 将图像从 BGR 格式转换为 RGB 格式(因为 pytesseract 使用 RGB 格式)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

himg, wimg, _ = img.shape
data = pytesseract.image_to_data(img)
print(data)

# 显示带有文本框和识别结果的图像
cv2.imshow( 'result', img)
# 等待按键输入来关闭窗口
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()

运行后我们得到这一串,按我刚才介绍的 pytesseract.image_to_data可知各个数字的含义,大家可以对照着看一下

接下来我们使用for x, b in enumerate(data.splitlines()):来遍历并枚举文本数据中的每一行

for x,b in enumerate(data.splitlines()):
     if x!=0:
        b = b.split()
        print(b)

这样就将坐标和文本分离出来了

'5'  '1'  '1'  '1'  '4'  '1'  '81'  '436'  '535'  '77'  '96.205406'  'EVERYONE.'

从左往右为层级页码、块编号、段落编号、 行号、单词编号、文本框左边缘的 x 坐标、文本框顶部的 y 坐标、文本框的宽度、文本框的高度、文本识别的置信度、检测到的文本内容

接下来我们采用cv2的画矩形来画框,在这里我又发现 pytesseract.image_to_data 的原点和opencv的原点又是同一个原点了,和之前的pytesseract.image_to_boxes不同

这样我们就可以写出代码

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

# 读取图像
img = cv2.imread('3.jpg')
# 将图像从 BGR 格式转换为 RGB 格式(因为 pytesseract 使用 RGB 格式)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

himg, wimg, _ = img.shape
data = pytesseract.image_to_data(img)
print(data)
for x,b in enumerate(data.splitlines()):
     if x!=0:
        b = b.split()
        print(b)
        if (len(b)==12):
            x,y,w,h = int(b[6]),int(b[7]),int(b[8]),int(b[9])
            cv2.rectangle(img,(x,y),(w+x,h+y),(0,0,255),3)
            cv2.putText(img,b[11],(x+20,y-5),cv2.FONT_HERSHEY_COMPLEX,1,(50,50,255),2)


# 显示带有文本框和识别结果的图像
cv2.imshow( 'result', img)
# 等待按键输入来关闭窗口
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()

 这里我们使用判断每一行是否有12个数据来筛选出我们需要的文本那一行

这样就完成了,我们看一下效果

我们发现文本被正确框出和显示出来 。

有兴趣的可以关注一下,近期一直更新,谢谢

 

 

 

<think>好的,我现在需要帮助用户解决如何使用vue-seamless-scroll实现el-table的自动滚动效果的问题。首先,我要回忆一下用户提到的引用内容,看看有没有相关的实现方法。引用[1]提到创建两个表格,一个隐藏body部分,另一个隐藏head部分,然后结合滚动组件来实现固定表头和滚动数据。引用[2]则提到了使用vue-seamless-scroll插件以及处理排序时需要从头滚动的逻辑,用到了scrollInitFlag参数。 用户现在需要具体的示例代码,所以我应该整理出一个清晰的步骤。首先,安装vue-seamless-scroll插件是必要的。然后,在组件中引入插件并注册。接下来,构建两个el-table,第一个表格只显示表头,第二个表格隐藏表头并放在vue-seamless-scroll组件内。需要确保两个表格的列对齐,所以宽度和样式要一致。 另外,用户可能需要在点击排序时重置滚动,这时候需要处理排序事件,将scrollInitFlag设为true,并在滚动方法中根据这个参数决定是否从头开始滚动。代码中可能需要用到ref来引用滚动组件,并调用其reset方法。 需要注意样式部分,特别是隐藏第二个表格的表头,可以使用CSS选择器如/deep/ .el-table__header-wrapper来设置display: none。同时,两个表格的宽度要保持一致,避免布局错乱。 可能的问题点包括:表格数据更新时滚动是否正常,滚动速度的控制,以及如何处理用户交互如悬停暂停滚动。用户可能还需要知道如何调整参数,比如step、limitMoveNum等,来优化滚动效果。 最后,确保示例代码简洁明了,注释清楚,让用户能够直接复制并调整使用。同时,提醒用户注意版本兼容性,比如Vue3和element-plus的配置可能有所不同,需要正确导入组件和样式。</think># 使用 vue-seamless-scroll 实现 el-table 自动滚动 ### 实现步骤与代码示例 #### 1. 安装插件 ```bash npm install vue-seamless-scroll ``` #### 2. 基础实现 ```vue <template> <div class="scroll-container"> <!-- 固定表头表格 --> <el-table :data="tableData" class="header-table" :header-cell-style="{ background: '#f5f7fa' }" > <el-table-column prop="date" label="日期" width="180"></el-table-column> <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> <!-- 滚动数据表格 --> <vue-seamless-scroll :data="tableData" class="seamless-scroll" :class-option="scrollOptions" > <el-table :data="tableData" class="body-table" :show-header="false" > <el-table-column prop="date" width="180"></el-table-column> <el-table-column prop="name" width="180"></el-table-column> <el-table-column prop="address"></el-table-column> </el-table> </vue-seamless-scroll> </div> </template> <script> import vueSeamlessScroll from 'vue-seamless-scroll' export default { components: { vueSeamlessScroll }, data() { return { tableData: [ // 填充测试数据... ], scrollOptions: { step: 0.5, // 滚动速度 limitMoveNum: 10, // 开启滚动的数据量阈值 hoverStop: true, // 悬停暂停 direction: 1, // 0向下 1向上 2向左 3向右 openWatch: true // 自动监听数据更新 } } } } </script> <style scoped> .scroll-container { position: relative; height: 400px; } .header-table { position: absolute; z-index: 2; width: 100%; } .body-table { margin-top: 40px; /* 表头高度 */ } .seamless-scroll { height: 360px; /* 容器总高度 - 表头高度 */ overflow: hidden; } /* 隐藏滚动表格的头部 */ /deep/ .body-table .el-table__header-wrapper { display: none; } </style> ``` ### 关键点说明 1. **双表格结构**:通过分离表头和数据实现固定表头效果[^1] 2. **参数配置**: - `step` 控制滚动速度(值越大越快) - `limitMoveNum` 设置数据量阈值(当数据超过该值才启用滚动) - `hoverStop` 实现悬停暂停交互 3. **样式处理**: - 使用定位固定表头表格 - 通过`margin-top`偏移数据表格位置 - 隐藏滚动表格的头部元素 ### 排序重置逻辑[^2] ```vue <script> export default { methods: { handleSortChange() { this.scrollInitFlag = true this.$refs.scrollComponent.reset() } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值