#include "Recognizer.h" #include #include #include #include "Settings.h" #include "ImageProcessing.h" Recognizer::Recognizer(QObject *parent) : QObject(parent), engine_ (NULL), imageScale_ (0) { applySettings (); } void Recognizer::applySettings() { QSettings settings; settings.beginGroup (settings_names::recogntionGroup); tessDataDir_ = settings.value (settings_names::tessDataPlace, settings_values::tessDataPlace).toString (); if (tessDataDir_.right (1) != "/") { tessDataDir_ += "/"; } ocrLanguage_ = settings.value (settings_names::ocrLanguage, settings_values::ocrLanguage).toString (); imageScale_ = settings.value (settings_names::imageScale, settings_values::imageScale).toInt (); initEngine (); } bool Recognizer::initEngine() { 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; } void Recognizer::recognize(ProcessingItem item) { Q_ASSERT (!item.source.isNull ()); if (engine_ == NULL) { if (!initEngine ()) { return; } } Pix* image = prepareImage (item.source.toImage (), imageScale_); Q_ASSERT (image != NULL); engine_->SetImage (image); char* outText = engine_->GetUTF8Text(); QString result = QString (outText).trimmed (); engine_->Clear(); cleanupImage (&image); if (!result.isEmpty ()) { item.recognized = result; emit recognized (item); } else { emit error (tr ("Текст не распознан.")); } delete [] outText; }