天天看點

Tesseract-OCR 的安裝與使用

上篇博文寫到爬取教務系統擷取資訊時,登入時的驗證碼是手動輸入的,是以就想試試能不能自别識别驗證碼并填充。查閱了很多資訊,選取了Tesseract。

What is Tesseract ?

Tesseract是能夠運作在多種作業系統上的開源ORC(Optical Character Recognition , 光學字元識别)引擎,目前由Google維護,是最精确的開源ORC引擎之一。與Microsoft Office Document Imaging(MODI)相比,我們可以不斷地訓練,使圖像轉換文本的能力不斷增強;如果團隊深度需要,還能以它為模闆,開發出符合自身需求的OCR引擎。

How to use Tesseract

1. 安裝

ubuntu 下可以直接進行安裝

安裝圖像解析的包

sudo apt-get install libpng12-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libtiff4-dev
           

檢視是否安裝成功

limeng@KID:~$ tesseract --version
tesseract .-beta.--g607e
 leptonica-.
  libjpeg b (libjpeg-turbo .) : libpng . : libtiff . : zlib . : libwebp . : libopenjp2 .
 Found AVX2
 Found AVX
 Found SSE
           

其他發行版參考GitHub教程:https://github.com/tesseract-ocr/tesseract/wiki

2. 使用

tesseract imagename|imagelist|stdin outputbase|stdout [options...] [configfile...]
           

以下内容為本人自己翻譯,有可能不準确,有能力直接看英文使用手冊即可。

OCR 的一些參數:

參數 作用
-l LANG[+LANG] 指定ORC使用的語言。
-c VAR=VALUE 指定一些配置,支援多組-c參數。
–psm N 指定分割模式。
–oem N 指定OCR引擎模式。
–tessdata-dir PATH 指定tessdata的位置。
–user-words PATH 指定user words file的位置。
–user-patterns PATH 指定patterns file的位置。

注意: 選項的使用要在任何配置檔案前。

頁面分割的模式:

code function
隻做方向和腳本的檢測 (OSD)。
1 使用OSD自動分割。
2 自動分割,但不是用OSD或OCR。
3 完全自動分割,但不是用OSD。(預設情況)
4 假定是可變大小的單列文本。
5 假定是個包含垂直對齊文本的整齊的塊。
6 假定是個整齊的塊。
7 把圖像視為一行文字。
8 把圖像視為單個單詞。
9 将圖像視為圓圈中的單個單詞。
10 把圖像視為單個字元。
11 稀疏文字,找到盡可能多的文本,不以特定的順序。
12 稀疏文字,利用OSD處理。
13 原生線,通過傳遞Tesseract特殊的資訊把圖像視為單一的文本行。

OCR 引擎模式:

code function
隻用傳統引擎
1 隻用神經網絡LSTM引擎
2 傳統 + LSTM 引擎
3 預設(預設),基于有哪個引擎

在網上找了一個比較好識别的圖檔,如下:

Tesseract-OCR 的安裝與使用

識别結果如下:

limeng@KID:~/Desktop$ tesseract test.jpg result -l eng --psm  digits
Tesseract Open Source OCR Engine v4..-beta.--g607e with Leptonica
limeng@KID:~/Desktop$ cat result.txt 

           

因為沒有對圖檔灰階化、二值化、降噪等處理,直接識别不能保證很準确。

在程式中使用

直接用調用上面用到的指令

//OCR的使用是以指令方式調用
    public static String getImgText(String imgPath) {
        String result = "";
        BufferedReader br = null;
        //識别語言
        String ocrLangData = "-l eng";
        String outPath = imgPath.substring(, imgPath.lastIndexOf("."));
        File file = new File(outPath + ".txt");
        try {
            //終端執行
            Runtime runtime = Runtime.getRuntime();
            String command = "tesseract " + imgPath + " " + outPath +" "+ ocrLangData +" digits";
            Process ps = runtime.exec(command);
            ps.waitFor();
            //讀取檔案
            br = new BufferedReader(new FileReader(file));
            String temp = "";
            StringBuffer sb = new StringBuffer();
            while ((temp = br.readLine()) != null) {
                sb.append(temp);
            }
            //儲存識别結果
            result = sb.toString();
        } catch (Exception e) {
            System.out.println("識别圖檔異常!");
            e.printStackTrace();
        }finally{
            try {
                br.close();
                file.delete();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
           

Summary

自己以前并沒有接觸過模式識别過一塊,隻稍微了解了一下,看了李飛飛(斯坦福計算機視覺實驗室負責人)在TED的演講,感覺如何研究計算機識别圖檔并了解圖檔是蠻有趣的,但是感覺自己差很多東西,畢竟自己沒有接觸過AI(Artificial Intelligence)和深度學習(Deep learning)等。

以前總感覺它們太遙遠,其實就在我們身邊。

References

Tesseract-Wikipedia(software)

GitHub中Tesseract的Wiki

Tesseract的man手冊

繼續閱讀