在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
#ifndef __cplusplus
typedef int bool;
#define false 0
#define true 1
#endif 将文件里用到的#include
#define _REDEFINE_CONSTANT_H
#include "allheaders.h"
#define L_BUF_SIZE 512
#define MAX_ALLOWED_DILATION 25
#endif // _REDEFINE_CONSTANT_H7. 新建liblepttest控制台project。对liblept库进行简单測试,相关文件代码例如以下:stdafx.h:#pragma once
#include "targetver.h"
#include
#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")
#endifliblepttest.cpp:#include "stdafx.h"
#include
#include
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 "< 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 "< return; } l_int32 w, h, d; pixGetDimensions(pixs, &w, &h, &d); if (d != 8) { cout<<"pixs not 8 bpp"< 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!"< return 0; } GitHub:https://github.com/fengbingchun/Liblept_Test
发表评论