日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Python?Opencv實戰(zhàn)之文字檢測OCR_python

作者:夏天是冰紅茶 ? 更新時間: 2022-10-27 編程語言

1.相關(guān)函數(shù)的講解

image_to_data()的輸出結(jié)果是表格形式,輸出變量的類型依舊是字符串。

你會得到一個這樣的列表['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'],我們逐個解釋下:

  • level,當(dāng)前項的層級;
  • page_num,當(dāng)前項所屬頁,一般情況下,單張圖片的內(nèi)容均會被分在同一個頁;
  • block_num ,當(dāng)前項所屬塊,Tesseract會將圖像分割為多個不同的block,block會出現(xiàn)1,2,3……等等值; ??
  • par_num,當(dāng)前圖像中文字的段落分類;
  • line_num,當(dāng)前項所屬行;
  • word_num,為同一行中當(dāng)前項所屬的單詞序號;
  • left\ top\ width\ height,分別為當(dāng)前項所在矩形區(qū)域的左上角坐標(biāo)、寬度和高度;
  • conf,當(dāng)前檢測字符的置信度,表示項無文字,值為-1,若Tesseract認(rèn)為當(dāng)前區(qū)域有文字,則其值得范圍為0~100;
  • text,即為當(dāng)前項的文本,若無文字此項為空。

那么關(guān)于enumerate()函數(shù),大家可以看看此文。

詳解Python中enumerate函數(shù)的使用

2.代碼展示

Detecting Words

import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
 
 
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 
##############################################
##### Detecting Words  ######
##############################################
 #[   0          1           2           3           4          5         6       7       8        9        10       11 ]
 #['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text']
 boxes = pytesseract.image_to_data(img)
 for a,b in enumerate(boxes.splitlines()):
        print(b)
         if a!=0:
             b = b.split()
             if len(b)==12:
                 x,y,w,h = int(b[6]),int(b[7]),int(b[8]),int(b[9])
                 cv2.putText(img,b[11],(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
                 cv2.rectangle(img, (x,y), (x+w, y+h), (50, 50, 255), 2)
 
cv2.imshow('img', img)
cv2.waitKey(0)

Detecting ONLY Digits

import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
 
 
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 
##############################################
##### Detecting ONLY Digits  ######
##############################################
 hImg, wImg,_ = img.shape
 conf = r'--oem 3 --psm 6 outputbase digits'
 boxes = pytesseract.image_to_boxes(img,config=conf)
 for b in boxes.splitlines():
     print(b)
     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), (50, 50, 255), 2)
     cv2.putText(img,b[0],(x,hImg- y+25),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
 
cv2.imshow('img', img)
cv2.waitKey(0)

3.問題敘述

首先,我遇到的問題有

(1)無效的TeserAct版本:“TeserAct3.02”

?可能是此版本太低了,但我找了找新的版本,在此更新一下路徑:

點(diǎn)擊此網(wǎng)址??Home · UB-Mannheim/tesseract Wiki · GitHub

自行選擇合適的就可以了。

(2)識別效果差

可以看到,將本來不是數(shù)字的字母也強(qiáng)行識別出來了,這簡直說不過去了。

最后我們看看更改后的效果:

cool,非常的棒,快去試試吧!

對于數(shù)字又強(qiáng)差人意了,所以說它這個本身還是存在一點(diǎn)的問題。我覺得影響不大,你覺得不舒服,可以換張圖試試。

4.image_to_data()配置講解

oem講解

OEM _ TESSERACТ_ ONLY ? ? ?只以最快的速度運(yùn)行Tesseract

OEM _ CUBE _ ONLY ? ? ? ?僅運(yùn)行多維數(shù)據(jù)集-精度更高,但速度更慢

OEM _ TESSERACT _ CUBE _ cOMBINED ? ? ? ? 同時運(yùn)行并組合結(jié)果-最佳精度

OEM _ DEFAULT ? ? 在調(diào)用init_*0時指定此模式,以指示應(yīng)根據(jù)特定于語言的配置中的變量自動推斷上述任何模式。命令行配置,或者如果沒有在上面任何一項中指定,則應(yīng)設(shè)置為默認(rèn)的OEM_ TESSERACT_ ONLY。

psm講解

PSM _ OSD _ ONLY ? ? ? ? ?僅用于方向和腳本檢測。

PSM _ AUTO _ OSD ? ? ? ? ? ?帶有方向和腳本檢測的自動頁面分割。(OSD)

PSM _ AUTO _ ONLY ? ? ? ? ? ?自動頁面分割,但沒有OSD或OCR。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PSM _ AUTO ? ? ? ? ? ? ?完全自動頁面分割,但沒有OSD。

PSM _ SINGLE _ COLUMN ? ? ? ? ?假設(shè)一列大小可變的文本。

PSM _ SINGLE _ BLOCK _ VERT _ TEXT ? ? ? ? 假設(shè)一個統(tǒng)一的垂直對齊文本塊。

PSM _ SINGLE _ BLOCK ? ? ? ? ?假設(shè)一個統(tǒng)一的文本塊(默認(rèn)值)

PSM _ SINGLE _ LINE ? ? ? ? ?將圖像視為單個文本行。

PSM _ SINGLE _ WORD ? ? ? ? ?將圖像視為單個單詞。

PSM _ CIRCLE _ WORD ? ? ? ? 將圖像視為圓圈中的單個單詞。

PSM _ SINGLE _ CHAR ? ? ? ? 將圖像視為單個字符。

PSM _ SPARSE _ TEXT ? ? ? ?在沒有特定順序的情況下盡可能多地查找文本。

PSM _ SPARSE _ TEXT _ OSD ? ? ? ? 具有方向和腳本檢測的稀疏文本。

PSM _ RAW _ LINE ? ? ? ? ? 將圖像視為單個文本行,繞過特定于Tesseract的黑客攻擊。

5.項目拓展

import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
 
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
def captureScreen(bbox=(300,300,1500,1000)):
    capScr = np.array(ImageGrab.grab(bbox))
    capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
    return capScr
while True:
    timer = cv2.getTickCount()
    _,img = cap.read()
    #img = captureScreen()
    #DETECTING CHARACTERES
    hImg, wImg,_ = img.shape
    boxes = pytesseract.image_to_boxes(img)
    for b in boxes.splitlines():
        #print(b)
        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), (50, 50, 255), 2)
        cv2.putText(img,b[0],(x,hImg- y+25),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
    fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
    #cv2.putText(img, str(int(fps)), (75, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (20,230,20), 2);
    cv2.imshow("Result",img)
    cv2.waitKey(1)
 
 
cv2.imshow('img', img)
cv2.waitKey(0)

進(jìn)行網(wǎng)絡(luò)攝像頭的實時文字測試。

6.總結(jié)與評價

我是首次使用Tesseract,體驗感很不好,這是我在b站的評論中看到的:

說實話,我還沒有學(xué)到用算法的地步,學(xué)學(xué)了解一下就好了,反正我是準(zhǔn)備項目實戰(zhàn)的中后期去學(xué)習(xí)深度學(xué)習(xí),以及其他的算法學(xué)習(xí),這方面我不好說,但它的精度的確是不達(dá)標(biāo),你們也看到了,居然把文字也識別成了數(shù)字。而且開啟攝像頭識別的也不是很好,識別不完全or識別錯誤。

原文鏈接:https://blog.csdn.net/m0_62919535/article/details/126589521

欄目分類
最近更新