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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115323.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux服务.NO6——http协议

    Linux服务.NO6——http协议9.http9.1.http概念http协议即超文本传输协议,用于从万维网服务器传输超文本到本地浏览器的传送协议。http是基于TCP/IP通信协议来传递数据的一个属于应用层的面向对象的协议。http协议工作于c/s架构,浏览器作为客户端通过url向http服务端(即web服务器)发送所有请求,web服务器根据受到的请求后,向客户端发送响应。9.2.http特点1.简单快速:客户向服务…

    2022年10月26日
  • XLSTransformer 导出Excel数据[通俗易懂]

    XLSTransformer 导出Excel数据[通俗易懂]先上代码:packagecn.export.util;importjava.io.FileInputStream;importjava.net.URLEncoder;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.ServletOutp

  • 高通平台dtb文件的加载过程「建议收藏」

    高通平台dtb文件的加载过程「建议收藏」高通平台dtb文件的加载过程高通平台对dts的两种打包方式zImage-dtbdt.imgzImage-dtb方式zImage-dtb的编译二进制文件查看lk的加载过程代码分析dt.img方式dt.img的编译lk的加载过程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyP…

    2022年10月28日
  • h3c bios密码_日本服务器ip端口密码

    h3c bios密码_日本服务器ip端口密码版本Ladon>=7.1139端口NetBIOSFileandPrintSharing通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于Windows”文件和打印机共享”和SAMBA。IPC$通信Windows系统中的netuseipc整个通信过程,先445−>137−>139验证,当你开启防火墙禁用445,发现系统命令就无法连接IPC了,根本没机会走到139,所以使用系统自带命令连接的ipc整个通信过程,先445->137->

  • 一分钟速算口诀_速算口诀表完整版

    一分钟速算口诀_速算口诀表完整版“一分钟速算口诀”:两位数相乘,在十位数相同、个位数相加等于10的情况下,如62×68=4216计算方法:6×(6+1)=42(前积),2×8=16(后积)。一分钟速算口诀中对特殊题的定理是:任意两位数乘以任意两位数,只要魏式系数为“0”所得的积,一定是两项数中的尾乘尾所得的积为后积,头乘头(其中一项头加1的和)的积为前积,两积相邻所得的积。如(1)33×46=1518(个位数相加小于10,所以十

    2022年10月23日
  • oracle创建用户与分配权限

    oracle创建用户与分配权限oracle创建用户与分配权限我们要在有最高权限的system用户创建用户,再赋予新建用户权限,只有给新建用户权限,新建用户才能干什么。CREATEUSER创建用户DBA(数据库管理者)使用CREATEUSER语句创建用户注意刚刚创建用户,仅仅是有这个用户的存在,还没有创建会话窗口的权限,进不了oracle界面CREATEUSERTestUser-…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号