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

news2024/12/28 19:05:19

文章目录

  • 前言
  • 一、环境配置
  • 二、文字识别
    • 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分左右的位置。


总结

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matplotlib grid()设置网格格式

通过 Matplotlib axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。 grid() 的函数使用格式如下: grid(colorb,…

C\C++ 使用exception类,抛出自定义异常并捕获

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; 抛出异常&#xff0c;并捕获 exception 效果&#xff1a; 代码&#xff1a; #include <iostream> #include <exception> #include <stdexcept&g…

学堂在线数据结构(上)(2023春)邓俊辉 课后题

The reverse number of a sequence is defined as the total number of reversed pairs in the sequence, and the total number of element comparisons performed by the insertion sort in the list of size n is: 一个序列的逆序数定义为该序列中的逆序对总数&#xff0c;…

Lesson3-4:OpenCV图像处理---直方图

直方图 学习目标 掌握图像的直方图计算和显示 了解掩膜的应用 熟悉直方图均衡化&#xff0c;了解自适应均衡化 1 灰度直方图 1.1 原理 直方图是对数据进行统计的一种方法&#xff0c;并且将统计值组织到一系列实现定义好的 bin 当中。其中&#xff0c; bin 为直方图中经常…

【C语言】结构体还不会?这一篇就够了

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

pytorch深度学习 线性回归

import torch import matplotlib.pyplot as pltx_data torch.tensor([[1.0], [2.0], [3.0]]) # x_data是一个张量 y_data torch.tensor([[2.0], [4.0], [6.0]]) # y_data是一个张量# 定义一个线性回归模型 class LinearModel(torch.nn.Module): # 继承torch.nn.Moduledef …

SpringBoot项目中MVC使用--【JSB系列之010】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录Http协议是马冬梅Cookie机制Session机制Token MVC模型本章的专注内容UserController代码 ThymeleafLets GO!总结作业配套资源题外话 Http协议是马冬梅 HTTP简介 1. HTTP…

软件测试如何实现月薪2万?

其实我一直在强调&#xff0c;钱的多少和技能是息息相关的&#xff0c;所以你要赚更多钱&#xff0c;就得付出更多努力&#xff0c;去不断提升自己的技能和见识。 因为最近在群里有一些同学&#xff0c;之前没做过自动化测试&#xff0c;但是限于领导要求&#xff0c;或者自己…

剑指offer21.调整数组顺序使得奇数位于偶数前面 57.和为s的两个数字 58.反转单词顺序

暴力二次遍历&#xff08;时间复杂度空间复杂度都是n&#xff09; class Solution { public:vector<int> exchange(vector<int>& nums) {vector<int> result(nums.size());int left0;for(int i0;i<nums.size();i){if(nums[i]%21) result[left]nums[i…

深拷贝浅拷贝有什么区别?怎么实现深拷贝?

目录 一、浅拷贝二、深拷贝三、两者区别&#xff1f; 一、浅拷贝 浅拷贝&#xff0c;指的是创建新的数据&#xff0c;这个数据有着原始数据属性值的一份精确拷贝。 如果属性是基本类型&#xff0c;拷贝的就是基本类型的值。如果属性是引用类型&#xff0c;拷贝的就是内存地址 …

理解Vuex

Vuex是什么 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信 Vuex Github地址 …

走向具身智能丨美格高算力AI模组 以端侧智慧连接人和家庭

“贾维斯&#xff0c;我需要你的帮助。”这是钢铁侠Tony Stark在电影中向他的人工智能助手Jarvis寻求支持的场景。《钢铁侠》中的贾维斯不仅令观众着迷&#xff0c;也点燃了人们对于智能助手的想象力。正如电影《她》中所描绘的那样&#xff0c;智能助手还可以与人类建立真实的…

dolphinscheduler伪分布式安装

1、上传安装包 2、安装 #解压 重命名 [rootdatacollection conf]# cd /opt/modules/ [rootdatacollection modules]# tar -zxf apache-dolphinscheduler-2.0.6-bin.tar.gz -C /opt/installs/ [rootdatacollection modules]# cd ../installs/ [rootdatacollection installs]# m…

这8种算法——程序员必会

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 算法一&#xff1a;快速排序法 快速排序法是对冒泡排序的一种改进&#xff0c…

Jmeter测试脚本编写详解(配详图)

一、简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数…

ORACLE数据库scott没有相关权限

1. 首先登陆具有DBA权限的用户 1.1 打开cmd 1.2 输入以下命令 sqlplus / as sysdab上述命令中的 / as sysdba 表示使用操作系统认证登录&#xff0c;同时指定DBA权限 1.3 回车执行命令&#xff0c;系统或将提示输入密码&#xff08;没有则直接跳过&#xff09; 1.4 密码正…

AndroidStudio-实现登录界面(数据存储在SQLite)

要求&#xff1a;每种错误信息采用Toast进行提示 &#xff08;1&#xff09;未注册的用户不能进行登录&#xff1b; &#xff08;2&#xff09;用户名和密码不能为空&#xff1b; &#xff08;3&#xff09;用户名不能重复&#xff1b; 一、创建新工程 点击next 修改名字 &…

JQuery 实现点击按钮添加及删除 input 框

前言 用于记录开发中常用到的&#xff0c;快捷开发 需求新增功能 比如说&#xff0c;我台设备可以设置一个或多个秘钥&#xff0c;有时候我配置一个秘钥时&#xff0c;就不需要多个输入框&#xff0c;当我想配置多个秘钥时&#xff0c;就需要添加多个输入框。 实现 HTML …

Adobe打印机另存pdf出错生成log文件,打印失败

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 用adobe打印机转pdf出错生成log文件,打印失败&#xff0c;log文件内容如下&#xff1a; %%[ ProductName: Distiller ]%% FZXBSJW--GB1-0 not found, using Courier. %%[ Error: typecheck; Offendi…

Mac安装MySQL详细教程

1、MySQL安装包下载 还没下载的话请前往官网下载 我们可以看到这里有两个不同架构的dmg的安装包&#xff0c;如果不知道自己电脑是ARM还是X86的话可以打开终端输入&#xff1a;uname -a 或者 uname -a | awk -F " " {print $(NF-1)} 来查看如下图&#xff1a; 这里显…