C++ 为tesseract转换cv::Mat

C++ 为tesseract转换cv::Mat,c++,opencv,tesseract,C++,Opencv,Tesseract,我正在使用OpenCV提取扫描文档的子图像,并希望使用该子图像执行OCR 我发现我可以在tesseract中使用两种文本识别方法,但到目前为止,我还没有找到有效的解决方案 如何将cv::Mat转换为PIX*? (PIX*是的数据类型) 根据下面的vasiles代码,这基本上是我当前的代码: cv::Mat image = cv::imread("c:/image.png"); cv::Mat subImage = image(cv::Rect(50, 200, 300, 100));

我正在使用OpenCV提取扫描文档的子图像,并希望使用该子图像执行OCR

我发现我可以在tesseract中使用两种文本识别方法,但到目前为止,我还没有找到有效的解决方案

如何将
cv::Mat
转换为
PIX*
? (PIX*是的数据类型)

根据下面的vasiles代码,这基本上是我当前的代码:

 cv::Mat image = cv::imread("c:/image.png"); 
 cv::Mat subImage = image(cv::Rect(50, 200, 300, 100)); 

 int depth;
 if(subImage.depth() == CV_8U)
    depth = 8;
 //other cases not considered yet

 PIX* pix = pixCreateHeader(subImage.size().width, subImage.size().height, depth);
 pix->data = (l_uint32*) subImage.data; 

 tesseract::TessBaseAPI tess;
 STRING text; 
 if(tess.ProcessPage(pix, 0, 0, &text))
 {
    std::cout << text.string(); 
 }   
目前我正在使用下面的代码,但它也返回不可读的字符(尽管与上面的代码不同)

char* cr = tess.TesseractRect(
           subImage.data, 
           subImage.channels(), 
           subImage.channels() * subImage.size().width, 
           0, 
           0, 
           subImage.size().width, 
           subImage.size().height);   

首先,制作子映像的深度副本,以便将其存储在一个连续的内存块中:

cv::Mat subImage = image(cv::Rect(50, 200, 300, 100)).clone(); 
然后,初始化一个具有正确参数的PIX头(我不知道如何)

// ???? Put your own constructor here. 
PIX* pix = new PIX_HEADER(width, height, channels, depth); 
或者,手动创建它:

PIX pix;
pix.width = subImage.width;
...
然后将pix数据指针设置为子图像数据指针

pix.data = subImage.data;
最后,在使用pix完成工作之前,确保子映像对象没有超出范围。

cv::Mat image=cv::imread(argv[1]);
tesseract::TessBaseAPI tess; 
cv::Mat sub = image(cv::Rect(50, 200, 300, 100));
tess.SetImage((uchar*)sub.data, sub.size().width, sub.size().height, sub.channels(), sub.step1());
tess.Recognize(0);
const char* out = tess.GetUTF8Text();
cv::席灰色; cv::CVT颜色(图像,灰色,cv_bgr2灰色); PIX*pixS=pixCreate(gray.size().width,gray.size().height,8);
对于(inti=0;i对于任何使用OpenCV/Tesseract的JavaCPP预设的人,以下是有效的方法

Mat img = imread("file.jpg");
Mat gray = new Mat();
cvtColor(img, gray, CV_BGR2GRAY);

// api is a Tesseract client which is initialised

api.SetImage(gray.data().asBuffer(),gray.size().width(),gray.size().height(),gray.channels(),gray.size1())

在iOS上我从来没有成功过。这可能是在原生字节排序与LePutina的需要相匹配的时候。确实是“Kalnn火”。它对C++和IOS(跨平台)都不起作用。同样的图像,从文件名和垫分析,一个是OK(文件名),Mat不是。看看我的MAT图像是二进制的吗?我应该改变什么?
cv::Mat image = cv::imread(argv[1]);

cv::Mat gray;
cv::cvtColor(image, gray, CV_BGR2GRAY);

PIX *pixS = pixCreate(gray.size().width, gray.size().height, 8);

for(int i=0; i<gray.rows; i++) 
    for(int j=0; j<gray.cols; j++) 
        pixSetPixel(pixS, j,i, (l_uint32) gray.at<uchar>(i,j));
Mat img = imread("file.jpg");
Mat gray = new Mat();
cvtColor(img, gray, CV_BGR2GRAY);

// api is a Tesseract client which is initialised

api.SetImage(gray.data().asBuffer(),gray.size().width(),gray.size().height(),gray.channels(),gray.size1())