Python Opencv實(shí)戰(zhàn)之文字檢測(cè)OCR
1.相關(guān)函數(shù)的講解
image_to_data()的輸出結(jié)果是表格形式,輸出變量的類型依舊是字符串。
你會(huì)得到一個(gè)這樣的列表['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'],我們逐個(gè)解釋下:
- level,當(dāng)前項(xiàng)的層級(jí);
- page_num,當(dāng)前項(xiàng)所屬頁,一般情況下,單張圖片的內(nèi)容均會(huì)被分在同一個(gè)頁;
- block_num ,當(dāng)前項(xiàng)所屬塊,Tesseract會(huì)將圖像分割為多個(gè)不同的block,block會(huì)出現(xiàn)1,2,3……等等值;
- par_num,當(dāng)前圖像中文字的段落分類;
- line_num,當(dāng)前項(xiàng)所屬行;
- word_num,為同一行中當(dāng)前項(xiàng)所屬的單詞序號(hào);
- left\ top\ width\ height,分別為當(dāng)前項(xiàng)所在矩形區(qū)域的左上角坐標(biāo)、寬度和高度;
- conf,當(dāng)前檢測(cè)字符的置信度,表示項(xiàng)無文字,值為-1,若Tesseract認(rèn)為當(dāng)前區(qū)域有文字,則其值得范圍為0~100;
- text,即為當(dāng)前項(xiàng)的文本,若無文字此項(xiàng)為空。
那么關(guān)于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í)別效果差
可以看到,將本來不是數(shù)字的字母也強(qiáng)行識(shí)別出來了,這簡(jiǎn)直說不過去了。
最后我們看看更改后的效果:
cool,非常的棒,快去試試吧!
對(duì)于數(shù)字又強(qiáng)差人意了,所以說它這個(gè)本身還是存在一點(diǎn)的問題。我覺得影響不大,你覺得不舒服,可以換張圖試試。
4.image_to_data()配置講解
oem講解
OEM _ TESSERACТ_ ONLY 只以最快的速度運(yùn)行Tesseract
OEM _ CUBE _ ONLY 僅運(yùn)行多維數(shù)據(jù)集-精度更高,但速度更慢
OEM _ TESSERACT _ CUBE _ cOMBINED 同時(shí)運(yùn)行并組合結(jié)果-最佳精度
OEM _ DEFAULT 在調(diào)用init_*0時(shí)指定此模式,以指示應(yīng)根據(jù)特定于語言的配置中的變量自動(dòng)推斷上述任何模式。命令行配置,或者如果沒有在上面任何一項(xiàng)中指定,則應(yīng)設(shè)置為默認(rèn)的OEM_ TESSERACT_ ONLY。
psm講解
PSM _ OSD _ ONLY 僅用于方向和腳本檢測(cè)。
PSM _ AUTO _ OSD 帶有方向和腳本檢測(cè)的自動(dòng)頁面分割。(OSD)
PSM _ AUTO _ ONLY 自動(dòng)頁面分割,但沒有OSD或OCR。 PSM _ AUTO 完全自動(dòng)頁面分割,但沒有OSD。
PSM _ SINGLE _ COLUMN 假設(shè)一列大小可變的文本。
PSM _ SINGLE _ BLOCK _ VERT _ TEXT 假設(shè)一個(gè)統(tǒng)一的垂直對(duì)齊文本塊。
PSM _ SINGLE _ BLOCK 假設(shè)一個(gè)統(tǒng)一的文本塊(默認(rèn)值)
PSM _ SINGLE _ LINE 將圖像視為單個(gè)文本行。
PSM _ SINGLE _ WORD 將圖像視為單個(gè)單詞。
PSM _ CIRCLE _ WORD 將圖像視為圓圈中的單個(gè)單詞。
PSM _ SINGLE _ CHAR 將圖像視為單個(gè)字符。
PSM _ SPARSE _ TEXT 在沒有特定順序的情況下盡可能多地查找文本。
PSM _ SPARSE _ TEXT _ OSD 具有方向和腳本檢測(cè)的稀疏文本。
PSM _ RAW _ LINE 將圖像視為單個(gè)文本行,繞過特定于Tesseract的黑客攻擊。
5.項(xiàng)目拓展
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ò)攝像頭的實(shí)時(shí)文字測(cè)試。
6.總結(jié)與評(píng)價(jià)
我是首次使用Tesseract,體驗(yàn)感很不好,這是我在b站的評(píng)論中看到的:
說實(shí)話,我還沒有學(xué)到用算法的地步,學(xué)學(xué)了解一下就好了,反正我是準(zhǔn)備項(xiàng)目實(shí)戰(zhàn)的中后期去學(xué)習(xí)深度學(xué)習(xí),以及其他的算法學(xué)習(xí),這方面我不好說,但它的精度的確是不達(dá)標(biāo),你們也看到了,居然把文字也識(shí)別成了數(shù)字。而且開啟攝像頭識(shí)別的也不是很好,識(shí)別不完全or識(shí)別錯(cuò)誤。
以上就是Python Opencv實(shí)戰(zhàn)之文字檢測(cè)OCR的詳細(xì)內(nèi)容,更多關(guān)于Python Opencv文字檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python爬蟲設(shè)置每個(gè)代理ip的簡(jiǎn)單方法
在本篇文章里小編給大家整理了一篇關(guān)于python爬蟲設(shè)置每個(gè)代理ip的簡(jiǎn)單方法,有興趣的朋友們可以學(xué)習(xí)參考下。2021-08-08Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(2)
這篇文章主要為大家詳細(xì)介紹了Python中的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03python通過pip更新所有已安裝的包實(shí)現(xiàn)方法
下面小編就為的帶來一篇python通過pip更新所有已安裝的包實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05python實(shí)現(xiàn)簡(jiǎn)易內(nèi)存監(jiān)控
這篇文章主要介紹了python實(shí)現(xiàn)簡(jiǎn)易內(nèi)存監(jiān)控,每隔3秒獲取系統(tǒng)內(nèi)存,當(dāng)內(nèi)存超過設(shè)定的警報(bào)值時(shí),獲取所有進(jìn)程占用內(nèi)存并發(fā)出警報(bào)聲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Python實(shí)現(xiàn)微信自動(dòng)鎖定工具
在數(shù)字化辦公時(shí)代,微信已成為職場(chǎng)溝通的重要工具,但臨時(shí)離開時(shí)忘記鎖屏可能導(dǎo)致敏感信息泄露,下面我們就來看看如何使用Python打造一個(gè)微信自動(dòng)鎖定工具吧2025-04-04Python中的pathlib.Path為什么不繼承str詳解
這篇文章主要給大家介紹了關(guān)于Python中pathlib.Path為什么不繼承str的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫步驟詳解
這篇文章主要為大家介紹了Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09