Мы с важной новостью: с 28 февраля 2025 года сервис Хабр Фриланс прекратит свою работу.

Купить услуги можно до 28 февраля 2025, но пополнить баланс уже нельзя. Если на вашем счете остались средства, вы можете потратить их на небольшие услуги — служба поддержки готова поделиться бонусами, на случай, если средств немного не хватает.
R50 4fd6d9d9de7b34638f63f16582928bb5
Дизайн, Python, IT , Арт

Извлечение информации о таблицах из изображения на C++ с OpenCV

Добавлено 31 янв 2024 в 22:05
Извлечение информации о таблицах из изображения на C++ с OpenCV
Нужна программа на C++, использующая OpenCV. На вход поcтупают изображения, которые могут содержать таблицы. Если таблица имеется, необходимо извлечь номер таблицы и название таблицы. Другие данные извлекать НЕ нужно.

Прикрепил фото, на нём отметил, какие данные нужно извлекать, другие не нужно. В изображениях такого выделения не будет, нужно определять программе самой.
#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <iostream>
#include <regex>

using namespace cv;

int main(int argc, char** argv) {
// Загрузка изображения с помощью OpenCV
Mat image = imread("your_image.jpg");

// Инициализация Tesseract OCR
tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng")) {
fprintf(stderr, "Не удалось инициализировать Tesseract\n");
exit(1);
}

// Установка параметров распознавания текста
api->SetPageSegMode(tesseract::PSM_AUTO);

// Преобразование изображения в формат, подходящий для Tesseract
api->SetImage(image.data, image.cols, image.rows, 3, image.step);

// Распознавание текста с помощью Tesseract
char* outText = api->GetUTF8Text();
printf("Распознанный текст:\n%s", outText);

// Обработка распознанного текста для извлечения номера и названия таблицы
std::string recognizedText(outText);

// Поиск номера таблицы
std::regex tableNumberRegex("\\bTable\\s*(\\d+)\\b");
std::smatch tableNumberMatch;
std::string tableNumber;
if (std::regex_search(recognizedText, tableNumberMatch, tableNumberRegex)) {
tableNumber = tableNumberMatch[1];
std::cout << "Номер таблицы: " << tableNumber << std::endl;
} else {
std::cout << "Номер таблицы не найден" << std::endl;
}

// Поиск названия таблицы
std::regex tableNameRegex("((?:[A-Z][a-z]+\\s*)+)");
std::smatch tableNameMatch;
std::string tableName;
if (std::regex_search(recognizedText, tableNameMatch, tableNameRegex)) {
tableName = tableNameMatch[1];
std::cout << "Название таблицы: " << tableName << std::endl;
} else {
std::cout << "Название таблицы не найдено" << std::endl;
}

// Освобождение ресурсов
api->End();
delete [] outText;
delete api;

return 0;
}

88c3673df9