Notice
Recent Posts
Recent Comments
Link
투케이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
/* =========================== */
/* =========================== */
[언어 파일 저장 경로]
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments