aboutsummaryrefslogtreecommitdiff
path: root/cpp/recognizer.cpp
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2024-12-25 22:33:03 +0530
committerAkshay Nair <phenax5@gmail.com>2024-12-25 22:42:27 +0530
commit83e2570d3c8da9920d66a00c4bdf5650fe1b3336 (patch)
tree5755d561acdb86422e2ce3621e217a9c05dfb640 /cpp/recognizer.cpp
parentfb24e589290f7ffbee04972eed35fca37facdf1c (diff)
downloadchelleport-83e2570d3c8da9920d66a00c4bdf5650fe1b3336.tar.gz
chelleport-83e2570d3c8da9920d66a00c4bdf5650fe1b3336.zip
Parallel ocr evaluation for sections of screen + many refactorings
Diffstat (limited to 'cpp/recognizer.cpp')
-rw-r--r--cpp/recognizer.cpp65
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;
+}