opencv实战--环境配置和文字识别

文章目录

  • 前言
  • 一、环境配置
  • 二、文字识别
    • 2.1 文字单个识别
    • 2.2 文字单个带边框
  • 总结


前言

在这里插入图片描述


一、环境配置

cmd输入python的时候跳转应用商店的解决方法。https://blog.csdn.net/qq_62294840/article/details/120623501

anaconda官方下载地址:https://www.anaconda.com/download-success
清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

anaconda 界面https://blog.csdn.net/qq_44942936/article/details/104623714

pycharm环境配置。
在这里插入图片描述
pytharm中下载cv

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 

https://blog.csdn.net/qq_52519271/article/details/130072076 这个方法不行!!!

二、文字识别

首先要安装库
参考这个文字https://blog.csdn.net/Castlehe/article/details/118751833
我 对他的文章进行简述。
首先下载这个https://digi.bib.uni-mannheim.de/tesseract/
然后点默认安装即可。
随后在安装目录下找到tesseract.exe这个文件,要是不在安装目录那就在c盘里面,可以直接用everything的软件找。
接着跟个那个博主的开始配置环境,但是我的虽然配置环境了,也还是执行不了。又看了这个https://www.python51.com/jc/17786.html
也还是不行。不过没有关系
我们在pycharm中来安装 pip install pytesseract
当安装完成以后呢写一个代码试试

import cv2
import pytesseract

也许你会报错,要是报错了也没关系
你在这样写

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'

我的这个目录是我的exe所在的位置,你只需要填写你的那个位置就可以了,不过你直接在windows的窗口中复制的是单个斜杠,我们再添一个写成我们那样就行了。
我们再随便搞一个图片例如:
在这里插入图片描述

2.1 文字单个识别

是否能够检测出文字

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'


img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
print(pytesseract.image_to_string(img))


cv2.imshow('user',img)
cv2.waitKey(0)

在这里插入图片描述

中文需要去github上下载chi_sim的文件,然后放到对应文件夹后就可以了待写

2.2 文字单个带边框

接着让我们得到文字的位置和边框,我们一步步来
首先是文字位置和边框大小的识别

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'


img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# print(pytesseract.image_to_string(img))

print(pytesseract.image_to_boxes(img))


cv2.imshow('user',img)
cv2.waitKey(0)

可以看到有6个数,其中第一个代表字符,后面四个分别分别是x,y,w,h。
在这里插入图片描述
接着我们使用splitlines函数来分割可以看这个讲解

boxes = pytesseract.image_to_boxes(img)

for b in boxes.splitlines():
    print(b)

在这里插入图片描述
虽然我们得到了,但是不是一组组的数据我们没法使用所以,使用b.split(' ')来进行数据的分割。
要注意的是得到w,h是对应的坐标不是长度!!!

boxes = pytesseract.image_to_boxes(img)

for b in boxes.splitlines():
	b = b.split(' ')
    print(b)

在这里插入图片描述

然后我们做框框。 首先要把字符型转化成int类型。
然后呢就是cv2.rectangle函数可以看这个文章
主要就是

cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
参数表示依次为: (图片,长方形框左上角坐标, 长方形框右下角坐标, 字体颜色,字体粗细)
在图片img上画长方形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向。左上角(x,y),右下角(x,y) ,颜色(B,G,R), 线的粗细

一定要注意得到的值要用图片的高度减去 h ,因为从下往上。

hImg,wImg,_ = img.shape

boxes = pytesseract.image_to_boxes(img)

for b in boxes.splitlines():
    b = b.split(' ')
    print(b)
    x,y,w,h = int(b[1]),int(b[2]),int(b[3]),int(b[4])
    cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,255,0),2)

在这里插入图片描述
然后在框框的旁边我们显示字符
主要用到的是cv2.putText可以看这篇文章
简述

cv2.putText()函数用法
cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数
image:要在其上绘制文本的图像。
text:要绘制的文本字符串。
org:它是图像中文本字符串左下角的坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
font:它表示字体类型。一些字体类型是FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN等。
fontScale:字体比例因子乘以font-specific基本大小。
color:它是要绘制的文本字符串的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
thickness:它是线的粗细像素。
lineType:这是一个可选参数,它给出了要使用的行的类型。
bottomLeftOrigin:这是一个可选参数。如果为true,则图像数据原点位于左下角。否则,它位于左上角。
字体选择
  Python: cv.FONT_HERSHEY_SIMPLEX
  normal size sans-serif font正常大小的无衬线字体
  Python: cv.FONT_HERSHEY_PLAIN
  small size sans-serif font小尺寸无衬线字体
  Python: cv.FONT_HERSHEY_DUPLEX
  normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
  正常大小的无衬线字体(比 FONT_HERSHEY_SIMPLEX 更复杂)
  Python: cv.FONT_HERSHEY_COMPLEX
  normal size serif font正常尺寸衬线字体
  Python: cv.FONT_HERSHEY_TRIPLEX
  normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
  正常大小的衬线字体(比 FONT_HERSHEY_COMPLEX 更复杂)
  Python: cv.FONT_HERSHEY_COMPLEX_SMALL
  smaller version of FONT_HERSHEY_COMPLEX
  FONT_HERSHEY_COMPLEX 的较小版本
  Python: cv.FONT_HERSHEY_SCRIPT_SIMPLEX
  hand-writing style font手写风格字体
  Python: cv.FONT_HERSHEY_SCRIPT_COMPLEX
  more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
  FONT_HERSHEY_SCRIPT_SIMPLEX 的更复杂变体
  Python: cv.FONT_ITALIC
  flag for italic font斜体字体标志

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'

img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape

boxes = pytesseract.image_to_boxes(img)

for b in boxes.splitlines():
    b = b.split(' ')
    print(b)
    x,y,w,h = int(b[1]),int(b[2]),int(b[3]),int(b[4])
    cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,255,0),2)
    cv2.putText(img,b[0],(x,hImg-y+24),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

cv2.imshow('user',img)
cv2.waitKey(0)



在这里插入图片描述

现在我们已经能够得到每个字符了,但是不是字符串(word)。让我们来得到字符串

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'

img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape

boxes = pytesseract.image_to_data(img)
print(boxes)

cv2.imshow('user',img)
cv2.waitKey(0)

这样子让我们打印出这个
可以看到都是分裂的我们无法使用

在这里插入图片描述
可以看到,打印的第一行是没有用的,所以第一行不要那自然就可以用

for x,b in enumerate(boxes.splitlines()):
    if x!=0:

来去除第一行

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'

img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_data(img)
for x,b in enumerate(boxes.splitlines()):
    if x!=0:
        print(b)
cv2.imshow('user',img)
cv2.waitKey(0)

在这里插入图片描述
那么接着应该是把每一行都放在数组中。
其中的enumerate就是枚举类似于计数器。看这篇文章

使用

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

这个就可以得到了,不过此时可以看到有些没有识别到字符串的也在里面,但是他们都是11个而有字符串的是12个那么

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

在这里插入图片描述
和上面一样是画框框,但是不同的是image_to_data得到的本别是左上角端点的位置,以及长宽的长度。

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'


img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape

boxes = pytesseract.image_to_data(img)

for x,b in enumerate(boxes.splitlines()):
    if x!=0:
        b = b.split()
        if len(b)==12:
            print(b)
            cv2.rectangle(img,(int(b[6]),int(b[7])),(int(b[6])+int(b[8]),int(b[7])+int(b[9])),(0,255,0),2)
            cv2.putText(img,b[11],(int(b[6]),int(b[7])),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
            
cv2.imshow('user',img)
cv2.waitKey(0)

还有只读取阿拉伯数字的配置可以看b站视频的24分左右的位置。


总结

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

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

相关文章

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择 评判标准不同编程语言的优点与缺点分析对编程语言未来发展的猜测和未来趋势 💕 💕 💕 博主个人主页: 汴京城下君–野生程序员💕 💕 &#x…

【力扣JavaScript】1047. 删除字符串中的所有相邻重复项

/*** param {string} s* return {string}*/ var removeDuplicates function(s) {let stack[];for(i of s){let prevstack.pop();if(prev!i){stack.push(prev);stack.push(i);}}return stack.join(); };

4. CSS用户界面样式

4.1什么是界面样式 所谓的界面样式,就是更改一些用户操作样式,以便提高更好的用户体验。 ●更改用户的鼠标样式 ●表单轮廓 ●防止表单域拖拽 4.2鼠标样式cursor li {cursor: pointer; }设置或检索在对象上移动的鼠标指针采用何种系统预定义的光标形状。 4.3轮廓线outline…

Layui之选项卡案例 详细易懂

⭐ 本期精彩: 利用Layui框架实现动态选项卡 ⭐ 继上一篇已经实现了左边的树形菜单栏,这一关卡我们已通过,接下来就是实现右边的动态选项卡的关卡,上个关卡的效果及链接 ⭐ 链接:http://t.csdn.cn/tYccL 目录 ⭐ 本期精彩&#xf…

语义分割混淆矩阵、 mIoU、mPA计算

一、操作 需要会调试代码的人自己改,小白直接运行会出错 这是我从自己的大文件里摘取的一部分代码,可以运行,只是要改的文件地址path比较多,遇到双引号“”的地址注意一下,不然地址不对容易出错 把 calculate.py和 u…

SpringCloud

SpringCloud01 为什么要学习微服务框架知识? 因为互联网发展迅速,业务更新迭代快 微服务符合敏捷开发需求 服 务 网 关(请求路由,负载均衡) 注册中心(拉取或注册服务信息 eureka nacos) 配…

tcp转发服务桥(windows)

目的 目的是为了在网关上转发udp数据和tcp数据。对于网络里面隔离的内网来说,有一台可以上网的服务器,那么通过两块网卡就可以转发出去,在服务器上进行数据的转发,有tcp和udp两种,udp已经写过了,这次使用了…

pycharm import的类库修改后要重启问题的解决方法

通过将以下行添加到pycharm中的settings-> Build,Excecution,Deployment-> Console-> Python Console中,可以指示Pycharm在更改时自动重新加载模块: %load_ext autoreload %autoreload 2

APP开发的未来:虚拟现实和增强现实的角色

移动应用程序越来越多地在我们的日常生活中发挥着重要作用。但是,随着技术的不断发展,未来的 APP开发会有什么新的发展方向呢?这是每个人都在关心的问题。在过去的几年中,移动应用程序领域发生了巨大变化。像 VR/AR这样的技术为人…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客:OpenCV实现将任意形状ROI区域置黑(多边形区域置黑) 比较常用的是使用 Rect 矩形实现该功能,代码如下&…

大模型与端到端会成为城市自动驾驶新范式吗?

摘要: 最近可以明显看到或者感受到第一梯队的城市自动驾驶量产已经进入快车道,他们背后所依靠的正是当下最热的大模型和端到端的技术。 近期,城市自动驾驶量产在产品和技术上都出现了新的变化。 在产品层面,出现了记性行车或者称…

MySQL基础篇第7章(单行函数)

文章目录 1、函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数分类 2、数值函数2.1 基本函数2.2 角度与弧度互转函数2.3 三角函数2.4 指数和对数2.5 进制间的转换 3、字符串函数4、日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星…

自制游戏引擎之shader预编译

shader预编译为二进制,在程序运行时候加载,可以提升性能,节省启动时间. 1. 采用google shaderc预编译与加载shader 1.1 下载代码 https://github.com/google/shaderc third_party文件里需要放依赖的第三方 因为电脑访问google的问题,无法通过shaderc-2023.4\utils\git-sync-de…

Java设计模式之行为型-状态模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况&a…

运输层(TCP运输协议相关)

运输层 1. 运输层概述2. 端口号3. 运输层复用和分用4. 应用层常见协议使用的运输层熟知端口号5. TCP协议对比UDP协议6. TCP的流量控制7. TCP的拥塞控制7.1 慢开始算法、拥塞避免算法7.2 快重传算法7.3 快恢复算法 8. TCP超时重传时间的选择8.1 超时重传时间计算 9. TCP可靠传输…

计算机视觉 - 理论 - 从卷积到识别

计算机视觉 - 理论入门 前言一,导论:二,卷积:图像去噪:常值卷积:高斯卷积:椒盐去噪:锐化程度: 三,边缘检测:图像信号导数:求导算子:图…

Java分布式项目常用技术栈简介

Spring-Cloud-Gateway : 微服务之前架设的网关服务,实现服务注册中的API请求路由,以及控制流速控制和熔断处理都是常用的架构手段,而这些功能Gateway天然支持 运用Spring Boot快速开发框架,构建项目工程;并结合Spring…

【模式识别目标检测】——基于机器视觉的无人机避障RP-YOLOv3实例

目录 引入 一、YOLOv3模型 1、实时目标检测YOLOv3简介 2、改进的实时目标检测模型 二、数据集建立&结果分析 1、数据集建立 2、模型结果分析 三、无人机避障实现 参考文献: 引入 目前对于障碍物的检测整体分为:激光、红外线、超声波、雷达、…

【算法基础】搜索与图论

DFS 全排列问题 842. 排列数字 - AcWing题库 #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int x) {if(x>n){for(int i1;i<n;i) cout<<path[i]<<" ";cout<<endl;return ;…

[微信小程序] movable-view 可移动视图容器 - 范围问题

movable-view 可移动视图容器 可移动视图容器&#xff0c;在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中&#xff0c;并且必须是直接子节点 <view><movable-area style"width: 750rpx;height: 200rpx;background-color: gainsboro;">&l…