C++及OpenCV中调用Tesseract

参考地址

How to Use Tesseract with c++ or OpenCV and some code trace

1.Tesseract 在C++中直接使用

// tess.cpp: 
// Recognize text on an image using Tesseract API and print it to the screen
// Usage: ./tess image.png

#include <tesseract/baseapi.h>
#include <tesseract/strngs.h>
#include <iostream>

int main(int argc, char** argv)
{
    if (argc != 2)
    {
        std::cout << "Please specify the input image!" << std::endl;
        return -1;
    }

    const char* lang = "eng";
    const char* filename = argv[1];

    //新建tess基类
    tesseract::TessBaseAPI tess;
    //初始化
    tess.Init(NULL, lang, tesseract::OEM_DEFAULT);
    //设置识别模式
    tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);

    FILE* fin = fopen(filename, "rb");
    if (fin == NULL)
    {
        std::cout << "Cannot open " << filename << std::endl;
        return -1;
    }
    fclose(fin);

    STRING text;
    //进行识别
    if (!tess.ProcessPages(filename, NULL, 0, &text))
    {
        std::cout << "Error during processing." << std::endl;
        return -1;
    }
    else
        std::cout << text.string() << std::endl;

    return 0;
}

ubuntu下编译命令

g++ -I/usr/local/include `pkg-config --cflags --libs tesseract` tess.cpp -o tess

进行OCR识别的主体函数为:

 

tesseract::TessBaseAPI::
bool TessBaseAPI::ProcessPage(Pix* pix, int page_index, const char* filename,
                              const char* retry_config, int timeout_millisec,
                              STRING* text_out)

在分析流程时,专注此API,位置在baseapi.cpp;

后续分析;

2. Tesseract同OpenCV结合使用

可以选择ROI然后进行OCR;

为了识别cv::Mat矩阵,将其传递至TessBaseAPI::SetImage();

使用TessBaseAPI::GetUTF8Text()得到识别后的文字;

// tesscv.cpp:
// Using Tesseract API with OpenCV

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <tesseract/baseapi.h>
#include <iostream>

int main(int argc, char** argv)
{
    // Usage: tesscv image.png
    if (argc != 2)
    {
        std::cout << "Please specify the input image!" << std::endl;
        return -1;
    }

    // Load image
    cv::Mat im = cv::imread(argv[1]);
    if (im.empty())
    {
        std::cout << "Cannot open source image!" << std::endl;
        return -1;
    }

    cv::Mat gray;
    cv::cvtColor(im, gray, CV_BGR2GRAY);
    // ...other image pre-processing here...

    // Pass it to Tesseract API
    tesseract::TessBaseAPI tess;
    tess.Init(NULL, "eng", tesseract::OEM_DEFAULT);
    tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);
    tess.SetImage((uchar*)gray.data, gray.cols, gray.rows, 1, gray.cols);

    // Get the text
    char* out = tess.GetUTF8Text();
    std::cout << out << std::endl;

    return 0;
}

ubuntu 编译命令

g++ -I/usr/local/include `pkg-config --cflags --libs opencv tesseract` tesscv.cpp -o tesscv

over!

OpenCV ,如果你想要加载并操作包含文字的图像(通常是位图或矢量格式),你可以使用 `imread()` 函数来读取图像文件,然后配合 `getText()` 或者 `findContours()` 等方法来识别文本。这里以读取位图图像为例: ```cpp #include <opencv2/opencv.hpp> int main() { // 加载图片 cv::Mat img = cv::imread("path_to_your_text_image.jpg", cv::IMREAD_COLOR); if (img.empty()) { std::cout << "Could not open or find the image." << std::endl; return -1; } // 如果需要检测和识别文本,可以尝试以下步骤: // 将图像转换为灰度图像 cv::Mat grayImg; cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY); // 应用边缘检测(如Canny算子) cv::Canny(grayImg, grayImg, 50, 150); // 寻找轮廓(可能包含文本区域) std::vector<std::vector<cv::Point>> contours; cv::findContours(grayImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); for (const auto& contour : contours) { // 对每个轮廓进行进一步处理,比如 OCR(光学字符识别) cv::Rect boundingBox = cv::boundingRect(contour); cv::rectangle(img, boundingBox, cv::Scalar(0, 0, 255), 2); // 绘制边界框 } // 显示处理后的图像 cv::imshow("Detected Text", img); cv::waitKey(0); return 0; } ``` 在这个例子,我们首先读取图像,然后将其转换为灰度并应用边缘检测。之后,我们找到轮廓并检测可能的文本区域。注意,这只是一个基础示例,实际的文本识别通常会更复杂,涉及到专门的库,如 Tesseract OCR
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值