日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何基于Python代碼實(shí)現(xiàn)高精度免費(fèi)OCR工具

瀏覽:74日期:2022-07-20 15:49:03

近期Github開源了一款基于Python開發(fā)、名為Textshot的截圖工具,剛開源不到半個(gè)月已經(jīng)500+Star。

這兩天抽空看了一下Textshot的源碼,的確是一個(gè)值得介紹的項(xiàng)目。

相對(duì)于大多數(shù)OCR工具復(fù)雜工程、差強(qiáng)人意的效果,Textshot具有明顯的優(yōu)勢(shì),

項(xiàng)目簡(jiǎn)單 技術(shù)點(diǎn)豐富

項(xiàng)目簡(jiǎn)單

Textshot整個(gè)項(xiàng)目只有1個(gè)Python文件、139行代碼,沒有復(fù)雜的第三方庫(kù)應(yīng)用,也不涉及過多后端算法的調(diào)用。

技術(shù)點(diǎn)豐富

Textshot這個(gè)項(xiàng)目雖然只有短短的139行代碼,但是,卻涉及Python中多個(gè)方面的知識(shí)應(yīng)用,

UI開發(fā) 截圖工具開發(fā) 后端引擎調(diào)用

通過這短短的項(xiàng)目,你不僅可以了解如何利用PyQt5實(shí)現(xiàn)一個(gè)用戶界面,還可以學(xué)會(huì)如何使用pyscreenshot開發(fā)一款自己的截圖工具。此外,還能夠?qū)W會(huì)后端tesseract的調(diào)用。

換句話說,這短短的139行代碼囊括了前端至后端的整個(gè)流程,而且涉及到截圖和OCR兩款工具的銜接。因此,Textshot雖然工程不大,卻是一個(gè)非常完備、值得學(xué)習(xí)的項(xiàng)目。

本文就來剖析這個(gè)項(xiàng)目的源代碼,教你一步一步實(shí)現(xiàn)自用且永久免費(fèi)的截圖&OCR工具!

tesseract

目前OCR工具數(shù)不勝數(shù),但是大多數(shù)都是在相同的后端算法上面進(jìn)行了不同的封裝而已。而真正在OCR核心做的較好、值得大書特書的,那么一定非tesseract莫屬

tesseract早在1985就已經(jīng)開始由HP實(shí)驗(yàn)室開始研發(fā),而在1995年更是被評(píng)為最為準(zhǔn)確的3款OCR工具之一。此后,tesseract被開源,經(jīng)過Google對(duì)其不斷的進(jìn)行優(yōu)化和升級(jí),它目前已經(jīng)成為OCR方面一款標(biāo)桿性的工具。很多開源或者付費(fèi)的OCR工具,都是直接調(diào)用tesseract或者對(duì)其進(jìn)行稍許優(yōu)化。

而今天介紹的Textshot就是直接調(diào)用tesseract后端引擎進(jìn)行OCR識(shí)別。因此,Textshot只是實(shí)現(xiàn)了一款截圖工具,起到前后端的串聯(lián)作用,在OCR識(shí)別算法方面并沒有做任何工作。

tesseract安裝

由于Textshot的OCR識(shí)別需要調(diào)用tesseract后端引擎,所以,首先需要安裝tesseract。

Windows版安裝可以直接訪問下載鏈接[1].

Mac下可以使用Homebrew進(jìn)行安裝,

brew install tesseract 

Textshot

Textshot是一款截圖識(shí)別文字的OCR工具,因此,它主要涉及2個(gè)環(huán)境,

截圖

OCR識(shí)別

Textshot首先通過截圖獲取需要進(jìn)行文字識(shí)別的圖像,然后對(duì)這副圖像進(jìn)行OCR文字識(shí)別,輸出識(shí)別結(jié)果。

前面已經(jīng)介紹了,Textshot的OCR識(shí)別階段調(diào)用的是tesseract,所以只需要1行代碼即可完成。

因此,Textshot的工作主要是圍繞前端窗口和截圖工具的實(shí)現(xiàn)方面。

截圖工具

截圖工具是我們經(jīng)常會(huì)用到的一種工具,如何實(shí)現(xiàn)一款截圖工具?

很多人會(huì)把它想的非常復(fù)雜,其實(shí),Python中有很多可以實(shí)現(xiàn)截圖的庫(kù)或者函數(shù),例如,pyscreenshot或者pillow中的ImageGrab函數(shù),它的調(diào)用方式如下,

shot = ImageGrab.grab(bbox=(x1, y1, x2, y2))

也就是說,我們只需要把鼠標(biāo)框選的起點(diǎn)和終點(diǎn)坐標(biāo)傳給grab方法就可以實(shí)現(xiàn)截圖功能。

那么,現(xiàn)在問題就轉(zhuǎn)化為如何獲取鼠標(biāo)框選的起點(diǎn)和終點(diǎn)?

Textshot通過調(diào)用PyQt5并繼承QWidget來實(shí)現(xiàn)鼠標(biāo)框選過程中的一些方法來獲取框選的起點(diǎn)和終點(diǎn)。

Textshot繼承和重寫QWidget方法主要包括如下幾個(gè),

keyPressEvent(self, event):鍵盤響應(yīng)函數(shù) paintEvent(self, event):UI繪制函數(shù) mousePressEvent(self, event):鼠標(biāo)點(diǎn)擊事件 mouseMoveEvent(self, event):鼠標(biāo)移動(dòng)事件 mouseReleaseEvent(self, event):鼠標(biāo)釋放事件

可以看出,上面重寫的方法以及囊括了截圖過程中涉及的各個(gè)動(dòng)作,

點(diǎn)擊鼠標(biāo) 拖動(dòng)、繪制截圖框 釋放鼠標(biāo)

class Snipper(QtWidgets.QWidget): def __init__(self, parent=None, flags=Qt.WindowFlags()): super().__init__(parent=parent, flags=flags) self.setWindowTitle('TextShot') self.setWindowFlags( Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Dialog ) self.is_macos = sys.platform.startswith('darwin') if self.is_macos: self.setWindowState(self.windowState() | Qt.WindowMaximized) else: self.setWindowState(self.windowState() | Qt.WindowFullScreen) self.setStyleSheet('background-color: black') self.setWindowOpacity(0.5) QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) self.start, self.end = QtCore.QPoint(), QtCore.QPoint() def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: QtWidgets.QApplication.quit() return super().keyPressEvent(event) def paintEvent(self, event): if self.start == self.end: return super().paintEvent(event) painter = QtGui.QPainter(self) painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3)) painter.setBrush(QtGui.QColor(255, 255, 255, 100)) if self.is_macos: start, end = (self.mapFromGlobal(self.start), self.mapFromGlobal(self.end)) else: start, end = self.start, self.end painter.drawRect(QtCore.QRect(start, end)) return super().paintEvent(event) def mousePressEvent(self, event): self.start = self.end = QtGui.QCursor.pos() self.update() return super().mousePressEvent(event) def mouseMoveEvent(self, event): self.end = QtGui.QCursor.pos() self.update() return super().mousePressEvent(event) def mouseReleaseEvent(self, event): if self.start == self.end: return super().mouseReleaseEvent(event) x1, x2 = sorted((self.start.x(), self.end.x())) y1, y2 = sorted((self.start.y(), self.end.y()))

然后啟動(dòng)截圖界面,

QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)app = QtWidgets.QApplication(sys.argv)window = QtWidgets.QMainWindow()snipper = Snipper(window)snipper.show()

用戶拖動(dòng)、框選窗口,會(huì)獲取窗口的起點(diǎn)和終點(diǎn)的坐標(biāo),這時(shí)候可以調(diào)用下面語(yǔ)句進(jìn)行截圖,獲取需要OCR識(shí)別的文本圖像,

shot = ImageGrab.grab(bbox=(x1, y1, x2, y2))

OCR文字識(shí)別

通過ImageGrab.grab截取到文本圖像shot,下一步就是要把圖像內(nèi)容輸入給后端的tesseract引擎,讓它把圖像轉(zhuǎn)化為字符串

result = pytesseract.image_to_string(img, timeout=2, lang=(sys.argv[1] if len(sys.argv) > 1 else None))

到這里,就實(shí)現(xiàn)了一款準(zhǔn)確度高、永久免費(fèi)的OCR工具。

回顧一下Textshot的項(xiàng)目,我們會(huì)發(fā)現(xiàn)截圖坐標(biāo)范圍內(nèi)的圖像、OCR識(shí)別只需要2行代碼,大多數(shù)都是在圍繞獲取窗口起點(diǎn)和終點(diǎn)坐標(biāo)在開發(fā)。換句話說,Textshot這個(gè)項(xiàng)目對(duì)OCR核心部分并沒有做任何更改,只是在產(chǎn)品包裝方面做了一些巧妙的工作。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美不卡在线| 亚洲美女久久| 91av一区| 中文字幕一区二区三区在线视频| 成人福利视频| 久久av综合| 日韩国产一区二| 最新国产精品久久久| 99国产精品99久久久久久粉嫩| 久久狠狠久久| 免费精品视频最新在线| 国产精品美女久久久浪潮软件| 亚洲成人国产| 午夜欧美在线| 亚洲欧美伊人| 99视频精品| 视频精品一区二区| 激情综合网址| 亚洲精品一区二区妖精| 欧美另类专区| 亚洲午夜黄色| 欧美日韩国产在线一区| 蜜桃免费网站一区二区三区| 日本亚洲欧洲无免费码在线| 亚洲人成网77777色在线播放| 天堂va欧美ⅴa亚洲va一国产| 国产美女精品视频免费播放软件| 精品免费视频| 婷婷成人基地| 欧美羞羞视频| 噜噜噜躁狠狠躁狠狠精品视频| 国产在线不卡| 婷婷综合激情| 91免费精品国偷自产在线在线| 嫩呦国产一区二区三区av| 欧洲av不卡| 奇米777国产一区国产二区| 免费在线播放第一区高清av| 免费视频国产一区| 国产精品久久国产愉拍| 天堂av在线| 一区二区精品| 欧美freesex黑人又粗又大| 亚洲人www| 99精品综合| 国产精品久久久一区二区| 成人精品中文字幕| 日韩美女国产精品| 成人羞羞在线观看网站| 日韩一区二区三区精品 | 亚洲天堂1区| 88久久精品| 亚洲一级少妇| 日韩国产在线一| 精品91久久久久| 精品国产亚洲日本| 日韩综合小视频| 亚洲欧美日韩国产综合精品二区| 久久精品国产一区二区| 亚洲ww精品| 在线一区av| 久草精品视频| 91成人在线网站| 亚洲自拍另类| 欧洲毛片在线视频免费观看| 伊人久久国产| 久久精品97| 日本色综合中文字幕| 9色精品在线| 99视频一区| 午夜一区在线| 久久亚洲不卡| 日韩专区一卡二卡| 美国三级日本三级久久99| 久久国产精品亚洲77777| 91精品国产91久久久久久黑人| 黄在线观看免费网站ktv| 精品一区二区三区中文字幕视频 | 亚洲免费一区二区| 日韩午夜在线| 久久亚洲图片| 日本不卡在线视频| 你懂的亚洲视频| 国产麻豆久久| 老牛影视一区二区三区| 久久网站免费观看| 欧美日韩国产高清| 亚洲精品女人| 美女在线视频一区| 精品久久久亚洲| а√在线中文在线新版| 99精品视频在线| 日本亚洲不卡| 精品国产不卡| 亚洲综合不卡| 国产精品15p| 蜜臀国产一区二区三区在线播放| 老司机精品在线| 日韩视频一区| 国产精品日韩精品在线播放| 国产在线观看www| 蜜桃传媒麻豆第一区在线观看| 久久久精品国产**网站| 亚洲手机在线| 精品亚洲精品| 日韩视频免费| 日韩国产在线| 另类综合日韩欧美亚洲| 五月天久久网站| 国产精区一区二区| 99热精品在线| 亚洲国产影院| 日本欧美不卡| 在线看片福利| 国产高清一区| 一本综合精品| 久久男人av资源站| 日韩欧美高清一区二区三区| 日韩国产激情| 亚州欧美在线| 婷婷成人综合| 久久久91麻豆精品国产一区| 丝袜美腿成人在线| 中文字幕在线看片| 日韩一区二区三免费高清在线观看| 精品五月天堂| 91九色综合| 免费精品视频最新在线| 成人免费电影网址| 精品国产乱码久久久久久1区2匹| 视频一区二区欧美| 久久不见久久见国语| 日韩三级精品| 三级在线观看一区二区| 国产亚洲高清视频| 亚洲午夜黄色| 久久国产直播| 日韩1区2区3区| 国产高潮在线| 国产一区二区三区黄网站 | 国产免费久久| 一区二区精品| 蜜桃视频在线观看一区二区| 亚洲专区欧美专区| 日韩视频在线一区二区三区| re久久精品视频| 亚洲不卡av不卡一区二区| 日韩在线观看不卡| 免费国产自久久久久三四区久久| 99久久亚洲精品蜜臀| 亚洲尤物在线| 久久亚洲风情| 亚洲精品三级| 日韩一区二区久久| 国产一区不卡| 国产精品成人国产| 日韩国产高清在线| 日韩高清二区| 亚洲精品日韩久久| 国产日韩一区二区三区在线| 丝袜美腿一区二区三区| 亚洲精品一区二区在线播放∴| 免费在线看一区| 国产欧美一区二区色老头| 久久精品一本| 91精品在线观看国产| 国产精品日韩| 国产另类在线| 精品亚洲美女网站| 午夜在线观看免费一区| 欧美日韩夜夜| 久久精品电影| 亚洲第一精品影视| 日韩一区二区三区精品| 精品日韩一区| 日韩视频久久| 久久永久免费| 久久国产88| 六月婷婷综合| 一区二区亚洲视频| av高清不卡| 欧美日韩a区| japanese国产精品| 精品中文字幕一区二区三区四区| 91国语精品自产拍| 精品国产精品国产偷麻豆| 鲁大师影院一区二区三区| 欧美91在线| 最新亚洲国产| 不卡视频在线| 国产精品99一区二区三| 日韩中文字幕| 亚洲黄页一区| 日韩高清成人| 97精品在线| 免费视频一区二区三区在线观看| 最新国产精品久久久| 亚洲欧美日韩国产| 亚洲欧美视频一区二区三区| 日韩影片在线观看|