Mat 和 Pix 的不同 Tesseract 结果
Different Tesseract result for Mat and Pix
目标
使用 OpenCV Mat
与使用 Leptonica Pix
使用 Tesseract 进行 OCR 时获得相同质量的结果。
环境
C++17、OpenCV 3.4.1、Tesseract 3.05.01、Leptonica 1.74.4、Visual Studio 社区 2017、Windows 10 Pro 64 位
描述
我正在使用 Tesseract 和 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;
}
方法opencvVariant
和leptonicaVariant
基本相同,只是一个使用OpenCV的class Mat
,另一个使用Leptonica的Pix
.然而,结果却截然不同。
OpenCV variant...
Text: Rapton
Confidence: 68
Leptonica variant...
Text: Raptor Companion
Confidence: 83
正如在上面的输出中看到的,Pix
变体比 Mat
变体给出了更好的结果。由于我的代码在 OCR 之前严重依赖 OpenCV 来实现计算机视觉,因此 OCR 与 OpenCV 及其 classes.
配合良好对我来说至关重要
问题
- 为什么
Pix
的结果比 Mat
好,反之亦然?
- 如何更改算法才能使
Mat
变体与 Pix
变体一样高效?
OpenCV imread
函数默认读取彩色图像,这意味着您获得的像素为 BGRBGRBGR...
。
在您的示例中,您假设 opencv 图像是灰度图像,因此有两种修复方法:
根据 opencv 图像中的通道数更改 SetImage
行
ocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());
使用 1 个通道将您的 opencv 图像转换为灰度图像
cv::cvtColor(image, image, CV_BGR2GRAY);
目标
使用 OpenCV Mat
与使用 Leptonica Pix
使用 Tesseract 进行 OCR 时获得相同质量的结果。
环境
C++17、OpenCV 3.4.1、Tesseract 3.05.01、Leptonica 1.74.4、Visual Studio 社区 2017、Windows 10 Pro 64 位
描述
我正在使用 Tesseract 和 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;
}
方法opencvVariant
和leptonicaVariant
基本相同,只是一个使用OpenCV的class Mat
,另一个使用Leptonica的Pix
.然而,结果却截然不同。
OpenCV variant...
Text: Rapton
Confidence: 68
Leptonica variant...
Text: Raptor Companion
Confidence: 83
正如在上面的输出中看到的,Pix
变体比 Mat
变体给出了更好的结果。由于我的代码在 OCR 之前严重依赖 OpenCV 来实现计算机视觉,因此 OCR 与 OpenCV 及其 classes.
问题
- 为什么
Pix
的结果比Mat
好,反之亦然? - 如何更改算法才能使
Mat
变体与Pix
变体一样高效?
OpenCV imread
函数默认读取彩色图像,这意味着您获得的像素为 BGRBGRBGR...
。
在您的示例中,您假设 opencv 图像是灰度图像,因此有两种修复方法:
根据 opencv 图像中的通道数更改
SetImage
行ocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());
使用 1 个通道将您的 opencv 图像转换为灰度图像
cv::cvtColor(image, image, CV_BGR2GRAY);