#include <QDir>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
using namespace cv;
using namespace std;
using namespace tesseract;
void GammaTransform(cv::Mat &image, cv::Mat &dist)
{
Mat imageGamma;
//灰度归一化
image.convertTo(imageGamma, CV_64F, 1.0 / 255, 0);
//伽马变换
double gamma = 0.7;
pow(imageGamma, gamma, dist);//dist 要与imageGamma有相同的数据类型
dist.convertTo(dist, CV_8U, 255, 0);
imageGamma.release();
}
PIX* cvtMat2PIX(Mat imgGray)
{
int cols = imgGray.cols;
int rows = imgGray.rows;
PIX *pixS = pixCreate(cols, rows,8);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
pixSetPixel(pixS, j, i, (l_uint32)imgGray.at<uchar>(i, j));
return pixS;
}
int main(int argc, char *argv[])
{
QString filePath("/home/nishome/lichao/zhoujun/image/");
QDir dir(filePath);
QFileInfoList fileList;
QString jpgFilePath;
if(dir.exists())
{
QFileInfoList subFileList = dir.entryInfoList(QDir::Files|QDir::CaseSensitive);//过滤条件为只限文件并区分大小写
for (int i = 0;i < subFileList.size(); i++)
{
QString suffix = subFileList[i].suffix();//获取后缀名
if (suffix.compare("jpg") == 0)
{
cout << "picture is jpg" <<endl;
fileList.push_back(subFileList[i]);
}
}
}
foreach (QFileInfo fileinfo, fileList)
{
Mat img1;
char* output;
jpgFilePath = fileinfo.absoluteFilePath();
string filename = jpgFilePath.toStdString();
TessBaseAPI *api = new TessBaseAPI();
if(api->Init(NULL,"eng"))
{
cout << "tesseract init failed" <<endl;
}
img1 = imread(filename,0);
img1 =img1(Rect(0,57,123,148)).clone();
GammaTransform(img1,img1);
//重硬盘获取图片进行识别
// char path1[256];
// sprintf(path1, "/home/nishome/lichao/zhoujun/image/new%d.tif", idx);
// imwrite(path1, img1);
// Pix* pix = pix;
// cout << "path1=" << path1 << endl;
//重Mat结构图获取数据进行识别
Pix* pix =cvtMat2PIX(img1);
api->SetImage(pix);
output = api->GetUTF8Text();
cout<<string(output) << endl;
// Destroy used object and release memory
api->End();
delete api;
delete[] output;
pixDestroy(&pix);
img1.release();
}
cout << "quit app" << endl;
return 0;
}
CMakeList文件
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
PROJECT(TESSERACT)
SET(PROJECT_NAME tesseract)
FIND_PACKAGE (Qt4 REQUIRED)
set (QT_USE_QTNETWORK TRUE)
ADD_DEFINITIONS(-DQT3_SUPPORT_WARNINGS)
ADD_DEFINITIONS(
/home/nishome/lichao/local/lib/libtesseract.so.5
/usr/lib/x86_64-linux-gnu/libopencv_core.so
/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so
/usr/lib/x86_64-linux-gnu/libopencv_highgui.so
/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so
/usr/local/qwt-6.1.4-svn/lib/
/usr/lib/x86_64-linux-gnu/
/usr/lib/x86_64-linux-gnu/libleptonica.so.1.78.0
/usr/lib/x86_64-linux-gnu/libleptonica.so.5.3.0
/usr/lib/x86_64-linux-gnu/libleptonica.so
)
INCLUDE ( ${QT_USE_FILE} )
include_directories(
/usr/include/opencv2/
/usr/include/opencv2/core/
/usr/local/qwt-6.1.4-svn/include
/home/nishome/lichao/local/include/tesseract
/usr/local/include/leptonica/
)
set ( _SRCS
tesseract.cpp
)
QT4_ADD_RESOURCES(RSCS ${_RSCS})
#add_library(tesseract.cpp)
ADD_COMPILE_OPTIONS( -O3 -fsanitize=address -fno-omit-frame-pointer )
SET(CMAKE_EXE_LINKER_FLAGS "-fsanitize=address")
ADD_COMPILE_OPTIONS(-O3)
add_executable(tesseract tesseract.cpp)
target_link_libraries(tesseract
-lqwt
-L /usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/ -lqjpeg
-lQtGui
-lQtCore
-lopencv_core
-lopencv_imgproc
-lopencv_highgui
-ltesseract
-lleptonica
-fsanitize=address
)
编译安装tesseract
https://github.com/tesseract-ocr/tesseract/wiki/APIExample
https://github.com/wangdongxun/leptonica
openjp2库下载https://launchpad.net/ubuntu/+source/openjpeg2/