OpenCV + cvFindContours + tesseract-ocr
主指:
利用cvFindContour找出輪廓,然後依照輪廓的大小在去排除較小的輪廓
之後截取圖片利用 tesseract-ocr 辨識
缺點:
1.看來在符號部分必須還要在一次細部輪廓大小判別
2.在確認的部分,看來tesseract-ocr對英文跟數字的辨識率蠻高的說,
不過在符號的部分,卻沒有辨識,可能要在利用 tesseract-ocr的訓練器在截取 訓練符號的樣本了
流程:
1.樣本圖片:
2.在cvFindContours 尋找輪廓 ~在DOS部份我顯示出輪廓的高度
3.我把它存成tif檔案 ~但是肉眼一看明顯2.tif就是不及格的圖片
4.所以就加入限制
for (ptr =contours; ptr != NULL; ptr = ptr->h_next)
{
double reg = fabs(cvContourArea(ptr, CV_WHOLE_SEQ));
//if(reg >600 && reg <10000)
{
CvScalar ext_color = CV_RGB( 255, 255, 255 ); //randomly coloring different contours
CvRect rectEst = cvBoundingRect( ptr, 0 );
CvPoint pt1,pt2;
pt1.x = rectEst.x;
pt1.y = rectEst.y;
pt2.x = rectEst.x+ rectEst.width;
pt2.y = rectEst.y+ rectEst.height;
printf("%d \n",(pt2.y-pt1.y));
int thickness =1 ;
cvRectangle( img3, pt1, pt2, CV_RGB(255,255,255 ), thickness );
cvSetImageROI(img,rectEst);
if((pt2.y-pt1.y)>30)
{
object_total++;
char filename[50]; // buff is large enough to hold the entire formatted string
sprintf(filename, "%d.tif", object_total);
// printf(filename);
cvSaveImage(filename,img,0);
}
cvResetImageROI(img);
}
}
5.結合另一篇 (tesseract-ocr 文字辨識 ) 去辨識三張圖片~輸出文字
tesseract::TessBaseAPI api;
api.Init("", "eng", tesseract::OEM_DEFAULT);
api.SetPageSegMode(static_cast<tesseract::PageSegMode>(7));
api.SetOutputName("out");
for(int i=1;i<=object_total;i++){
char image[256];
sprintf(image, "%d.tif", i);
PIX *pixs = pixRead(image);
STRING text_out;
api.ProcessPages(image, NULL, 0, &text_out);
FILE *output;
char itxt[256];
sprintf(itxt, "%d.txt", i);
output=fopen(itxt,"wb");
fwrite( text_out.string(), 1, text_out.length(), output );
fclose(output);
string Text01 = UTF8ToBig5(text_out.string());
cout<<"輸出文字:"<<Text01.c_str()<<endl;
}
擷取樣本圖示:
1.tif
2.tif
3.tif
沒有留言:
張貼留言