| 6 | RecognizeWorker::~RecognizeWorker() = default; |
| 7 | |
| 8 | void RecognizeWorker::handle(const TaskPtr &task) |
| 9 | { |
| 10 | SOFT_ASSERT(task, return ); |
| 11 | SOFT_ASSERT(task->isValid(), return ); |
| 12 | SOFT_ASSERT(!tessdataPath_.isEmpty(), return ); |
| 13 | |
| 14 | LTRACE() << "Start recognize" << task->captured; |
| 15 | auto result = task; |
| 16 | |
| 17 | if (!engines_.count(task->sourceLanguage)) { |
| 18 | LTRACE() << "Create OCR engine" << task->sourceLanguage; |
| 19 | |
| 20 | auto engine = |
| 21 | std::make_unique<Tesseract>(task->sourceLanguage, tessdataPath_); |
| 22 | |
| 23 | if (!engine->isValid()) { |
| 24 | result->error = tr("Failed to init OCR engine: %1").arg(engine->error()); |
| 25 | emit finished(result); |
| 26 | return; |
| 27 | } |
| 28 | |
| 29 | engines_.emplace(task->sourceLanguage, std::move(engine)); |
| 30 | LTRACE() << "Added OCR engine" << task->sourceLanguage; |
| 31 | } |
| 32 | |
| 33 | auto &engine = engines_[task->sourceLanguage]; |
| 34 | SOFT_ASSERT(engine->isValid(), return ); |
| 35 | |
| 36 | result->recognized = engine->recognize(task->captured); |
| 37 | if (result->recognized.isEmpty()) |
| 38 | result->error = engine->error(); |
| 39 | |
| 40 | lastGenerations_[task->sourceLanguage] = task->generation; |
| 41 | removeUnused(task->generation); |
| 42 | |
| 43 | emit finished(result); |
| 44 | } |
| 45 | |
| 46 | void RecognizeWorker::reset(const QString &tessdataPath) |
| 47 | { |