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

    Leptonica在VS2010中的编译及简单使用举例

     
    转载地址:http://blog.csdn.net/fengbingchun/article/details/44275233
     

    在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静态库工程,将/zlib-1.2.8目录下的.h、.c文件加入到此工程中,编译生成zlib静态库;

    2.        从http://www.libpng.org/pub/png/libpng.html下载最新的libpng-1.6.16,新建libpng静态库工程,将/lpng1616目录下的.h、.c文件加入到此工程中,将/lpng1616/scripts目录下的pnglibconf.h.prebuilt文件拷贝到/lpng1616目录下,并修改文件名为pnglibconf.h,将此文件也加入到此工程中,将pngstruct.h文件中zlib.h改成正确的存放路径,编译生成libpng静态库;

    3.        从http://www.ijg.org/files/ 下载最新的jpeg-9a源码,新建ligjpeg静态库工程,将/jpeg-9a目录下的.h、.c文件加入到此工程中(jmemdos.c和jmemmac.c文件除外),将jconfig.vc重命名为jconfig.h,将此文件也加入到此工程中,编译生成libjpeg静态库;

    4.        从ftp://ftp.remotesensing.org/pub/libtiff下载稳定版的tiff-4.0.3源码,新建libtiff静态库工程,将/tiff-4.0.3/libtiff目录下相应的.h、.c文件加入到此工程中,将tiff_config.vc.h、tiffconf.vc.h分别重命名为tiff_config.h、tiffconf.h,将此两个文件也加入到此工程中,编译生成libtiff静态库;

    5.        从http://sourceforge.net/projects/giflib/下载最新的gitlib-5.1.1源码,新建giflib静态库工程,将/giflib-5.1.1目录下相应的.h、.c文件加入到此工程中,对源文件进行调整,将源文件中用到#include <stdbool.h>的地方,用以下语句替换,

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. //#include <stdbool.h>  
    2. #ifndef __cplusplus  
    3.     typedef int bool;  
    4.     #define false 0  
    5.     #define true 1  
    6. #endif  

             将文件中用到的#include<unistd.h>的地方均注释掉,编译生成giflib静态库;

    6.        从http://www.leptonica.org/download.html下载最新的leptonica-1.71源码,新建liblept静态库工程,将/leptonica-1.71/src目录下相应的.h、.c文件加入到此工程中,调整:(1)、将zlib、libtiff、libpng、gif_lib.h、jpeglib.h相关头文件通过工程配置(C/C++-->Additional Include Directories)加入到此工程;(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文件的内容为:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #ifndef _REDEFINE_CONSTANT_H  
    2. #define  _REDEFINE_CONSTANT_H  
    3.   
    4. #include "allheaders.h"  
    5.   
    6. #define L_BUF_SIZE 512  
    7. #define MAX_ALLOWED_DILATION 25  
    8.   
    9. #endif // _REDEFINE_CONSTANT_H  

    7. 新建liblepttest控制台工程,对liblept库进行简单测试,相关文件代码如下:

    stdafx.h:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #pragma once  
    2.   
    3. #include "targetver.h"  
    4.   
    5. #include <stdio.h>  
    6.   
    7. #include "../../../ImgCore/src/zlib/zlib-1.2.8/zlib.h"  
    8. #include "../../../ImgCore/src/libpng/lpng1616/png.h"  
    9. #include "../../../ImgCore/src/libjpeg/jpeg-9a/jpeglib.h"  
    10. #include "../../../ImgCore/src/libtiff/tiff-4.0.3/libtiff/tiff.h"  
    11. #include "../../../ImgCore/src/giflib/giflib-5.1.1/lib/gif_lib.h"  
    12. #include "../../src/leptonica-1.71/src/allheaders.h"  

    stdafx.cpp:
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include "stdafx.h"  
    2.   
    3. // TODO: reference any additional headers you need in STDAFX.H  
    4. // and not in this file  
    5.   
    6. #ifdef _DEBUG  
    7.     #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/zlib[dbg_x86_vc10].lib")  
    8.     #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libpng[dbg_x86_vc10].lib")  
    9.     #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libjpeg[dbg_x86_vc10].lib")  
    10.     #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/libtiff[dbg_x86_vc10].lib")  
    11.     #pragma comment(lib, "../../../../ImgCore/lib/dbg/x86_vc10/giflib[dbg_x86_vc10].lib")  
    12.     #pragma comment(lib, "../../../lib/dbg/x86_vc10/liblept[dbg_x86_vc10].lib")  
    13. #else  
    14.     #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/zlib[rel_x86_vc10].lib")  
    15.     #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libpng[rel_x86_vc10].lib")  
    16.     #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libjpeg[rel_x86_vc10].lib")  
    17.     #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/libtiff[rel_x86_vc10].lib")  
    18.     #pragma comment(lib, "../../../../ImgCore/lib/rel/x86_vc10/giflib[rel_x86_vc10].lib")  
    19.     #pragma comment(lib, "../../../lib/rel/x86_vc10/liblept[rel_x86_vc10].lib")  
    20. #endif  

    liblepttest.cpp:
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <string>  
    4.   
    5. using namespace std;  
    6.   
    7. static const l_float32  ANGLE1 = 3.14159265 / 12.;  
    8.   
    9. void RotateTest()  
    10. {  
    11.     string strSrc = "../../../testdata/weasel.png";  
    12.     string strDst = "../../../testdata/dst.gif";  
    13.   
    14.     PIX* pixs = pixRead(strSrc.c_str());  
    15.     if (pixs == NULL) {  
    16.         cout<<" read image error "<<endl;  
    17.         return;  
    18.     }  
    19.   
    20.     l_int32 w, h, d;  
    21.     pixGetDimensions(pixs, &w, &h, &d);  
    22.     PIX* pixd = pixRotate(pixs, ANGLE1, L_ROTATE_SHEAR, L_BRING_IN_WHITE, w, h);  
    23.     pixWrite(strDst.c_str(), pixd, IFF_GIF);  
    24.   
    25.     pixDestroy(&pixs);  
    26.     pixDestroy(&pixd);  
    27. }  
    28.   
    29. void EdgeTest()  
    30. {  
    31.     string strSrc = "../../../testdata/marge.jpg";  
    32.     string strDst = "../../../testdata/dst.bmp";  
    33.   
    34.     PIX* pixs = pixRead(strSrc.c_str());  
    35.     if (pixs == NULL) {  
    36.         cout<<" read image error "<<endl;  
    37.         return;  
    38.     }  
    39.   
    40.     l_int32 w, h, d;  
    41.     pixGetDimensions(pixs, &w, &h, &d);  
    42.     if (d != 8) {  
    43.         cout<<"pixs not 8 bpp"<<endl;  
    44.         return;  
    45.     }  
    46.   
    47.     PIX* pixf = pixSobelEdgeFilter(pixs, L_HORIZONTAL_EDGES);  
    48.     PIX* pixd = pixThresholdToBinary(pixf, 10);  
    49.     pixInvert(pixd, pixd);  
    50.     pixWrite(strDst.c_str(), pixd, IFF_BMP);  
    51.   
    52.     pixDestroy(&pixs);  
    53.     pixDestroy(&pixf);  
    54.     pixDestroy(&pixd);  
    55. }  
    56.   
    57. int main(int argc, char* argv[])  
    58. {  
    59.     RotateTest();  
    60.     EdgeTest();  
    61.   
    62.     cout<<"ok!"<<endl;  
    63.   
    64.     return 0;  
    65. }  

    GitHubhttps://github.com/fengbingchun/Liblept_Test

  • 相关阅读:
    “非工作总结”之快门—我的镜头见过你
    书摘:日本式管理和依靠自己
    寒冬日,找阳光
    模式自由(Schemafree)和数据存储的非格式化趋势
    心体澄澈,意气和平
    思考些管理的事情
    含沙射影,业镜照胆
    临崖之马,上滩之舟—凡事一定要区别不同情况对待
    [转]HttpContext.Current.Cache 和 HttpRuntime.Cache
    句柄、引用、指针与对象(转)
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6559456.html
Copyright © 2011-2022 走看看