Opencv 放大Tesseract OCR的边界矩形

Opencv 放大Tesseract OCR的边界矩形,opencv,tesseract,Opencv,Tesseract,我正在使用Tesseract OCR和OpenCV从Mat图像中获取数字,尤其是零,但Tesseract常常无法正确识别零。我认为发生这种情况是因为边界矩形太小,并且会切割数字的一部分,所以“0”变成了“c”或“n”。 有办法放大边界矩形吗?这是我的密码: int main() { Mat img1 = imread("Input/05.png"); cvtColor(img1, img1, CV_BGR2GRAY); Size size(img1.cols*1.5,img1.row

我正在使用Tesseract OCR和OpenCV从Mat图像中获取数字,尤其是零,但Tesseract常常无法正确识别零。我认为发生这种情况是因为边界矩形太小,并且会切割数字的一部分,所以“0”变成了“c”或“n”。 有办法放大边界矩形吗?这是我的密码:

int main()
{
  Mat img1 = imread("Input/05.png");
  cvtColor(img1, img1, CV_BGR2GRAY);
  Size size(img1.cols*1.5,img1.rows*1.5);
  Mat img;
  resize(img1, img, size);
  //pre-processing start

  IplImage* image = new IplImage(img);
  IplImage* bWImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  cvThreshold(image, bWImage, 180, 255, THRESH_BINARY);
  Mat patch = cvarrToMat(bWImage, true);

  //pre-processing end

  tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
  api->Init(NULL, "eng");
  api->SetImage((uchar*)patch.data, patch.cols, patch.rows, 1, patch.cols);
  //api->SetVariable("classify_bln_numeric_mode", "1");
  //api->SetRectangle(30, 400, 400, 40);
  api->Recognize(NULL);

  tesseract::ResultIterator* ri = api->GetIterator();
  tesseract::PageIteratorLevel level = tesseract::RIL_WORD;
  vector<Point> points;
  if (ri != 0){
     do {
       const char* word = ri->GetUTF8Text(level);
       float conf = ri->Confidence(level);
       int x1, y1, x2, y2;
       if(word != 0){
          ri->BoundingBox(level, &x1, &y1, &x2, &y2);
          rectangle(patch, Point(x1,y1), Point(x2,y2), 0, 1, 8);
          imshow("Zero", patch);
          waitKey();
          printf("word: '%s';  \tconf: %.2f; BoundingBox: %d,%d,%d,%d;\n", word, conf, x1, y1, x2, y2);
       }
       delete[] word;
     } while (ri->Next(level));
 }
}
intmain()
{
Mat img1=imread(“Input/05.png”);
CVT颜色(img1、img1、CV_bgr2灰色);
大小(img1.cols*1.5,img1.rows*1.5);
Mat-img;
调整大小(img1、img、size);
//预处理启动
IplImage*图像=新IplImage(img);
IplImage*bWImage=cvCreateImage(cvGetSize(图像),IPL_DEPTH_8U,1);
cvThreshold(图像,bWImage,180,255,阈值二进制);
Mat patch=cvarrToMat(bWImage,真);
//预处理端
tesseract::TessBaseAPI*api=新的tesseract::TessBaseAPI();
api->Init(空,“eng”);
api->SetImage((uchar*)patch.data,patch.cols,patch.rows,1,patch.cols);
//api->SetVariable(“分类模式”、“1”);
//api->SetRectangle(30,400,400,40);
api->识别(空);
tesseract::ResultIterator*ri=api->GetIterator();
tesseract::PageIteratorLevel=tesseract::RIL\u单词;
矢量点;
如果(ri!=0){
做{
const char*word=ri->GetUTF8Text(级别);
浮动形态=ri->置信度(水平);
int-x1,y1,x2,y2;
如果(字!=0){
ri->边界框(标高,&x1,&y1,&x2,&y2);
矩形(面片,点(x1,y1),点(x2,y2),0,1,8);
imshow(“零”,补丁);
waitKey();
printf(“单词:'%s';\tconf:%.2f;边框:%d,%d,%d;\n”,单词,形态,x1,y1,x2,y2);
}
删除[]字;
}while(ri->Next(level));
}
}

不要使用
IplImage、cvThreshold
等。。。不推荐使用C api。你能发布一个示例图像吗?您是将边界框传递给tesseract,还是tesseract找到了一个较小的框?很抱歉,如果我不正确,我将整个图像传递给tesseract,然后它会找到所有的数字,并用一个矩形将其绑定,我将显示该矩形绘制一个cv::矩形,其坐标为tesseract bounding rect(x1,x2,x2,y2)。我没有把任何东西传给tesseract。我应该吗?这取决于你的形象。如果能够分割每个数字,则可以将每个方框(最终放大)传递给tesseract(最终将its字母表限制为仅数字)。