在tesseract-ocr中會用到leptonica庫。這里對leptonica簡介下。
Leptonica是一個開源的圖像處理和圖像分析庫,它的license是BSD 2-clause。它主要包括的操作有:位圖操作、仿射變換、形態學操作、連通區域填充、圖像變換及像素掩模、融合、增強、算術運算等操作。
在使用Leptonica的時候,它依賴於開源的zlib、libjpeg、libpng、libtiff、giflib。
zlib是一個非常好的壓縮、解壓縮庫。
它的license是zlib授權,相似BSD。
libjpeg是一個全然用C語言編寫的庫,包括了被廣泛使用的JPEG解碼、JPEG編碼和其他的JPEG功能的實現。它的license相似BSD。
libpng是官方的PNG參考庫,它支持差點兒全部的PNG功能,它也是可擴展的。它使用zlib庫作為壓縮引擎。
它的license是permissive free software license。相似BSD。
libtiff是一個用來讀寫TIFF文件的開源庫,它依賴於libjpeg和zlib。它的license是BSD。
giflib是一個讀、寫GIF圖像的開源庫,它的license相似BSD。
以下具體介紹Leptonica的編譯步驟:
1. 從http://www.zlib.net/ 下載最新的zlib-1.2.8源代碼,新建zlib靜態庫project,將/zlib-1.2.8文件夾下的.h、.c文件增加到此project中。編譯生成zlib靜態庫;
2. 從http://www.libpng.org/pub/png/libpng.html下載最新的libpng-1.6.16。新建libpng靜態庫project,將/lpng1616文件夾下的.h、.c文件增加到此project中,將/lpng1616/scripts文件夾下的pnglibconf.h.prebuilt文件復制到/lpng1616文件夾下。並改動文件名稱為pnglibconf.h,將此文件也增加到此project中,將pngstruct.h文件里zlib.h改成正確的存放路徑,編譯生成libpng靜態庫。
3. 從http://www.ijg.org/files/ 下載最新的jpeg-9a源代碼,新建ligjpeg靜態庫project,將/jpeg-9a文件夾下的.h、.c文件增加到此project中(jmemdos.c和jmemmac.c文件除外),將jconfig.vc重命名為jconfig.h,將此文件也增加到此project中,編譯生成libjpeg靜態庫。
4. 從ftp://ftp.remotesensing.org/pub/libtiff下載穩定版的tiff-4.0.3源代碼,新建libtiff靜態庫project,將/tiff-4.0.3/libtiff文件夾下對應的.h、.c文件增加到此project中,將tiff_config.vc.h、tiffconf.vc.h分別重命名為tiff_config.h、tiffconf.h,將此兩個文件也增加到此project中,編譯生成libtiff靜態庫;
5. 從http://sourceforge.net/projects/giflib/下載最新的gitlib-5.1.1源代碼,新建giflib靜態庫project。將/giflib-5.1.1文件夾下對應的.h、.c文件增加到此project中,對源文件進行調整。將源文件里用到#include <stdbool.h>的地方,用以下語句替換。
//#include <stdbool.h> #ifndef __cplusplus typedef int bool; #define false 0 #define true 1 #endif
將文件里用到的#include<unistd.h>的地方均凝視掉。編譯生成giflib靜態庫;
6. 從http://www.leptonica.org/download.html下載最新的leptonica-1.71源代碼,新建liblept靜態庫project,將/leptonica-1.71/src文件夾下對應的.h、.c文件增加到此project中。調整:(1)、將zlib、libtiff、libpng、gif_lib.h、jpeglib.h相關頭文件通過project配置(C/C++-->Additional Include Directories)增加到此project;(2)、將environ.h文件里的#defineHAVE_LIBGIF 0改為#define HAVA_LIBGIF 1 使其支持Gif圖像格式。(3)、有些文件會出現奇怪的C2275和C2146錯誤。解決方法,找到出錯處,將全部變量的聲明放在函數的開頭就可以。(4)、有些文件會出現奇怪的C2057錯誤,解決方法,凝視掉相似的static const l_int32 L_BUF_SIZE = 52;新建一個redefineconstant.h文件,將此文件包括到出現此問題的文件里。redefineconstant.h文件的內容為:
#ifndef _REDEFINE_CONSTANT_H #define _REDEFINE_CONSTANT_H #include "allheaders.h" #define L_BUF_SIZE 512 #define MAX_ALLOWED_DILATION 25 #endif // _REDEFINE_CONSTANT_H
7. 新建liblepttest控制台project。對liblept庫進行簡單測試,相關文件代碼例如以下:
stdafx.h:
#pragma once #include "targetver.h" #include <stdio.h> #include "../../../ImgCore/src/zlib/zlib-1.2.8/zlib.h" #include "../../../ImgCore/src/libpng/lpng1616/png.h" #include "../../../ImgCore/src/libjpeg/jpeg-9a/jpeglib.h" #include "../../../ImgCore/src/libtiff/tiff-4.0.3/libtiff/tiff.h" #include "../../../ImgCore/src/giflib/giflib-5.1.1/lib/gif_lib.h" #include "../../src/leptonica-1.71/src/allheaders.h"
stdafx.cpp:
#include "stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file #ifdef _DEBUG #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/zlib[dbg_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libpng[dbg_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libjpeg[dbg_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libtiff[dbg_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/giflib[dbg_x86_vc10].lib") #pragma comment(lib, "../../../lib/dbg/x86_vc10/liblept[dbg_x86_vc10].lib") #else #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/zlib[rel_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libpng[rel_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libjpeg[rel_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libtiff[rel_x86_vc10].lib") #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/giflib[rel_x86_vc10].lib") #pragma comment(lib, "../../../lib/rel/x86_vc10/liblept[rel_x86_vc10].lib") #endif
liblepttest.cpp:
#include "stdafx.h" #include <iostream> #include <string> using namespace std; static const l_float32 ANGLE1 = 3.14159265 / 12.; void RotateTest() { string strSrc = "../../../testdata/weasel.png"; string strDst = "../../../testdata/dst.gif"; PIX* pixs = pixRead(strSrc.c_str()); if (pixs == NULL) { cout<<" read image error "<<endl; return; } l_int32 w, h, d; pixGetDimensions(pixs, &w, &h, &d); PIX* pixd = pixRotate(pixs, ANGLE1, L_ROTATE_SHEAR, L_BRING_IN_WHITE, w, h); pixWrite(strDst.c_str(), pixd, IFF_GIF); pixDestroy(&pixs); pixDestroy(&pixd); } void EdgeTest() { string strSrc = "../../../testdata/marge.jpg"; string strDst = "../../../testdata/dst.bmp"; PIX* pixs = pixRead(strSrc.c_str()); if (pixs == NULL) { cout<<" read image error "<<endl; return; } l_int32 w, h, d; pixGetDimensions(pixs, &w, &h, &d); if (d != 8) { cout<<"pixs not 8 bpp"<<endl; return; } PIX* pixf = pixSobelEdgeFilter(pixs, L_HORIZONTAL_EDGES); PIX* pixd = pixThresholdToBinary(pixf, 10); pixInvert(pixd, pixd); pixWrite(strDst.c_str(), pixd, IFF_BMP); pixDestroy(&pixs); pixDestroy(&pixf); pixDestroy(&pixd); } int main(int argc, char* argv[]) { RotateTest(); EdgeTest(); cout<<"ok!"<<endl; return 0; }
GitHub:https://github.com/fengbingchun/Liblept_Test