日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

编写Tesseract的Python扩展

發(fā)布時(shí)間:2024/4/14 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写Tesseract的Python扩展 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Tesseract是一個(gè)開源的OCR(光學(xué)字符識(shí)別)引擎,用于識(shí)別并輸出圖片中的文字。雖然和商業(yè)軟件比起來識(shí)別精度不算很高,但是如果你要尋找免費(fèi)開源的OCR引擎,可能Tesseract就是唯一的選擇了。Tesseract用起來還算是比較方便。它提供了一個(gè)簡(jiǎn)單的命令行工具,沒有很多選項(xiàng),輸入圖片輸出就是文字。因?yàn)槭情_源的,你也可以直接編譯使用它基于C++的庫。

最近一段時(shí)間我對(duì)Python產(chǎn)生了很大的興趣。它是如此的簡(jiǎn)潔高效,只要可以用Python完成的工作就懶得使用其他編程語言。所以到了應(yīng)用Tesseract的時(shí)候我首先想到了去Google一下有沒有Python binding。確實(shí)有人使用swig做了個(gè)tesseract的封裝,不過不幸的是實(shí)際應(yīng)用存在不少問題。首先是安裝不便,尤其在mac上的安裝令人崩潰。即使完成安裝,不知為何又segment fault。其次,很多方法只做了簡(jiǎn)單的封裝,又缺乏文檔,想做深入一點(diǎn)的應(yīng)用例如輸出文字在圖中的位置,感覺無從著手。不如從Tesseract的源代碼入手,自己編寫python的擴(kuò)展,對(duì)tesseract的某些感興趣的方法做個(gè)封裝,也順便熟悉下Python和C/C++集成的方法。可以在擴(kuò)展里為所欲為,真是令人心情愉快。

首先,新建一個(gè)cpp源文件,然后為這個(gè)新模塊想個(gè)名字,比如 tessex。然后,需要定義這個(gè)新模塊,以及模塊里需要暴露出來的方法。這樣在Python里就可以用import tessex來載入模塊。

static PyMethodDef tessexMethods[] = {{"recognize", (PyCFunction)tessex_recognize,METH_VARARGS|METH_KEYWORDS,"recognize text in an image."},{NULL, NULL, 0, NULL} };PyMODINIT_FUNC inittessex(void) {(void) Py_InitModule("tessex", tessexMethods); }

這里,我們暴露一個(gè)方法recognize,用來掃描給定圖片然后返回識(shí)別的文字以及位置。大家知道Python方法可以傳兩種參數(shù),一種是無名的,一種是有名的,分別對(duì)應(yīng)METH_VARARGS以及METH_KEYWORDS。作為一個(gè)有點(diǎn)完美主義傾向的人,我把兩個(gè)選項(xiàng)都勾上了。然后我們看下recognize方法的定義。正如之前講的,需要聲明參數(shù)args以及kw。

static PyObject* tessex_recognize(PyObject* self, PyObject* args, PyObject* kw){

接下來是展開從Python調(diào)用傳進(jìn)來的參數(shù)。要使用有名參數(shù),需要把所有參數(shù)名都先列出來。

  static const char* kwlist[]={"data", "w", "h", "channels", "step", NULL};

然后調(diào)用PyArg_ParseTupleAndKeywords展開有名參數(shù)。一個(gè)格式字符串用于聲明參數(shù)的類型。data是圖像的像素buffer,適用S類型。w、h、channels、step分別是圖像的寬度、高度、信道數(shù)、步長(zhǎng),都是整型變量,適用i類型。

PyStringObject *data;int w=0;int h=0;int channels=0;int step=0;if (!PyArg_ParseTupleAndKeywords(args, kw, "Siiii", (char**)(kwlist),&data, &w, &h, &channels, &step)) {PyErr_SetString(PyExc_Exception, "Tessex: Failed to parse arguments.");return NULL;}

我們要開始使用Tesseract的API了。Tesseract支持多種語言,不過語言包要分別下載安裝。這里我們使用英語。?

tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();if (api->Init(NULL, "eng")) {PyErr_SetString(PyExc_Exception, "Tessex: Failed to initialize tesseract API.");return NULL;}

?把傳入的圖像數(shù)據(jù)傳遞給Tesseract,然后進(jìn)行識(shí)別。

api->SetImage((const unsigned char*)PyString_AS_STRING(data),w, h, channels, step);api->Recognize(0);

識(shí)別結(jié)果的處理稍微復(fù)雜點(diǎn)。一般的應(yīng)用如果只想得到所有文字,只要調(diào)用GetUTF8Text()就完了。但是我想知道每一行的文字,它們的具體位置以及可信度,就需要對(duì)識(shí)別結(jié)果進(jìn)行詳細(xì)的分析。幸運(yùn)的是Tesseract提供了iterator接口,可以返回不同粒度的數(shù)據(jù)。這里我選擇了按行輸出,即RIL_TEXTLINE。?

PyObject* l = PyList_New(0);tesseract::ResultIterator* it = api->GetIterator();it->Begin();while(1) {char* utf8_text;int left, top, right, bottom;int confidence = 0;utf8_text = it->GetUTF8Text(tesseract::RIL_TEXTLINE);if (utf8_text == NULL)break;confidence = it->Confidence(tesseract::RIL_TEXTLINE);it->BoundingBox(tesseract::RIL_TEXTLINE, &left, &top, &right, &bottom);PyObject* t = Py_BuildValue("(siiiii)", utf8_text,left, top, right, bottom, confidence);PyList_Append(l, t);delete []utf8_text;it->Next(tesseract::RIL_TEXTLINE);}api->End();PyObject* o = Py_BuildValue("O", l);return o;

返回的是一個(gè)list,其每個(gè)元素都是一個(gè)tuple,代表識(shí)別出來的文字行,包括文字、位置和可信度。

最后不要忘了include需要的頭文件,并在鏈接選項(xiàng)里加入需要的庫。

#include "Python.h" #include <tesseract/baseapi.h> #include <tesseract/resultiterator.h>

具體如何編譯tesseract可以參考https://code.google.com/p/tesseract-ocr/wiki/Compiling/?

在示例代碼里我們并沒有用到任何圖形庫。但是因?yàn)橐褂肨esseract就必須鏈接leptonica庫,所以需要加入鏈接選項(xiàng)-llept。

如果你想在擴(kuò)展里使用leptonica的功能可以include <leptonica/allheaders.h>。或者你想使用openCV,可以include <opencv2/opencv.hpp>并鏈接-lopencv_XXXXX。

?

這樣代碼部分算是完成了。不過接下來還有一步,我們需要打包完成一個(gè)Python擴(kuò)展使之容易編譯和安裝。可以使用distutils模塊。

from distutils.core import setup, Extensiontessenigma = Extension ('tessex', sources=['tessex.cpp'],include_dirs = ['/usr/local/include'],libraries=[ 'tesseract'], library_dirs=['/usr/local/lib'] )setup (name='tessex', version='1.0',description='This is a tesseract extensiion.',ext_modules = [tessex])

把這些定義寫入一個(gè)setup.py文件里。這樣我們就可以用通常的方式編譯和安裝模塊了。編譯用setup.py build。一個(gè)動(dòng)態(tài)鏈接庫會(huì)生成。例如在Linux下面就是tessex.so。安裝模塊使用setup.py install。前面生成的庫文件會(huì)被復(fù)制到Python的site-packages下面。當(dāng)然你也可以手動(dòng)復(fù)制到$PYTHONPATH路徑下面,一樣能被Python找到。

?

安裝好擴(kuò)展后,在Python里是這樣調(diào)用的,假定我們使用一個(gè)openCV圖像:

import tessex
import cv

cv_img = cv.LoadImage(path, cv.CV_LOAD_IMAGE_COLOR)

lines = tessex.recognize(data=cv_img.tostring(),w=cv_img.width,h=cv_img.height,channels=cv_img.nChannels, step=cv_img.width * cv_img.nChannels * cv_img.depth / 8)for line in lines:line_text, left, top, right, bottom, confidence = line

通過Tesseract擴(kuò)展,可以在Python中比較方便地識(shí)別圖像中的文字以及位置,對(duì)基于圖像識(shí)別的自動(dòng)化測(cè)試是很有幫助的。

?

轉(zhuǎn)載于:https://www.cnblogs.com/silmerusse/p/3196301.html

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的编写Tesseract的Python扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。