前言
最近做一些字符識別的事情,想試一下opencv_contrib里的Text(自然場景圖像中的文本檢測與識別)模塊。
我參照了網上的一些教程去編譯opencv+opencv_contrib,但是最后去跑樣例程序(比如end_to_end_recognition.cpp ),在運行生成的exe文件時會提示OCRTesseract(33): Tesseract not found.
類似的錯誤。
其原因 [1] 是Text模塊中的字符識別部分使用的是Tesseract OCR,因此在使用CMake編譯生成OpenCV項目文件時,應該確保它能找到Tesseract.
也就是需要先編譯好Tesseract,接著告訴CMake你的Tesseract在哪(包括它的頭文件.h以及lib文件),然后再編譯OpenCV.
最終運行樣例程序得到的端到端字符識別效果圖如下:
目錄結構:
- 安裝依賴
- 編譯Tesseract
- 使用CPPAN下載依賴包
- 使用cmake-gui進行編譯
- 用VS編譯生成debug和release庫
- 編譯opencv+opencv_contrib
- 測試end_to_end_recognition
- 把OpenCV庫文件配置到到項目中
- 運行樣例程序
以下是我的具體步驟:(下面的方法是我自己試過可行的,不保證方法一定很簡潔,應該說確實有些繁瑣,因為我對編譯源碼經驗也一般,我想肯定有更加簡潔的方法可以辦到)
事實上,我已經找到了更加簡潔的方法,對手動編譯沒興趣的同學,可以直接移步
安裝依賴
- Windows 10 / 64-bit
- VS2017 Community https://www.visualstudio.com/zh-hans/vs/
- CMake最新版 https://cmake.org/download/ (我選的是cmake-3.8.2-win64-x64.msi)
- CPPAN最新版 https://cppan.org/client/ (cppan-master-Windows-client.zip)
- Tesseract 3.05.01 https://github.com/tesseract-ocr/tesseract/releases/tag/3.05.01
- OpenCV 3.2.0 https://github.com/opencv/opencv/releases/tag/3.2.0)
- OpenCV_contrib 3.2.0 https://github.com/opencv/opencv_contrib/releases/tag/3.2.0(和opencv的版本對應)
注意在安裝VS2017的時候需要勾選使用C++的桌面開發這個選項,否則后面用CMake編譯的時候可能會提示找不到C++編譯器。(估計應該就是需要右邊小紅框里的那個東西,但是保險起見我還是全裝了=-=)
編譯Tesseract
下載完源代碼之后,我習慣先創建3個文件夾sources, build 和 install 分別用來存放解壓出來的源代碼、以及之后會編譯輸出的工程文件和安裝文件。
使用CPPAN下載依賴包
在用CMake(cmake-gui)編譯tesseract源代碼之前,需要先用CPPAN下載依賴項,首先打開命令行提示工具(cmd):
d:
cd path_to_tesseract //比如我的是 D:\Tesseract\sources
cppan //下載依賴的軟件包,如leptonica等
CPPAN感覺就是一個C++的包管理器,類似于Java的Maven、JavaScript的npm. 我也是第一次接觸,看了tesseract的官方編譯文檔才知道有這么個神奇的東西。
當在tesseract根目錄下運行cppan
時,它會讀取cppan.yml文件中所規定的項目的依賴項(如下圖所示),幫你下載好需要的依賴包和初始化編譯器配置。具體可以參考CPPAN官方文檔
使用cmake-gui進行編譯
打開cmake-gui進行編譯:
- 在where is the source code中選擇tesseract的源碼路徑,比如我的是
D:/Tesseract/sources
- 在where to build the binaries里面選擇你要編譯到的路徑,例如
D:/Tesseract/build
- 點擊Configure,這時會彈出一個對話框,讓你設置生成器,選擇Visual Studio 15 2017 Win64,點擊Finish,這個時候CMake會開始在build目錄下生成一些配置文件,如 CMakeCache.txt 等。
- 完成之后會在屏幕中間出現一堆Name和Value的參數,找到CMAKE_INSTALL_PREFIX 將其設置成你想要的安裝路徑,例如
D:/Tesseract/install
- 再次點擊Configure,然后點擊Generate,這時你可以看到在build目錄下已經生成了名為tesseract.sln的VS工程(就是這么神奇-)。
用VS編譯生成debug和release庫
- 打開build目錄下的tesseract.sln的VS工程(直接在cmake-gui中點開Open Project是一樣的)
- 編譯生成Debug版本庫:首先選擇Debug生成模式, 找到CMakeTargets中的ALL_BUILD,點擊右鍵–>生成解決方案。這一步會需要一些時間,之后你會在build/bin/Debug目錄下看到新生成了很多文件,其實這時候tesseract已經可以用了(前提是在此目錄下面下載好訓練數據文件)。
- 生成安裝文件:找到CMakeTargets中的INSTALL,然后右鍵選擇僅限于項目–>僅生成INSTALL,然后在
D:\Tesseract\install
中就會看到生成好生成頭文件和可執行文件等。 - Release版本的方法相同,選擇Release模式,重復2、3即可。
- 編譯錯誤解決: 在編譯生成過程中可能會遇到因為文件編碼問題而產生的錯誤,一個出錯的地方是pango-language-sample-table.h ,需要改成UTF-8 編碼;另一個是equationdetect.cpp,需要改成ANSI/OEM-簡體中文 GBK編碼。
有同學可能想說,那我直接點擊僅生成INSTALL行不行? 你可以自己嘗試一下,答案是不行的??
其實感覺這一套流程,和在Linux系統上用命令打
./configure, make, make install...
之類的應該是對應的,只是這里改成了在Windows上用CMake、VS等圖形化界面地去完成了這些事情。
有些尬尷的是,這個時候tesseract還不能用,主要是要解決兩個問題:
-
如果你在命令行中install/bin目錄下輸入
tesseract phototest.tif stdout
(phototest是一張待識別的字符圖片,stdout表示將識別結果輸出到標準輸出即在命令行中直接顯示), 會提示丟失pvt.cppan.demo.danbloomberg.leptonica-1.74.4.dll等一系列dll的錯誤。
這里我的解決辦法比較笨(感覺應該可以通過一些配置,讓VS自己拷貝過去),就是直接把build/bin下的dll全部拷貝過去,放到install/bin路徑下。
tesseract_error
phototest
copy_dlls.gif 再次執行
tesseract phototest.tif stdout
,會提示如下所示的另一個問題,找不到訓練數據文件\Tesseract\install\bin\tessdata/eng.traineddata.
D:\Tesseract\install\bin>tesseract phototest.tif stdout
Error opening data file \Tesseract\install\bin\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.
解決辦法就是到tesseract官網的數據下載頁面下載Tesseract 3.05 對應的訓練數據 eng.traineddata, 然后在install/bin目錄下新建tessdata文件夾,并放入下載好的數據文件eng.traineddata,這樣tesseract就可以用了。
D:\Tesseract\install\bin>tesseract phototest.tif stdout
Page 1
This is a lot of 12 point text to test the
cor code and see if it works on all types
of file format.
The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
(注:這里可以先將tesseract的bin路徑(如:D:\Tesseract\install\bin
)加入到環境變量PATH中,因為后面跑樣例程序的時候會用到,否則會報錯。)
編譯opencv+opencv_contrib
編譯方法和上面tesseract的步驟非常類似,同樣是先用cmake-gui編譯,然后用VS生成庫文件(先ALL_BUILD,再INSTALL),基本就是照著上面的流程再來一遍。
只是在cmake編譯時的一些配置項不同,尤其重要的是你要告訴CMake你的opencv_contrib和tesseract在哪,具體見下表。
Name | Value(根據你自己的路徑修改) | 備注 |
---|---|---|
OPENCV_EXTRA_MODULES_PATH | D:/OpenCV/sources/modules/contrib/modules | opencv_contrib的路徑 |
CMAKE_INSTALL_PREFIX | D:/OpenCV/install | 目標安裝路徑 |
Tesseract_INCLUDE_DIR | D:/Tesseract/install/include | tesseract頭文件路徑 |
Tesseract_LIBRARY | D:/Tesseract/install/lib/tesseract305.lib | tesseract lib路徑 |
注:
- 在使用cmake-gui的時候可能需要多點幾次
Configure
,因為有些配置項一開始可能找不到。 - 在用VS生成OpenCV庫文件時,根據不同的編譯模式需要指定對應的tesseract的 lib 文件,tesseract305.lib表示release版本,后面加d的tesseract305d.lib為debug版本。
- opencv_contrib解壓出來的文件名是opencv_contrib_3.2.0,我改成了contrib.
完成之后同樣將OpenCV的bin路徑(例如D:\OpenCV\install\x64\vc15\bin
)加入環境變量PATH,否則運行生成的exe時,會提示找不到相關的 dll 文件。因為你需要把路徑寫入到PATH,操作系統才知道要去哪里加載它們 [2] 。
故事進行到這里所有的編譯工作就已經結束了,下面就可以開啟新篇章,開始在vs中跑樣例程序了??
測試end_to_end_recognition
首先新建一個VS工程(例如叫 textCV ),空項目就行。新建一個源文件,例如source.cpp,把end_to_end_recognition.cpp 里的代碼拷貝進去。
把OpenCV庫文件配置到到項目中
這步的目的大概就是告訴VS你的opencv頭文件和lib庫在哪,否則沒法編譯生成EXE可執行文件 [3] 。
我是通過添加本地項目屬性表來實現的,首先點擊視圖 –>屬性管理器,接著點開屬性管理器頁面,找到Release|x64 右鍵添加新項目屬性表,然后在新建的屬性表上右鍵–>屬性, 在彈出的屬性配置頁面(見下面的示意圖),做如下配置:
- C/C++目錄–>通用–>附加包含目錄,添加opencv頭文件目錄(共3個),例如:
D:\OpenCV\install\include
D:\OpenCV\install\include\opencv
D:\OpenCV\install\include\opencv2
-
鏈接器–>常規–>附加庫目錄,添加opencv lib庫目錄,例如:
D:\OpenCV\install\x64\vc15\lib
-
鏈接器–>輸入–>附加依賴項,添加opencv庫文件:
以Release生成模式為例,命令行輸入dir /b *0.lib
得到一個完整的列表如下(Debug版的文件名為opencv_*d.lib):
opencv_aruco320.lib
opencv_bgsegm320.lib
opencv_bioinspired320.lib
opencv_calib3d320.lib
opencv_ccalib320.lib
opencv_core320.lib
opencv_datasets320.lib
opencv_dnn320.lib
opencv_dpm320.lib
opencv_face320.lib
opencv_features2d320.lib
opencv_flann320.lib
opencv_fuzzy320.lib
opencv_highgui320.lib
opencv_imgcodecs320.lib
opencv_imgproc320.lib
opencv_line_descriptor320.lib
opencv_ml320.lib
opencv_objdetect320.lib
opencv_optflow320.lib
opencv_phase_unwrapping320.lib
opencv_photo320.lib
opencv_plot320.lib
opencv_reg320.lib
opencv_rgbd320.lib
opencv_saliency320.lib
opencv_shape320.lib
opencv_stereo320.lib
opencv_stitching320.lib
opencv_structured_light320.lib
opencv_superres320.lib
opencv_surface_matching320.lib
opencv_text320.lib
opencv_tracking320.lib
opencv_video320.lib
opencv_videoio320.lib
opencv_videostab320.lib
opencv_xfeatures2d320.lib
opencv_ximgproc320.lib
opencv_xobjdetect320.lib
opencv_xphoto320.lib
P.S. 可以在Windows命令行中用
tree /f
或者是dir /b
得到一個文件夾下的所有文件名 [4] 。
運行樣例程序
配置完成后點擊生成–>生成解決方案,VS會在項目文件夾的x64/Release目錄下生成textCV.exe
此時還需要做最后兩件事就是,就是拷貝以下文件到textCV.exe所在文件目錄:
- 在你的opencv_contrib的text模塊的samples文件夾中(如
D:\OpenCV\sources\modules\contrib\modules\text\samples
)找到以下三個文件trained_classifierNM2.xml、trained_classifierNM1.xml和scenetext01.jpg,并拷貝到項目的x64/Release目錄(或是在D:\OpenCV\build\testdata\contrib\text
目錄中也可以找到) - 在x64/Release目錄中新建tessdata文件夾,然后將eng.traineddata放進去。
最后在命令行窗口中x64/Release目錄下運行 testCV scenetext01.jpg
,就大功告成了??~
參考
- https://www.polarxiong.com/archives/Tesseract-3-05%E5%8F%8A%E4%B9%8B%E5%90%8E%E7%89%88%E6%9C%AC%E7%BC%96%E8%AF%91%E7%94%9F%E6%88%90%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93DLL.html
- https://segmentfault.com/a/1190000003496009
- http://docs.opencv.org/master/d6/d8a/tutorial_windows_visual_studio_Opencv.html