我知道这个主题已经存在,但我没有找到任何解决办法。我试图在下面的代码中从图片中检测字符:
#include <tesseract/baseapi.h> #include <leptonica/allheaders.h> #include <opencv2/opencv.hpp> #include <sstream> #include <memory> #include <iostream> #define path "/home/jovan/Pictures/" void resize(cv::Mat &img); PIX *mat8ToPix(const cv::Mat *mat8); cv::Mat pix8ToMat(PIX *pix8); int main(int argc, char **argv) // Load image std::stringstream ss; ss << path; ss << argv[1]; cv::Mat im = cv::imread(ss.str() ); if (im.empty()) std::cout<<"Cannot open source image!" << std::endl; return EXIT_FAILURE; resize(im); cv::Mat gray; cv::cvtColor(im, gray, CV_BGR2GRAY); // Pass it to Tesseract API tesseract::TessBaseAPI tess; tess.Init(NULL, "eng", tesseract::OEM_DEFAULT); tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK); tess.SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNM"); PIX *image = mat8ToPix(&im); //tess.SetImage((uchar*)gray.data, gray.cols, gray.rows, 1, gray.cols); tess.SetImage(image); // Get the text char* out = tess.GetUTF8Text(); if(out != nullptr) std::cout << "here it is: "<< out << std::endl; cv::imshow("image", im); cv::imshow("gray", gray); cv::waitKey(); return 0; void resize(cv::Mat &img) while(img.size().width >= 500 && img.size().height >= 500 ) cv::resize(img, img, cv::Size(img.size().width/2, img.size().height/2) ); PIX *mat8ToPix(const cv::Mat *mat8) PIX *pixd = pixCreate(mat8->size().width, mat8->size().height, 8); for(int y=0; y<mat8->rows; y++) for(int x=0; x<mat8->cols; x++) pixSetPixel(pixd, x, y, (l_uint32) mat8->at<uchar>(y,x)); return pixd; cv::Mat pix8ToMat(PIX *pix8) cv::Mat mat(cv::Size(pix8->w, pix8->h), CV_8UC1); uint32_t *line = pix8->data; for (uint32_t y = 0; y < pix8->h; ++y)