San*_*912 6 c++ ocr opencv tesseract
我正在尝试使用 OCR 从图片中提取数据。我在 C++ 中使用 Tesseract API 来实现这一点。
原图是这样的:
现在对我来说重要的数据是这样的:
然而,无论我尝试什么,永远不会识别标记的蓝线。
用tesseract分析图片的代码是这样的:
std::string readFromFile(const std::string& filename)
{
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->SetPageSegMode(tesseract::PSM_AUTO);
if (api->Init("folder_to_tessdata", "deu+eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
// Open input image with leptonica library
Pix *image = pixRead(filename.c_str());
api->SetImage(image);
// Get OCR result
char *outText = api->GetUTF8Text();
std::string result{ outText };
api->End();
delete[] outText;
pixDestroy(&image);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我试图通过预处理图像来提高准确性,就像这个问题中建议的那样:图像处理以提高 tesseract OCR 准确性
预处理代码:
cv::Mat image;
image = cv::imread(filename, cv::IMREAD_COLOR);
cv::resize(image, image, cv::Size{}, 1.2, 1.2, cv::INTER_CUBIC);
cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
auto kernel = cv::Mat(1, 1, CV_8UC1, cv::Scalar(1));
cv::dilate(image, image, kernel);
cv::erode(image, image, kernel);
cv::Mat filter;
cv::bilateralFilter(image, filter, 5, 75, 75);
cv::threshold(filter, image, 0, 255, cv::THRESH_BINARY + cv::THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我可以更多地调整 Tesseract 本身还是应该更改图像的预处理?
我的参考资料在这里。
注意:您不需要处理预处理步骤,因为看起来您已经有了一个纯图像。它没有太多噪音。
我的环境信息:
Operating system: Ubuntu 16.04
Run Code Online (Sandbox Code Playgroud)
通过以下命令的 Tesseract 版本tesseract --version:
tesseract 4.1.1-rc2-21-gf4ef
leptonica-1.78.0
libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.4 : libopenjp2 2.1.2
Found AVX
Found SSE
Found libarchive 3.1.2
Run Code Online (Sandbox Code Playgroud)
OpenCV 版本通过命令pkg-config --modversion opencv:
3.4.3
Run Code Online (Sandbox Code Playgroud)
区别:当我检查你的代码时,我只看到了与这个的明显区别。您将再次使用 leptonica 库而不是 opencv 打开图像。
这是代码和结果输出:
输入:
输出文本:
Al AQ A3 Ad AS A6 Al A8
| 2 3 4 5 6 7 8
WH GN YE GY PK Bu RD VT
K101 K102 K103 K104 K105 K107 K109 K110
Q30,0 Q30.1 Q30.2 Q30.3 Q30.4 Q30.5 Q30.6 Q30.7
=13/L.2 =13/2.2 =13/4.2 =13/6.2 =13/7.2 =13/10.2 FIBL.2 = 1312.2
AS AlO All Al2 AL3 Al4 ALS AL6
9 10 ll 12 13 14 15 16
GY /PK RD/BU WH/GN BN/GN WH/YE YE/BN WH/GY GY/BN
Kl1l K112 y114 K115 K117 K118 K124
Q31,0 Q31.1 Q31.2 Q31.3 Q31.4 Q31.5 Q31.6 Q31.7
=13/13.2 =13/14.2 =13/15.2 =13/16.2 =1B7.2 PIB. =13/21.2
Beckhoff KL 2809
Run Code Online (Sandbox Code Playgroud)
代码:
#include <string>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
string outText;
// Create Tesseract object
tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
ocr->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY);
// Set Page segmentation mode to PSM_AUTO (3)
ocr->SetPageSegMode(tesseract::PSM_AUTO);
// Open input image using OpenCV
Mat im = cv::imread("/ur/image/directory/tessatest.png", IMREAD_COLOR);
// Set image data
ocr->SetImage(im.data, im.cols, im.rows, 3, im.step);
// Run Tesseract OCR on image
outText = string(ocr->GetUTF8Text());
// print recognized text
cout << outText << endl;
// Destroy used object and release memory
ocr->End();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
代码的编译:
g++ -O3 -std=c++11 test.cpp -o output `pkg-config --cflags --libs tesseract opencv`
Run Code Online (Sandbox Code Playgroud)