2015年11月26日 星期四

Character and Text Recognition using OpenCV

Character and Text Recognition using OpenCV

字元辨識(OCR)算是在影像處理中比較成熟的一個部分,但一直都沒機會玩看看,剛好最近在玩OpenCV 3.0,OCR也已經被包裝好在API中,所以今天就來稍微玩一下字元(CHAR)跟單字(TEXT)的辨識,首先,比較麻煩的是OpenCV 3.0後把很多功能都搬到contrib,所以要使用許多API必須先Build contrib module。

字元辨識必須先自己將字元切割出來,preprocessing 的部分就靠自己的努力了,不過還是有相關sample可以參考,我後來也會慢慢把它弄出來,我的玩法剛好相反,會這樣講的原因是因為這是比較成熟的技術,不怕找不到演算法把他實做出來。

那單字(TEXT)的辨識,API所提供的的方法可以將整張影像丟進去直接辨識,但也會較不準確,我還是建議先切割好在做辨識。


scenetext_char01

scenetext_word01

辨識結果:Text結果為HINA是因為他不認識這個單字,可以透過API新增該單字
以下是我包裝過後的API使用方法:

#include <iostream>
#include <TEXTRecognizer.h>

void main()
{
    TEXTRecognizer textHandler;
//    std::vector<std::string> lexicon;
//    lexicon.push_back(std::string("CHINA"));
//    textHandler.initialize( lexicon );
    textHandler.initialize();


    cv::Mat charMat = cv::imread("scenetext_char01.jpg");
    std::string str;
    double confidence;
    textHandler.charDecode( charMat, str, confidence);
    std::cout << "Character = " << str << ", Confidence = " << confidence << std::endl;


    cv::Mat txtMat = cv::imread("scenetext_word01.jpg");
    std::string output;
    float confidences;
    textHandler.textDecode( txtMat, output, confidences);
    std::cout << "Text = "<< output <<", Confidence = "<<confidences<< std::endl;

}

完整的專案: Github

更多OpenCV文章請參考:OpenCV Tutorial (學習筆記)

7 則留言:

  1. 請問裝好OpenCV3.0後還要做甚麼才能用OCR?
    "許多API必須先Build contrib module"是甚麼意思?

    回覆刪除
    回覆
    1. 因為OpenCV 3版本以後把很多功能搬到contrib底下,有需要才要編譯。
      你可以參考https://github.com/MarcWang/Computer-Vision/tree/master/samples/opencv_text_recognition

      刪除
    2. 請問一下我裝好contrib了 直接複製github裡面的cpp跟標頭檔
      執行時發生了警告跟錯誤請問要怎麼解(使用QT VS2015一樣)
      'TEXTRecognizer::_ocrProc': struct 'cv::Ptr'
      必須有 DLL 介面,才能被為 class 'TEXTRecognizer' 的用戶端使用


      main.obj:-1: error: LNK2019:
      無法解析的外部符號 "public: __cdecl TEXTRecognizer::~TEXTRecognizer(void)"
      (??1TEXTRecognizer@@QEAA@XZ) 在函式 main 中被參考

      刪除
    3. Build的時候必須要加入參考才算有BUILD進去,不知道是否有漏掉。

      刪除
  2. 謝謝大大回復,後來GOOGLE一下發現用cmake安裝contrib時有個Tesseract: NO 如圖
    http://i.imgur.com/baSCyIO.png

    GOOGLE許久都不知道 這方面要安裝搜尋大多舊版而且無關OPENCV的

    後來自己亂摸 安裝Tesseract3.05版
    OCRTesseract::create指到C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"就可以辨識了....= =??
    程式如以下


    Mat img = imread("D:\\2906.png");
    if (!img.data)
    return false;
    cv::Ptr t = cv::text::OCRTesseract::create("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");
    std::string result;
    t->run(img, result);
    std::cout << result << std::endl;
    imshow("tmp", img);
    waitKey();
    return 0;

    還是很疑惑 這樣跟別人經過VS2015編譯有什麼差別

    回覆刪除
  3. 大大請問一下 後來我使用您的程式發生些錯誤

    我是直接用 這個github 載他CMAKE contrib過的OPENCV 額外編譯Tesseract Version:3.05
    https://github.com/cesardelgadof/OpenCVBinaries (看裡面有tesseract305.dll)

    執行時都錯在這一行
    _ocrProc = cv::text::loadOCRHMMClassifierCNN("OCRBeamSearch_CNN_model_data.xml.gz");
    訊息顯示找不到"OCRBeamSearch_CNN_model_data.xml.gz"
    可是他編譯過的



    大大請問一下 後來我使用您的程式發生些錯誤

    我是直接用 這個github 載他CMAKE contrib過的OPENCV 額外編譯Tesseract Version:3.05
    https://github.com/cesardelgadof/OpenCVBinaries (看裡面有tesseract305.dll)

    執行時都錯在這一行
    _ocrProc = cv::text::loadOCRHMMClassifierCNN("OCRBeamSearch_CNN_model_data.xml.gz");
    訊息顯示找不到"OCRBeamSearch_CNN_model_data.xml.gz"

    我搜尋裡面檔案都沒有"OCRBeamSearch_CNN_model_data.xml.gz"
    後來看了您github有需要
    OCRBeamSearch_CNN_model_data.xml.gz
    OCRHMM_knn_model_data.xml.gz
    OCRHMM_transitions_table.xml

    看這三個檔案是在opencv_contrib-master\modules\text\samples 裡面才有
    我找一下他編譯過的opencv Binaries沒有這三個檔案

    可是我們用編譯過的檔案怎麼缺少這三個檔案
    如果要使用您的程式要怎麼做才好

    謝謝您!!

    回覆刪除
  4. 實在抱歉 我後來把contrib裡面的OCRBeamSearch_CNN_model_data.xml.gz ..三個檔案直接加進專案就可以了
    抱歉因為我試了蠻多天一直用不出來才想在這裡問您 這不止要另外裝contrib還要另外裝text 雖然成功了 還是很多不懂的地方

    回覆刪除