2011-05-27 67 views
5

我正在研究一個應用程序,它需要將jpeg圖像轉換爲文本,以便我可以識別圖像中寫入的文本。請給我一個指導來做到這一點。android:從圖像中提取文本

+0

的[機器人OCR?](http://stackoverflow.com/questions/1106202/android-ocr) – EboMike 2012-03-26 19:24:17

+0

谷歌最近發佈了一個API OCR實現這一可能重複:https://developers.google.com/vision/text-overview – Wirling 2016-06-28 10:53:07

回答

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庫項目,該項目提供了一個用於訪問本機編譯的Tesseract和Leptonica API的Java API。你不需要眼睛 - 兩個代碼,你可以沒有它。

構建這個項目中使用這些命令(在這裏,苔絲,二是裏面的目錄苔絲二 - 一個在同一水平苔絲 - 雙測試):

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 

配置項目中使用的苔絲個項目作爲庫項目:

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) 

現在你已經在變量identText中獲得了OCR文本,你可以做任何事情 - 翻譯,搜索,任何事情! PS。您可以通過首選項添加各種語言支持,然後從here下載所需的語言數據文件。您甚至可以將它們放入資產文件夾並在開始時將它們複製到SD卡中。

故障排除

  • 關於更新路徑 - 您需要更新的命令功能PATH變量,否則你會看到沒有找到錯誤的命令。對於Android SDK,將SDK工具和平臺工具目錄的位置添加到PATH環境變量中。對於Android NDK,使用相同的過程將android-ndk目錄添加到PATH變量。
  • Maven-ising - 查看James Elsey的post。他還提到他在Windows上工作時沒有任何問題。
  • 您也可以嘗試在此頁面上按Ctrl + F查看您的問題,有人可能已經遇到了問題並在評論中發佈瞭解決方案。
+0

你沒有寫這篇文章 - 請清楚地說明你已經從博客文章中複製它(爲你添加了鏈接),以避免被視爲剽竊。 – laalto 2014-09-09 11:14:31

+0

早些時候,我曾經立即發佈鏈接,但Stack Overflow的成員是告訴我將任何鏈接的數據置入答案的人,因爲鏈接不起作用。 – Confuse 2014-09-09 11:24:44

+0

是的。不要發佈僅鏈接的答案。不要將其他人的內容發佈爲自己的內容。 – laalto 2014-09-09 11:27:26