我正在使用Tess-Two为Android创建OCR。我使用了相同的图像进行转换,但结果与台式机的tesseract非常不同。
桌面版的tesseract效果更好。
我在Android上使用以下行:
val baseApi = TessBaseAPI()
baseApi.init(dirPath, "eng")
baseApi.setImage(mustOpen)
val recognizedText = baseApi.utF8Text
在台式机上,我仅使用此简单命令
tesseract image.png result
示例图片为:
使用tesseract for Desktop的图像输出为:
VEGETABLE OF, RIVET een Sra) SUGAR, EDIBLE
VEGETABLE OIL, INVERT SUGAR S' SUGAR, CITRIC
RAISING 503 (ii), BAKING }, SALT,
SOLIDS (0.6 % [ DL-ACETYL TARTARIC
ACID ESTERS OF ‘AND
而且,使用tess-two的android输出是这样的:
'm mm W7 ' ' iii-E:
mmmmfiwgmb Ian»: came
a” ( om | mmmfiéu
mmormuguomws _
Won mm .. . . ml
mumm I'm‘n
( .
哪个很乱。请帮忙。
答案 0 :(得分:0)
当我评论您的帖子并为我解决后,我以为我分享了。
对我来说,第一个问题是需要对图像进行预处理以获得更好的结果。我正在使用OpenCV进行预处理。这里的https://android.jlelse.eu/a-beginners-guide-to-setting-up-opencv-android-library-on-android-studio-19794e220f3c是如何设置它的一个很好的例子。
然后,需要将图像切换为二进制图像。对我来说,以下方法可获得最佳效果
Mat plateMat = Utils.loadResource(this,R.drawable.plate);
Mat gray = new Mat();
Imgproc.cvtColor(plateMat,gray,Imgproc.COLOR_BGR2GRAY);
Mat blur = new Mat();
Imgproc.GaussianBlur(gray,blur,new Size(3,3),0);
Mat thresh = new Mat();
Imgproc.adaptiveThreshold(blur,thresh,255, Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY_INV,75,10);
Core.bitwise_not(thresh,thresh);
Bitmap bmp = Bitmap.createBitmap(thresh.width(),thresh.height(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(thresh,bmp);
然后我使用eng + osd语言(按此顺序)致电Tesseract,您可以在这里找到它们: https://github.com/tesseract-ocr/tessdata
然后使用tesseract执行此操作
TessBaseAPI tesseract = new TessBaseAPI();
tesseract.setDebug(true);
tesseract.init(getFilesDir().getAbsolutePath(),"eng+osd");
tesseract.setImage(bmp);
String utf8 = tesseract.getUTF8Text();
现在真正的交易
最后我得到不同结果的真正问题仅仅是因为Mac上安装了Homebrew的tesseract版本是4.1.0,而官方的Tess-2回购仍使用3.05 通过深入研究回购问题,我发现Tess 2的开发人员在Tesseract 4中使用了新版本,但需要将其放在另一个回购中。是这里 https://github.com/adaptech-cz/Tesseract4Android
一旦我克隆了它并使用了从项目中提取的aar,结果是一样的,我终于可以安然入睡了!