투케이2K

169. (AndroidStudio/android/java) tesseract ocr 라이브러리 사용해 이미지 파일 확인 후 텍스트 출력 실시 본문

Android

169. (AndroidStudio/android/java) tesseract ocr 라이브러리 사용해 이미지 파일 확인 후 텍스트 출력 실시

투케이2K 2021. 6. 24. 17:26

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

 

//TODO [로직 [1] : 필요 라이브러리 및 폴더 설정]
    /**
     * 라이브러리 설치 : implementation 'com.rmtheis:tess-two:9.0.0'
     * 필요 언어 파일 다운 : https://github.com/tesseract-ocr/tessdata
     * 안드로이드 assets 폴더 생성 > tessdata 폴더 생성 > 필요 언어 파일 삽입
     * */







//TODO [로직 [2] : 사전 퍼미션 요청 필요함]
    /**
     * <uses-permission android:name="android.permission.CAMERA"/>
     * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     * <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
     * */







//TODO [로직 [3] : 필요한 전역 변수 선언 실시]
TessBaseAPI tessBaseAPI;
String dataPath = "";
String langData = "kor+eng";







//TODO [로직 [4] : oncreate 부분에서 TessBaseAPI 객체 초기화 수행 실시]
try {
            dataPath = getFilesDir() + "/tesseract/";
            checkFile(new File(dataPath + "tessdata/"), "kor");
            checkFile(new File(dataPath + "tessdata/"), "eng");

            tessBaseAPI = new TessBaseAPI();
            tessBaseAPI.init(dataPath, langData);
        }
        catch (Exception e){
            e.printStackTrace();
        }







//TODO [로직 [5] : OCR 인식 위한 파일 존재 확인 메소드 작성]
public void checkFile(File dir, String lang){
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_CameraOcr > checkFile() 메소드 : OCR 인식 위한 파일 존재 확인 실시]");
        Log.d("","\n"+"[언어 파일 : "+String.valueOf(lang)+"]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            if(!dir.exists() && dir.mkdirs()){
                copyFiles(lang);
            }

            if(dir.exists()){
                String dataFilePath = dataPath + "/tessdata/" + lang + ".traineddata";
                File dataFile = new File(dataFilePath);
                if(!dataFile.exists()){
                    copyFiles(lang);
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }








//TODO [로직 [6] : OCR 인식 위한 언어 파일 복사 메소드 작성]
public void copyFiles(String lang){
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_CameraOcr > copyFiles() 메소드 : OCR 인식 위한 언어 파일 복사 실시]");
        Log.d("","\n"+"[언어 파일 : "+String.valueOf(lang)+"]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            String filePath = dataPath + "/tessdata/" + lang + ".traineddata";

            AssetManager assetManager = getAssets();

            InputStream inputStream = assetManager.open("tessdata/" + lang + ".traineddata");
            OutputStream outputStream = new FileOutputStream(filePath);

            byte[] buffer = new byte[1024];
            int read;
            while((read = inputStream.read(buffer)) != -1){
                outputStream.write(buffer, 0, read);
            }
            outputStream.flush();
            outputStream.close();
            inputStream.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }







//TODO [로직 [7] : 카메라 및 갤러리에서 텍스트 사진가져와 이미지 뷰에 표시 실시]







//TODO [로직 [8] : 이미지 뷰에 표시된 사진을 OCR 컨버팅 수행 실시]
public void getOcrConvert(ImageView image){
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_CameraOcr > getOcrConvert() 메소드 : OCR 인식 수행 실시]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            //TODO [drawable 리소스를 비트맵으로 가져오기]
            //Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon_resource);

            //TODO [이미지 뷰의 리소스를 비트맵으로 가져오기]
            Bitmap bitmap = ((BitmapDrawable) image.getDrawable()).getBitmap();

            //TODO [OCR 인식 수행]
            tessBaseAPI.setImage(bitmap);
            String result = String.valueOf(tessBaseAPI.getUTF8Text());

            //TODO [Alert 팝업창 호출 실시]
            getAlertDialog("[OCR] 사진 인식 결과",
                   String.valueOf(result),
                            "확인", "", "");

        }
        catch (Exception e){
            e.printStackTrace();
        }
    }








//TODO [로직 [9] : 일반 Alert 팝업창 호출 메소드]
public void getAlertDialog(String header, String content, String ok, String no, String normal){

        //TODO 타이틀 및 내용 표시
        final String Tittle = header;
        final String Message = content;

        //TODO 버튼 이름 정의
        String buttonNo = no;
        String buttonYes = ok;
        String buttonNature = normal;

        //TODO AlertDialog 팝업창 생성
        new AlertDialog.Builder(A_CameraOcr.this)
                .setTitle(Tittle) //[팝업창 타이틀 지정]
                //.setIcon(R.drawable.tk_app_icon) //[팝업창 아이콘 지정]
                .setMessage(Message) //[팝업창 내용 지정]
                .setCancelable(false) //[외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정]
                .setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                    }
                })
                .setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                    }
                })
                .setNeutralButton(buttonNature, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                    }
                })
                .show();
    }

/* =========================== */

/* =========================== */

언어 파일 다운 사이트 : https://github.com/tesseract-ocr/tessdata

 

tesseract-ocr/tessdata

Trained models with support for legacy and LSTM OCR engine - tesseract-ocr/tessdata

github.com

/* =========================== */

​/* =========================== */

[언어 파일 저장 경로]

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

반응형
Comments