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静态库工程,将/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>的地方,用以下语句替换,

//#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静态库工程,将/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文件的内容为:

#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控制台工程,对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;
}
时间: 2024-10-10 15:47:32

Leptonica在VS2010中的编译及简单使用举例的相关文章

开源库Simd在vs2010中的编译及简单使用

Simd是开源的图像处理库,它提供了很多高性能的算法,这些优化算法主要由SIMD指令来实现,包括SSE.SSE2.SSSE3.SSE4.1.SSE4.2.AVX等,此库可以应用在windows/linux 32bit/64bit等系统中.此库更新较频繁.此库的license是MIT. 下面详细介绍其在vs2010中的编译及使用: 1.        从https://sourceforge.net/projects/simd/?source=typ_redirect下载最新版本simd.2.2.

VLC SDK在VS2010中的配置及简单使用举例

1.        从http://www.videolan.org/vlc/download-windows.html下载vlc-2.2.0-win32.7z,解压缩: 2.        新建一个VLCtest控制台工程: 3.        将/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程属性中,C/C++ -->General --> Additional Include Directories: 4.        将/vlc-2.2.0-wi

二维码Data Matrix简单介绍及在VS2010中的编译

Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码是一种矩阵式二维条码. Data Matrix符号由规则排列的深浅色正方形模块构成,每一个正方形模块就是一个基本单元.每一个基本单元又被编码为一比特的数据. 数据区的四周是探測图形.用于条码符号定位和确定条码结构信息.探測图形的四周是空白区,用以将条码符号与背景分离. 探測图形是一个模块的宽度.是数

二维码Data Matrix简介及在VS2010中的编译

Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码是一种矩阵式二维条码. Data Matrix符号由规则排列的深浅色正方形模块构成,每个正方形模块就是一个基本单元,每个基本单元又被编码为一比特的数据.数据区的四周是探测图形,用于条码符号定位和确定条码结构信息.探测图形的四周是空白区,用以将条码符号与背景分离. 探测图形是一个模块的宽度,是数据区的

qt5的.ui文件在VS2010中无法编译问题

自己手动添加的.ui文件在VS中是无法右键编译的,也即是说,在用QT designer编辑过的.ui文件无法实时更新相应的ui_XX.h文件,造成调试结果无法显示编辑过的新界面. 解决办法: 右键.ui文件属性:改自定义生成工具,应用,在常规里按照自己相应的文件和路径输入: 命令行:setlocalD:\qt\5.5\msvc2010\bin\uic.exe  -o  "F:/AA/BB/CC/bin/ui_XX.h"  "F:/AA/BB/CC/XX.ui"if

VS2010中xercesc配置及简单示例

从官网下载xerces-c-3.1.1并解压,打开工程项目 xerces-c-3.1.1\projects\Win32\VC10\xerces-all\xerces-all.sln, 选择XercesLib项目进行编译,生成相关库文件. 设置环境变量,添加xerces-c-3.1.1\Build\Win32\VC10\Debug. 新建项目工程,打开属性 配置属性: a. C/C++ ->常规->附加包含目录 xerces-c-3.1.1\src: b.链接器->常规->附加库目录

CxImage的编译及简单使用举例

1.  从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码: 2.  解压缩后,以管理员身份打开CxImageFull_vc10.sln工程,在编译之前先将每个工程属性的Character Set由原先的Use Unicode Character Set改为Use Multi-ByteCharacter Set,首先编译jasper.jbig.jpeg.libdcr.libpsd.mng.png.tiff.zlib这9个库,然后

VS2010中配置OpenGL

下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual?Studio,Broland?C++?Builder,Dev-C++等,它们都是支持OpenGL的. 我选择Visual?Studio?2010和VC6++作为学习OpenGL的环境.第二步,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.Windows环境下的GLUT下载地址:(大小约为15

vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法

一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的. 我选择Visual Studio 2010和VC6++作为学习OpenGL的环境. 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows环境下的GLUT下载地址: