zoukankan      html  css  js  c++  java
  • Leptonica在VS2010中的编译及简单使用举例

    在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;
    }


    GitHubhttps://github.com/fengbingchun/Liblept_Test


  • 相关阅读:
    [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
    [JZOJ3337] 【NOI2013模拟】wyl8899的TLE
    UVA 1262 Password
    UVA 10820 Send a Table
    UVA 12716 GCD XOR
    UVA 10791
    UVA 10375 choose and divide (唯一分解定理)
    欧拉函数
    51 Nod 1069 Nim游戏
    51 Nod 1242 矩阵快速幂求斐波那契数列
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5395994.html
Copyright © 2011-2022 走看看