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;
}
Leptonica在VS2010中的编译及简单使用举例的更多相关文章
- 二维码Data Matrix简单介绍及在VS2010中的编译
Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码 ...
- qt5的.ui文件在VS2010中无法编译问题
自己手动添加的.ui文件在VS中是无法右键编译的,也即是说,在用QT designer编辑过的.ui文件无法实时更新相应的ui_XX.h文件,造成调试结果无法显示编辑过的新界面. 解决办法: 右键.u ...
- VS2010中xercesc配置及简单示例
从官网下载xerces-c-3.1.1并解压,打开工程项目 xerces-c-3.1.1\projects\Win32\VC10\xerces-all\xerces-all.sln, 选择Xerces ...
- JAVA中动态编译的简单使用
一.引用库 pom文件中申明如下: <dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> ...
- CxImage的编译及简单使用举例
1. 从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源代码. 2. 解压缩后,以管理员身份打开CxImageFull_vc10. ...
- VS2010 MFC中 静态编译设置方法
问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等 解决方法:1.将这些dll打包,和应用程序一起发布;2.采用MFC静态编译; 静态编译: ...
- VS2010中配置OpenGL
下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法
一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C+ ...
- 关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误
用Cmake讲Qt.VTK和ITK整合后,打开解决方案后添加新类时运行会出现“n个无法解析的外部命令”的错误. 原因是新建的类未能生成moc文件,解决办法是: 1.右键 要生成moc文件的.h文件,打 ...
随机推荐
- No.11 selenium学习之路之加载浏览器插件for Firefox
打开帮助 —— 故障排除信息
- ****jQuery - 设置HTML内容和属性
设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容( ...
- CCF CSP 201512-3 画图
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-3 画图 问题描述 用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ...
- PHP递归遍历数组 不破坏数据结构 替换字符
代码如下: <?php $arr = array('0'=>array("<小刚>","<小晓>","<小飞 ...
- React + Reflux 渲染性能优化原理
作者:ManfredHu 链接:http://www.manfredhu.com/2016/11/08/23-reactRenderingPrinciple 声明:版权所有,转载请保留本段信息,否则请 ...
- 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游
题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...
- 【Java】 用PriorityQueue实现最大最小堆
PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列. 实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆. Pri ...
- $GLOBALS — 引用全局作用域中可用的全部变量
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可). PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量.变量的名字就是数组的键. ...
- Python入门3(赋值)
[一:*,-1的作用] 给大家两个例子: a,b,c,d='spam' print(a) print(b) print(c) print(d) a,*b='spam' print(a) print(b ...
- Pycharm 激活码(转) 有效期到2019/10月
Pycharm 激活码(转) 有效期到2019/10月 2018年11月13日 17:15:32 may_ths 阅读数:64 [激活码激活] 修改hosts文件 添加下面一行到hosts文件,目 ...