ScreenTranslator/src/ocr/recognizer.cpp
Gres 0920ed1f40 Bundle multiple tesseract versions
Load them via C api and allow user to select which one to use.
2020-07-18 12:26:59 +03:00

88 lines
2.0 KiB
C++

#include "recognizer.h"
#include "debug.h"
#include "manager.h"
#include "recognizerworker.h"
#include "settings.h"
#include "task.h"
#include "tesseract.h"
#include <QThread>
Recognizer::Recognizer(Manager &manager, const Settings &settings)
: manager_(manager)
, settings_(settings)
, workerThread_(new QThread(this))
{
auto worker = new RecognizeWorker;
connect(this, &Recognizer::reset, //
worker, &RecognizeWorker::reset);
connect(this, &Recognizer::recognizeImpl, //
worker, &RecognizeWorker::handle);
connect(worker, &RecognizeWorker::finished, //
this, &Recognizer::recognized);
connect(workerThread_, &QThread::finished, //
worker, &QObject::deleteLater);
workerThread_->start();
worker->moveToThread(workerThread_);
}
void Recognizer::recognize(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
SOFT_ASSERT(task->isValid(), return );
if (task->sourceLanguage.isEmpty()) {
task->error = tr("No source language set. Check settings");
manager_.recognized(task);
return;
}
queue_.push_back(task);
if (queue_.size() == 1)
processQueue();
}
void Recognizer::processQueue()
{
if (queue_.empty())
return;
emit recognizeImpl(queue_.front());
}
void Recognizer::recognized(const TaskPtr &task)
{
manager_.recognized(task);
SOFT_ASSERT(!queue_.empty(), return );
if (queue_.front() == task) {
queue_.pop_front();
} else {
LERROR() << "processed not first item in recognition queue";
queue_.clear();
}
processQueue();
}
Recognizer::~Recognizer()
{
workerThread_->quit();
const auto timeoutMs = 2000;
if (!workerThread_->wait(timeoutMs)) {
LTRACE() << "terminating tesseract thread";
workerThread_->terminate();
}
}
void Recognizer::updateSettings()
{
SOFT_ASSERT(!settings_.tessdataPath.isEmpty(), return );
queue_.clear();
const auto libName =
(settings_.tesseractVersion == TesseractVersion::Optimized
? "tesseract-optimized"
: "tesseract-compatible");
emit reset(settings_.tessdataPath, libName);
}