无法解决符号错误。 (位图,返回,tessdatamanager)

时间:2018-07-31 16:20:42

标签: android

package gt.otomat;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.googlecode.tesseract.android.TessBaseAPI;
import com.googlecode.tesseract.android.*;
import android.graphics.Bitmap;

public class otomat extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gt_otomat);


        public String detectText(Bitmap bitmap) {

            TessDataManager.initTessTrainedData(context);
            TessBaseAPI tessBaseAPI = new TessBaseAPI();

            String path = "/mnt/sdcard/packagename/tessdata/tr.traineddata";

            tessBaseAPI.setDebug(true);
            tessBaseAPI.init(path, "tr");



            tessBaseAPI.setImage(bitmap);

            String text = tessBaseAPI.getUTF8Text();

            Log.d(TAG, "Got data: " + result);
            tessBaseAPI.end();

            return text;
        }

    }
}

我在此代码中使用了teserract ocr库。但是我收到关于无法解析符号的错误;类似于bitmaptextTessDataManager

如何解决此问题?我尝试了几种方法,但无法解决此问题

3 个答案:

答案 0 :(得分:0)

好像您在onCreate中有一个方法声明-请将其声明出来,否则IDE将不知道您在做什么。

public class otomat extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.gt_otomat);

    }

   //Move this function out of onCreate()
    public String detectText(Bitmap bitmap) {

        TessDataManager.initTessTrainedData(context);
        TessBaseAPI tessBaseAPI = new TessBaseAPI();

        String path = "/mnt/sdcard/packagename/tessdata/tr.traineddata";

        tessBaseAPI.setDebug(true);
        tessBaseAPI.init(path, "tr");



        tessBaseAPI.setImage(bitmap);

        String text = tessBaseAPI.getUTF8Text();

        Log.d(TAG, "Got data: " + result);
        tessBaseAPI.end();

        return text;
    }
}

如果您使用的是Android Studio,通常可以通过在其上按Alt + Enter来解决任何红色花键,并获取要解决的选项列表,通常会导入所需的类

答案 1 :(得分:0)

在您的代码中,您需要创建TessDataManager.java类,它将包含您的文件夹目录,我从以下链接获得了引用:-

https://www.programcreek.com/java-api-examples/?code=simplezhli/Tesseract-OCR-Scanner/Tesseract-OCR-Scanner-master/app/src/main/java/com/zl/tesseract/scanner/tess/TessEngine.java

也许会对您有帮助。

TessDataManager.Java

public class TessDataManager {

static final String TAG = "DBG_" + TessDataManager.class.getName();

private static final String tessdir = "tesseract";
private static final String subdir = "tessdata";
private static final String filename = "eng.traineddata";

private static String trainedDataPath;

private static String tesseractFolder;

public static String getTesseractFolder() {
    return tesseractFolder;
}

public static String getTrainedDataPath(){
    return initiated ? trainedDataPath : null;
}

private static boolean initiated;

public static void initTessTrainedData(Context context){

    if(initiated){
        return;
    }

    File appFolder = context.getFilesDir();
    File folder = new File(appFolder, tessdir);
    if(!folder.exists()){
        folder.mkdir();
    }

    tesseractFolder = folder.getAbsolutePath();

    File subfolder = new File(folder, subdir);
    if(!subfolder.exists()){
        subfolder.mkdir();
    }

    File file = new File(subfolder, filename);
    trainedDataPath = file.getAbsolutePath();
    Log.d(TAG, "Trained data filepath: " + trainedDataPath);

    if(!file.exists()) {

        try {
            FileOutputStream fileOutputStream;
            byte[] bytes = readRawTrainingData(context);
            if (bytes == null){
                return;
            }

            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(bytes);
            fileOutputStream.close();
            initiated = true;
            Log.d(TAG, "Prepared training data file");
        } catch (FileNotFoundException e) {
            Log.e(TAG, "Error opening training data file\n" + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "Error opening training data file\n" + e.getMessage());
        }
    }
    else{
        initiated = true;
    }
}

private static byte[] readRawTrainingData(Context context){

    try {
        InputStream fileInputStream = context.getResources()
                .openRawResource(R.raw.eng_traineddata);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        byte[] b = new byte[1024];

        int bytesRead;

        while (( bytesRead = fileInputStream.read(b))!=-1){
            bos.write(b, 0, bytesRead);
        }

        fileInputStream.close();

        return bos.toByteArray();

    } catch (FileNotFoundException e) {
        Log.e(TAG, "Error reading raw training data file\n"+e.getMessage());
        return null;
    } catch (IOException e) {
        Log.e(TAG, "Error reading raw training data file\n" + e.getMessage());
    }

    return null;
}
 }

TestActivity.class

 public class TestActivity extends AppCompatActivity {
 private Context context;

@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    setContentView(R.layout.test);
    context = this;
   **// here pass your bitmap value.**
    detectText(bitmap);
    }

public String detectText(Bitmap bitmap) {

    TessDataManager.initTessTrainedData(context);
    TessBaseAPI tessBaseAPI = new TessBaseAPI();

    String path = "/mnt/sdcard/packagename/tessdata/tr.traineddata";

    tessBaseAPI.setDebug(true);
    tessBaseAPI.init(path, "tr");


    tessBaseAPI.setImage(bitmap);

    String text = tessBaseAPI.getUTF8Text();

    Log.d(TAG, "Got data: " + result);
    tessBaseAPI.end();

    return text;
}

}

在您的 build.gradle 中,更新您的库:-

 implementation 'com.rmtheis:tess-two:9.0.0'

希望对您有帮助。 :)

答案 2 :(得分:0)

如果您使用的是第三方库,请确保已连接到良好的网络

尝试将Google Maven存储库添加到应用程序的build.gradle文件中:

repositories {
    maven { url "https://maven.google.com" }
}

如果第1步不起作用,请从项目根文件夹中删除gradle,然后重新构建项目。

再试一次

  

转到>文件->其他设置->在构建,执行和部署下   ->您将看到Gradle。取消选中复选框离线工作