gpt4 book ai didi

c++ - Mat 和 Pix 的不同 Tesseract 结果

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:13 25 4
gpt4 key购买 nike

目标

在使用 Tesseract 进行 OCR 时,使用 OpenCV Mat 获得的质量结果与使用 Leptonica Pix 时相同。

环境

C++17、OpenCV 3.4.1、Tesseract 3.05.01、Leptonica 1.74.4、Visual Studio Community 2017、Windows 10 Pro 64 位

描述

我正在使用 Tesseract 和 OCR,发现了我认为的一种特殊行为。

这是我的输入图像: Input image for the OCR

这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;
using namespace cv;
using namespace tesseract;

void opencvVariant(string titleFile);
void leptonicaVariant(const char* titleFile);

int main()
{
cout << "Tesseract with OpenCV and Leptonica" << endl;

const char* titleFile = "raptor-companion-2.jpg";
opencvVariant(titleFile);
leptonicaVariant(titleFile);

cout << endl;
system("pause");
return 0;
}

void opencvVariant(string titleFile) {

cout << endl << "OpenCV variant..." << endl;

TessBaseAPI ocr;
ocr.Init(NULL, "eng");
Mat image = imread(titleFile);
ocr.SetImage(image.data, image.cols, image.rows, 1, image.step);

char* outText = ocr.GetUTF8Text();
int confidence = ocr.MeanTextConf();

cout << "Text: " << outText << endl;
cout << "Confidence: " << confidence << endl;
}

void leptonicaVariant(const char* titleFile) {

cout << endl << "Leptonica variant..." << endl;

TessBaseAPI ocr;
ocr.Init(NULL, "eng");
Pix *image = pixRead(titleFile);
ocr.SetImage(image);

char* outText = ocr.GetUTF8Text();
int confidence = ocr.MeanTextConf();

cout << "Text: " << outText << endl;
cout << "Confidence: " << confidence << endl;
}

方法 opencvVariantleptonicaVariant 基本相同,除了一个使用 OpenCV 的类 Mat 和另一个 Pix 来自 Leptonica。然而,结果却大不相同。

OpenCV variant...
Text: Rapton


Confidence: 68

Leptonica variant...
Text: Raptor Companion


Confidence: 83

从上面的输出中可以看出,Pix 变体比 Mat 变体提供了更好的结果。由于我的代码在 OCR 之前严重依赖 OpenCV 来实现计算机视觉,因此 OCR 与 OpenCV 及其类一起工作对我来说至关重要。

问题

  • 为什么 PixMat 给出更好的结果,反之亦然?
  • 如何更改算法才能使 Mat 变体与 Pix 变体一样高效?

最佳答案

OpenCV imread 函数默认读取彩色图像,这意味着您将像素作为 BGRBGRBGR...
在您的示例中,您假设 opencv 图像是灰度图像,因此有两种修复方法:

  1. 根据 opencv 图像中的 channel 数更改 SetImage

    ocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());

  2. 使用 1 个 channel 将您的 opencv 图像转换为灰度

    cv::cvtColor(图像, 图像, CV_BGR2GRAY);

关于c++ - Mat 和 Pix 的不同 Tesseract 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com