2013-11-23 14:00:22 +07:00
|
|
|
#include "Recognizer.h"
|
|
|
|
|
2013-11-26 23:59:47 +07:00
|
|
|
#include <tesseract/baseapi.h>
|
2013-11-24 19:43:37 +07:00
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QSettings>
|
|
|
|
|
|
|
|
#include "Settings.h"
|
|
|
|
|
2013-11-23 14:00:22 +07:00
|
|
|
Recognizer::Recognizer(QObject *parent) :
|
2013-11-24 19:43:37 +07:00
|
|
|
QObject(parent),
|
|
|
|
engine_ (NULL), imageScale_ (0)
|
2013-11-23 14:00:22 +07:00
|
|
|
{
|
2013-11-24 19:43:37 +07:00
|
|
|
applySettings ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Recognizer::applySettings()
|
|
|
|
{
|
|
|
|
QSettings settings;
|
|
|
|
settings.beginGroup (settings_names::recogntionGroup);
|
|
|
|
|
|
|
|
tessDataDir_ = settings.value (settings_names::tessDataPlace,
|
|
|
|
settings_values::tessDataPlace).toString ();
|
2013-11-24 20:06:19 +07:00
|
|
|
if (tessDataDir_.right (1) != "/")
|
|
|
|
{
|
|
|
|
tessDataDir_ += "/";
|
|
|
|
}
|
2013-11-24 19:43:37 +07:00
|
|
|
ocrLanguage_ = settings.value (settings_names::ocrLanguage,
|
|
|
|
settings_values::ocrLanguage).toString ();
|
|
|
|
imageScale_ = settings.value (settings_names::imageScale,
|
|
|
|
settings_values::imageScale).toInt ();
|
|
|
|
|
|
|
|
initEngine ();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Recognizer::initEngine()
|
|
|
|
{
|
2013-11-26 23:59:47 +07:00
|
|
|
if (tessDataDir_.isEmpty () || ocrLanguage_.isEmpty ())
|
|
|
|
{
|
|
|
|
emit error (tr ("Неверные параметры для OCR"));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (engine_ != NULL)
|
|
|
|
{
|
|
|
|
delete engine_;
|
|
|
|
}
|
|
|
|
engine_ = new tesseract::TessBaseAPI();
|
|
|
|
int result = engine_->Init(qPrintable (tessDataDir_), qPrintable (ocrLanguage_),
|
|
|
|
tesseract::OEM_DEFAULT);
|
|
|
|
if (result != 0)
|
|
|
|
{
|
|
|
|
emit error (tr ("Ошибка инициализации OCR: %1").arg (result));
|
|
|
|
delete engine_;
|
|
|
|
engine_ = NULL;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
2013-11-23 14:00:22 +07:00
|
|
|
}
|
|
|
|
|
2013-11-26 13:44:00 +07:00
|
|
|
void Recognizer::recognize(ProcessingItem item)
|
2013-11-23 14:00:22 +07:00
|
|
|
{
|
2013-11-26 13:44:00 +07:00
|
|
|
Q_ASSERT (!item.source.isNull ());
|
2013-11-26 23:59:47 +07:00
|
|
|
if (engine_ == NULL)
|
|
|
|
{
|
|
|
|
if (!initEngine ())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2013-11-24 19:43:37 +07:00
|
|
|
|
2013-11-26 23:59:47 +07:00
|
|
|
QPixmap scaled = item.source;
|
|
|
|
if (imageScale_ > 0)
|
|
|
|
{
|
|
|
|
scaled = scaled.scaledToHeight (scaled.height () * imageScale_,
|
|
|
|
Qt::SmoothTransformation);
|
|
|
|
}
|
|
|
|
QImage image = scaled.toImage ();
|
|
|
|
const int bytesPerPixel = image.depth () / 8;
|
|
|
|
engine_->SetImage (image.bits (), image.width (), image.height (),
|
|
|
|
bytesPerPixel, image.bytesPerLine ());
|
2013-11-24 19:43:37 +07:00
|
|
|
|
2013-11-26 23:59:47 +07:00
|
|
|
char* outText = engine_->GetUTF8Text();
|
|
|
|
engine_->Clear();
|
2013-11-23 14:00:22 +07:00
|
|
|
|
2013-11-26 23:59:47 +07:00
|
|
|
QString result (outText);
|
|
|
|
result = result.trimmed();
|
|
|
|
if (!result.isEmpty ())
|
|
|
|
{
|
|
|
|
item.recognized = result;
|
|
|
|
emit recognized (item);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
emit error (tr ("Текст не распознан."));
|
|
|
|
}
|
|
|
|
delete [] outText;
|
2013-11-23 14:00:22 +07:00
|
|
|
}
|