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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM