Tesseract 没有给出识别结果(Android工作室;Java)
Tesseract gives no recognition results (Android studio; Java)
我正在 Android Studio 上使用 tesseract OCR 制作应用程序。我制作了一个代码,可以识别 phone 相机拍摄的图像上的文字。问题:tesseract 函数 getUTF8Text() 根本没有给出任何结果(尽管图片带有文本,但为空)。程序没有给出任何错误。
我想知道可能存在的问题: 1. 可能是我没有将tesseract 正确地集成到我的项目中? (编译器在代码中使用 tesseract classes 时没有显示任何问题) 2. 代码中可能有问题? (错误的训练数据路径??)。
主要class:
代码:
private TessOCR Tess;
//after taking picture I call:
PictureCallback pictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
String result = Tess.getOCRResult(bitmap);
if (result != null) Log.i(TAG, result);
else Log.i(TAG, "NO RESULT");
}
};
TessOCR class 用于 tesseract 训练数据文件查找或添加以及文本识别(构造函数仅用于查找训练数据文件):
public class TessOCR {
public static final String PACKAGE_NAME = "com.example.dainius.ocr";
public static final String DATA_PATH = Environment
.getExternalStorageDirectory().toString() + "/AndroidOCR/";
public static final String lang = "eng";
private static final String TAG = "OCR";
private TessBaseAPI mTess;
public TessOCR(AssetManager assetManager) {
mTess = new TessBaseAPI();
String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" };
for (String path : paths) {
File dir = new File(path);
if (!dir.exists()) {
if (!dir.mkdirs()) {
Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed");
return;
} else {
Log.v(TAG, "Created directory " + path + " on sdcard");
}
}
}
if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
try {
InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
OutputStream out = new FileOutputStream(DATA_PATH
+ "tessdata/" + lang + ".traineddata");
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
Log.v(TAG, "Copied " + lang + " traineddata");
} catch (IOException e) {
Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
}
}
mTess.setDebug(true);
mTess.init(DATA_PATH, lang);
}
public String getOCRResult(Bitmap bitmap) {
mTess.setImage(bitmap);
String result = mTess.getUTF8Text();
return result;
}
public void onDestroy() {
if (mTess != null)
mTess.end();
}
- 如果这个问题是由于 tesseract 集成不好引起的,请 post 一个关于如何集成它的正确教程,因为互联网上的每个教程都各不相同,很难理解如何正确地做它。
我使用过 Tesseract (tess4j)。您是否尝试过使用文字非常清晰且完全 monochrome/grayscale 的图像?我发现,当我试图让 Tesseract 读取我的图像时,花时间处理图像以使 Tesseract 更容易使用会更有用。
如果您仍然无法让它产生输出并且它没有显示任何错误,我会去 here 并按照教程重新启动 Tesseract 设置并遵循他们的所有提示.应该不会太难,.dll 是自动提取和加载的。只需确保您的 tessdata 文件夹位于正确的位置(根目录)并且您拥有所有 .jar(我认为您只需要 4 个,而不是全部,但请查看 tess4j.sourceforge.com 上的教程)作为 compile-time 库。
取自他们的网站:"Images intended for OCR should have at least 200 DPI in resolution, typically 300 DPI, 1 bpp (bit per pixel) monochome or 8 bpp grayscale uncompressed TIFF or PNG format."老实说,除了他们的 PDF 工具扫描 easy-to-read high-resolution 文档外,我对 Tesseract 的运气并不好。
我第一次也没有让它工作,不管它值多少钱。
我的问题的原因是我没有权限写入外部存储。如果有人尝试应用此方法从资产文件夹中提取文件(从 this github project 获得此方法),请确保您添加了将外部存储代码行写入清单的权限(AndroidManifest.xml 文件):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我正在 Android Studio 上使用 tesseract OCR 制作应用程序。我制作了一个代码,可以识别 phone 相机拍摄的图像上的文字。问题:tesseract 函数 getUTF8Text() 根本没有给出任何结果(尽管图片带有文本,但为空)。程序没有给出任何错误。
我想知道可能存在的问题: 1. 可能是我没有将tesseract 正确地集成到我的项目中? (编译器在代码中使用 tesseract classes 时没有显示任何问题) 2. 代码中可能有问题? (错误的训练数据路径??)。
主要class: 代码:
private TessOCR Tess;
//after taking picture I call:
PictureCallback pictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
String result = Tess.getOCRResult(bitmap);
if (result != null) Log.i(TAG, result);
else Log.i(TAG, "NO RESULT");
}
};
TessOCR class 用于 tesseract 训练数据文件查找或添加以及文本识别(构造函数仅用于查找训练数据文件):
public class TessOCR {
public static final String PACKAGE_NAME = "com.example.dainius.ocr";
public static final String DATA_PATH = Environment
.getExternalStorageDirectory().toString() + "/AndroidOCR/";
public static final String lang = "eng";
private static final String TAG = "OCR";
private TessBaseAPI mTess;
public TessOCR(AssetManager assetManager) {
mTess = new TessBaseAPI();
String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" };
for (String path : paths) {
File dir = new File(path);
if (!dir.exists()) {
if (!dir.mkdirs()) {
Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed");
return;
} else {
Log.v(TAG, "Created directory " + path + " on sdcard");
}
}
}
if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
try {
InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
OutputStream out = new FileOutputStream(DATA_PATH
+ "tessdata/" + lang + ".traineddata");
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
Log.v(TAG, "Copied " + lang + " traineddata");
} catch (IOException e) {
Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
}
}
mTess.setDebug(true);
mTess.init(DATA_PATH, lang);
}
public String getOCRResult(Bitmap bitmap) {
mTess.setImage(bitmap);
String result = mTess.getUTF8Text();
return result;
}
public void onDestroy() {
if (mTess != null)
mTess.end();
}
- 如果这个问题是由于 tesseract 集成不好引起的,请 post 一个关于如何集成它的正确教程,因为互联网上的每个教程都各不相同,很难理解如何正确地做它。
我使用过 Tesseract (tess4j)。您是否尝试过使用文字非常清晰且完全 monochrome/grayscale 的图像?我发现,当我试图让 Tesseract 读取我的图像时,花时间处理图像以使 Tesseract 更容易使用会更有用。
如果您仍然无法让它产生输出并且它没有显示任何错误,我会去 here 并按照教程重新启动 Tesseract 设置并遵循他们的所有提示.应该不会太难,.dll 是自动提取和加载的。只需确保您的 tessdata 文件夹位于正确的位置(根目录)并且您拥有所有 .jar(我认为您只需要 4 个,而不是全部,但请查看 tess4j.sourceforge.com 上的教程)作为 compile-time 库。
取自他们的网站:"Images intended for OCR should have at least 200 DPI in resolution, typically 300 DPI, 1 bpp (bit per pixel) monochome or 8 bpp grayscale uncompressed TIFF or PNG format."老实说,除了他们的 PDF 工具扫描 easy-to-read high-resolution 文档外,我对 Tesseract 的运气并不好。
我第一次也没有让它工作,不管它值多少钱。
我的问题的原因是我没有权限写入外部存储。如果有人尝试应用此方法从资产文件夹中提取文件(从 this github project 获得此方法),请确保您添加了将外部存储代码行写入清单的权限(AndroidManifest.xml 文件):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />