tesseract验证码识别,四位数字或英文,反回结果是小方块或者空,Linux、win系统都这样

python3.7 3.9 3.10 pytesseract0.3.4 0.3.5 0.3.6 0.3.9 64/32 tesseract 3 4 5
换电脑,换系统,换软件版本,换库版本,换语言包,换图片,不处理和处理图片都试过了,全都是小方块

img

img

img

img


终端运行

img

识别结果写入TXT

img

import pytesseract
import numpy as np
import cv2.cv2 as cv2
img=cv2.imread('photo2051001204417.png')
img=img[2: 39, 3: 128]
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thresh,yzm = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
# yzm:表示需要操作的数组
# 160:表示阈值
# 255 表示最大值
# 降噪
yzm = cv2.morphologyEx(yzm,cv2.MORPH_CLOSE,np.ones(shape=(2,2)))
# 先膨胀 让黑色遭点消失,再侵蚀让黑色加粗
# dilate = cv2.dilate(yzm,np.ones(shape=(2,2)))
# yzm = cv2.erode(dilate,np.ones(shape=(3,3)))
cv2.imwrite('new_img.png',yzm)

cv2.imshow('window1',yzm)
cv2.waitKey(1000)
cv2.destroyWindow('window1')
result=pytesseract.image_to_string(yzm)
print(result)



用了很多方法处理图片都不行,是不是tesseract本身有问题?

我也有遇到过有识别不出结果的,如果不确定是不是tesseract本身有问题,可以参考一下我这篇博客:https://blog.csdn.net/weixin_44327634/article/details/117887612 ,看一下我那图片能识别出来吗?(我的电脑重装系统了,不然还可以直接帮你测试一下)如果试了不行,那就是没有对应的语言包识别不出来,这种情况要么自己找人家的开源代码,要么自己用opencv训练,实在不行没办法的办法就是用第三方打码平台了。充钱才能更强😂

如果没有自己训练识别素材包。大概率就是共享的识别模板不匹配
本身这个库识别结果是有个可信度参数的 看看值是多少,如果低于一定值(忘记了印象中是0-100),那应该就是模板问题

tesseract 本身就有缺陷啦。
如果你要想做这块需要找一个质量不错的数据集,这个目前国内应该没有。
你需要科学上网谷歌上找,有很多的。

我用没这问题啊

试试安装个虚拟机, 在虚拟重新安装python tesseract4.0 ,更新我上次发的语言包。 看看能不能识别 。 代码和库,语言包都没啥问题。 只能考虑是电脑的问题了。
另外有没有执行权限问题?

https://www.sogou.com/link?url=hedJjaC291OB0PrGj_c3jB5ZxMqZzMV6nGTaSNpeYCF5KPDuEUxSwLU6DtrNzhozxU7FxgHX0QSTQmcGJwWUL9ZFUOC112k8i6h6nITmZGk.

推荐一个大佬封装好的包,很实用,有兴趣的话可以深入研究一下源码
https://github.com/sml2h3/ddddocr?

你可以试试这个代码,转成DAta 不用String

 # 导入模块
import cv2
import pytesseract
#使用opencv读取图像
image = cv2.imread(sample_image.png’)
#将图像转换为灰度图像
 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#通过阈值转换为二进制图像
threshold_img = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
 #显示图像
 cv2.imshow(‘threshold image’, threshold_img)
#窗口停留直到用户按下一个键
cv2.waitKey(0)
#关闭当前窗口
cv2.destroyAllWindows()
#配置tesseract参数
custom_config = r'--oem 3 --psm 6'
#现在给tesseract传送图像
details = pytesseract.image_to_data(threshold_img, output_type=Output.DICT, config=custom_config, lang=’eng’)
print(details.keys())
total_boxes = len(details['text'])
for sequence_number in range(total_boxes):
    if int(details['conf'][sequence_number]) >30:
(x, y, w, h) = (details['left'][sequence_number], details['top'][sequence_number], details['width'][sequence_number],  details['height'][sequence_number])
threshold_img = cv2.rectangle(threshold_img, (x, y), (x + w, y + h), (0, 255, 0), 2)
#显示图像
cv2.imshow(‘captured text’, threshold_img)
 cv2.waitKey (0)
cv2.destroyAllWindows()
 parse_text = []
word_list = []
last_word = ''
for word in details['text']:
if word!='':
word_list.append(word)
 last_word = word
 if (last_word!='' and word == '') or (word==details['text'][-1]):
parse_text.append(word_list)
word_list = []
import csv
with open(result_text.txt',  'w', newline="") as file:
csv.writer(file, delimiter=" ").writerows(parse_text)