android:从图像中提取文本

时间:2011-05-27 07:24:37

标签: java android

我正在开发一个应用程序,需要将jpeg图像转换为文本,以便我可以识别图像中写入的文本。请给我一个指导。

1 个答案:

答案 0 :(得分:1)

摘自Making OCR app using Tesseract.

注意:这些说明适用于Android SDK r19和Android NDK r7c。在64位Ubuntu上,您可能需要安装ia32-libs 32位兼容性库。您还需要添加适当的PATH变量。

下载源代码或克隆此git repository。该项目包含用于编译在Android上使用的Tesseract,Leptonica和JPEG库的工具。它包含一个Eclipse Android库项目,该项目提供了一个Java API,用于访问本机编译的Tesseract和Leptonica API。你不需要眼睛 - 两个代码,你可以不用它。

使用这些命令构建这个项目(这里,tess-two是tess-two中的目录 - 与tess-two-test处于同一级别的目录):

cd <project-directory>/tess-two
ndk-build
android update project --path .
ant release

现在将项目作为Eclipse中的库导入。

File -> Import -> Existing Projects into workspace -> tess-two directory<code>. Right click the project, Android Tools -> Fix Project Properties. Right click -> Properties -> Android -> Check Is Library

配置项目以将tess-two项目用作库项目:

Right click your project name -> Properties -> Android -> Library -> Add, and choose tess-two. 

现在您已准备好使用该库OCR任何图像。

首先,我们需要自己拍照。为此,我发现了一个简单的代码来捕获图像。在我们得到位图之后,我们只需要执行相对容易的OCR。请务必通过以下操作来纠正旋转和图像类型:

// _path = path to the image to be OCRed
ExifInterface exif = new ExifInterface(_path);
int exifOrientation = exif.getAttributeInt(
        ExifInterface.TAG_ORIENTATION,
        ExifInterface.ORIENTATION_NORMAL);

int rotate = 0;

switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
    rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
    rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
    rotate = 270;
break;
}

if (rotate != 0) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    // Setting pre rotate
    Matrix mtx = new Matrix();
    mtx.preRotate(rotate);

    // Rotating Bitmap & convert to ARGB_8888, required by tess
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
}
bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

现在我们在位图中有了图像,我们可以简单地使用TessBaseAPI来运行OCR,如:

TessBaseAPI baseApi = new TessBaseAPI();
// DATA_PATH = Path to the storage
// lang = for which the language data exists, usually "eng"
baseApi.init(DATA_PATH, lang);
// Eg. baseApi.init("/mnt/sdcard/tesseract/tessdata/eng.traineddata", "eng");
baseApi.setImage(bitmap);
String recognizedText = baseApi.getUTF8Text();
baseApi.end();
(You can download the language files from [here][2] and put them in a directory on your device – manually or by code)

现在你已经在变量RecognText中获得了OCRed文本,你可以用它做任何事情 - 翻译,搜索,任何东西! PS。您可以通过首选项添加各种语言支持,然后从here下载所需的语言数据文件。您甚至可以将它们放在assets文件夹中,并在启动时将它们复制到SD卡。

<强>疑难解答

  • 关于更新PATH - 您需要更新PATH变量以使命令起作用,否则您将看到命令未找到错误。对于Android SDK,将SDK工具和平台工具目录的位置添加到PATH环境变量中。对于Android NDK,使用相同的过程将android-ndk目录添加到PATH变量。
  • Maven-ising - 由James Elsey检查post。他还提到他在没有任何问题的情况下在Windows上工作。
  • 你也可以在这个页面上尝试Ctrl + F-ing你的问题,有人可能已经遇到过它并在评论中发布了一个解决方案。