diff options
Diffstat (limited to 'cpp/recognizer.cpp')
| -rw-r--r-- | cpp/recognizer.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/cpp/recognizer.cpp b/cpp/recognizer.cpp new file mode 100644 index 0000000..6f19322 --- /dev/null +++ b/cpp/recognizer.cpp @@ -0,0 +1,65 @@ +#include <leptonica/allheaders.h> +#include <tesseract/baseapi.h> + +#include "../include/recognizer.h" + +void Recognizer::initializeTesseract() { + tesseract = new tesseract::TessBaseAPI(); + tesseract->SetPageSegMode(tesseract::PSM_AUTO); + + if (tesseract->Init(nullptr, "eng", tesseract::OEM_LSTM_ONLY)) + fail("Could not initialize tesseract."); +} + +void Recognizer::recognize(Pix *image) { + if (failed) + return; + + tesseract->SetImage(image); + tesseract->SetRectangle(x, y, width, height); + if (tesseract->Recognize(0) != 0) + fail("tesseract recognize failed"); +} + +std::vector<OCRMatch> Recognizer::getResults() { + std::vector<OCRMatch> results; + + if (failed) + return results; + + tesseract::ResultIterator *iterator = tesseract->GetIterator(); + if (iterator == 0) + return results; + + do { + auto match = fetchMatch(iterator); + if (match != nullptr) + results.push_back(*match); + } while (iterator->Next(ITER_LEVEL)); + + delete iterator; + + return results; +} + +OCRMatch *Recognizer::fetchMatch(tesseract::ResultIterator *iterator) { + if (iterator->Confidence(ITER_LEVEL) < CONFIDENCE_THRESHOLD) + return nullptr; + + const char *word = iterator->GetUTF8Text(ITER_LEVEL); + + if (word == nullptr || strlen(word) < MIN_CHARACTER_COUNT) + return nullptr; + + int x1, y1, x2, y2; + iterator->BoundingBox(ITER_LEVEL, &x1, &y1, &x2, &y2); + + return new OCRMatch( + {(int)(x1 / image::scaleFactor), (int)(y1 / image::scaleFactor), + (int)(x2 / image::scaleFactor), (int)(y2 / image::scaleFactor), word}); +} + +void Recognizer::fail(const char *msg) { + this->failed = true; + std::cerr << msg << std::endl; +} |
