Listing Program
Otsu_method.java
packagecom.example.demong_pc.implement_ocr_otsu; importandroid.graphics.Bitmap;
importandroid.graphics.Color;
import android.support.v7.app.AppCompatActivity; /**
* Created by Demong - PC on 15-May-17. */
public class Otsu_method extends AppCompatActivity { public static int[] imageHistogram (Bitmap input){111 int[] histogram = new int[256];
for(int i=0; i<histogram.length; i++) histogram[i] = 0; for(int i=0; i<input.getWidth(); i++) {
for(int j=0; j<input.getHeight(); j++) { intwarna = input.getPixel(i,j);
int red= Color.red(warna); histogram[red]++;
} }
return histogram; }
private staticintotsuTreshold (Bitmap original){ int[] histogram = imageHistogram(original);
int total = original.getWidth() * original.getHeight(); float sum = 0;
for(int i=0; i<256; i++) sum += i * histogram[i]; floatsumB = 0;
intwB = 0; intwF = 0;
floatvarMax = 0; int threshold = 0;
for(int i=0 ; i<256 ; i++) { wB += histogram[i];
if(wB == 0) continue; wF = total - wB; if(wF == 0) break;
sumB += (float) (i * histogram[i]); floatmB = sumB / wB;
float mF = (sum - sumB) / wF;
floatvarBetween = (float) wB * (float) wF * (mB - mF) * (mB - mF);
No table of contents entries found.threshold = i; }
}
return threshold; }
public static Bitmap toGray (Bitmap original){ intalpa_pic,red_pic,green_pic, blue_pic ; intnewPixel;
int width = original.getWidth(); int height = original.getHeight();
Bitmap bmOut = Bitmap.createBitmap(width, height, original.getConfig());
for (int i = 0; i<original.getWidth(); i++){ for (int j=0; j<original.getHeight(); j++){ intwarna = original.getPixel(i,j);
alpa_pic = Color.alpha(warna); red_pic = Color.red(warna); green_pic = Color.green(warna); blue_pic = Color.blue(warna);
red_pic = (int) (0.21 * red_pic + 0.71 * green_pic + 0.07 * blue_pic);; // newPixel =
Color.argb(alpa_pic,red_pic,red_pic,red_pic);
bmOut.setPixel(i,j, Color.argb(alpa_pic,red_pic,red_pic,red_pic)); }
}
returnbmOut; }
public static Bitmap createContrast(Bitmap src, double value) { // image size
int width = src.getWidth(); int height = src.getHeight(); // create output bitmap
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
// color information int A, R, G, B;
int pixel;
// get contrast value
double contrast = Math.pow((100 + value) / 100, 2); // scan through all pixels
for(int x = 0; x < width; ++x) { for(int y = 0; y < height; ++y) { // get pixel color pixel = src.getPixel(x, y);
A = Color.alpha(pixel);
// apply filter contrast for every channel R, G, B R = Color.red(pixel);
if(R < 0) { R = 0; }
else if(R > 255) { R = 255; }
G = Color.red(pixel);
G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
if(G < 0) { G = 0; }
else if(G > 255) { G = 255; }
B = Color.red(pixel);
B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
if(B < 0) { B = 0; }
else if(B > 255) { B = 255; }
// set new pixel color to output bitmap bmOut.setPixel(x, y, Color.argb(A, R, G, B));
} } returnbmOut; }
public static Bitmap binarize (Bitmap original){ int red;
intnewPixel;
int width = original.getWidth(); int height = original.getHeight(); int threshold = otsuTreshold(original);
Bitmap asule = Bitmap.createBitmap(width, height, original.getConfig());
for (int i = 0; i<original.getWidth(); i++){ for (int j= 0; j<original.getHeight(); j++){ intwarna = original.getPixel(i,j);
intalpa_pic = Color.alpha(warna); intred_pic = Color.red(warna); if(red_pic> threshold){
newPixel = 255; } else{
newPixel = 0; }
newPixel = Color.argb(alpa_pic,newPixel,newPixel,newPixel); asule.setPixel(i,j,newPixel);
} } return asule; }
}
CaptureActivity.java
packagecom.example.demong_pc.implement_ocr_otsu.fragment; importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.DialogInterface; importandroid.content.Intent;
importandroid.content.pm.PackageManager; importandroid.content.res.AssetManager; importandroid.database.Cursor;
importandroid.graphics.Bitmap; importandroid.graphics.Canvas; importandroid.graphics.Matrix; importandroid.graphics.Paint;
importandroid.graphics.drawable.BitmapDrawable; importandroid.net.Uri;
importandroid.os.AsyncTask; importandroid.os.Bundle;
importandroid.provider.MediaStore; importandroid.speech.tts.TextToSpeech;
importandroid.support.design.widget.FloatingActionButton; importandroid.support.media.ExifInterface;
import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; importandroid.util.Log;
importandroid.view.LayoutInflater; importandroid.view.View;
importandroid.view.ViewGroup; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.ImageView; importandroid.widget.Toast;
importcom.example.demong_pc.implement_ocr_otsu.ApiConnector; importcom.example.demong_pc.implement_ocr_otsu.ConvolutionMatrix; importcom.example.demong_pc.implement_ocr_otsu.DownloadImageTask; importcom.example.demong_pc.implement_ocr_otsu.Otsu_method; importcom.example.demong_pc.implement_ocr_otsu.R;
importcom.example.demong_pc.implement_ocr_otsu.activity.Utility; importcom.example.demong_pc.implement_ocr_otsu.translate.Language; importcom.example.demong_pc.implement_ocr_otsu.translate.YandexTranslato rAPI;
importcom.googlecode.tesseract.android.TessBaseAPI; importorg.json.JSONArray;
importorg.json.JSONObject;
importjava.io.ByteArrayOutputStream; importjava.io.File;
importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; import java.net.URL;
/**
* Created by Demong - PC on 07-May-17. */
public class CaptureActivity extends Fragment implements View.OnClickListener{
// TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
// TODO: Rename and change types of parameters private String mParam1;
private String mParam2;
private String userChoosenTask, pat; privateExifInterfaceexif;
privateint REQUEST_CAMERA = 0, SELECT_FILE = 1; privateFloatingActionButton fab;
privateImageViewphoto,tulis;
private Bitmap resize,ocr_has,greyscale,bismilah; privateEditText OCR;
privateEditTexthasil;
private String url,query,url2; private Button trans,voice;
private Locale bahasa_awal= Locale.ENGLISH; private Locale bahasa_tujuan= Locale.ENGLISH; private char aduh;
privateOnFragmentInteractionListenermListener; public static String apiKey
="trnsl.1.1.20170521T102809Z.607761b5575a2d66.a6024221856221c34eb6f93d9c 5e50436f3d405d";
private static final String SERVICE_URL =
"https://translate.yandex.net/api/v1.5/tr.json/translate?"; private static final String TRANSLATION_LABEL = "text"; private static final String baseUrlForImage =
"http://192.168.43.164/tugasAkhir/kata/"; public String data[] = new String[90];
public String dataGambar [] = new String[90];
public static int SIZE=500;
public static int table[]=new int[SIZE];
Bitmap image;
int result;
publicCaptureActivity() {
// Required empty public constructor }
// TODO: Rename and change types and number of parameters
public static CaptureActivitynewInstance(String param1, String param2) { CaptureActivity fragment = new CaptureActivity();
Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args);
return fragment; }
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); }
}
@Override
public View onCreateView(LayoutInflaterinflater, ViewGroup container, Bundle savedInstanceState)
//initialize Tesseract API String language = "jpn";
datapath = getActivity().getFilesDir()+ "/tesseract/"; mTess = new TessBaseAPI();
checkFile(new File(datapath + "tessdata/")); mTess.init(datapath, language);
//translate
bahasa_awal = Locale.JAPANESE; bahasa_tujuan = Locale.ENGLISH; otsu = new Otsu_method(); //otsu.
fab.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View view) { selectImage();
} });
toSpeech = new TextToSpeech(CaptureActivity.this.getActivity(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) { if(status==TextToSpeech.SUCCESS) {
result=toSpeech.setLanguage(Locale.JAPANESE); }
{
Toast.makeText(getActivity(),"NOtsuppord",Toast.LENGTH_SHORT).show(); }
} }); return view; }
@Override
public void onRequestPermissionsResult(intrequestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
caseUtility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: if (grantResults.length> 0 &&grantResults[0] ==
PackageManager.PERMISSION_GRANTED) { if(userChoosenTask.equals("Take Photo")) cameraIntent();
else if(userChoosenTask.equals("Choose from Library")) galleryIntent();
} else {
//code for deny }
break; } }
private void checkFile(File dir) { if (!dir.exists()&&dir.mkdirs()){ copyFiles();
}
if(dir.exists()) {
String datafilepath = datapath+ "/tessdata/jpn.traineddata"; File datafile = new File(datafilepath);
if (!datafile.exists()) { copyFiles();
} } }
@Override
public void onDestroy(){ super.onDestroy();
if(toSpeech != null){ toSpeech.stop(); toSpeech.shutdown(); }
}
String filepath = datapath + "/tessdata/jpn.traineddata"; AssetManagerassetManager = getActivity().getAssets();
InputStreaminstream = assetManager.open("tessdata/jpn.traineddata"); OutputStreamoutstream = new FileOutputStream(filepath);
byte[] buffer = new byte[1024]; int read;
while ((read = instream.read(buffer)) != -1) { outstream.write(buffer, 0, read);
} outstream.flush(); outstream.close(); instream.close();
File file = new File(filepath); if (!file.exists()) {
throw new FileNotFoundException(); }
} catch (FileNotFoundException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace();
} }
private void selectImage() {
finalCharSequence[] items = { "Take Photo", "Choose from Library", "Cancel" };
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Add Photo!");
builder.setItems(items, new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int item) { boolean result=Utility.checkPermission(CaptureActivity.this); if (items[item].equals("Take Photo")) {
userChoosenTask ="Take Photo"; if(result)
cameraIntent();
} else if (items[item].equals("Choose from Library")) { userChoosenTask ="Choose from Gsllery";
if(result) galleryIntent();
} else if (items[item].equals("Cancel")) { dialog.dismiss();
} } }); builder.show(); }
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, SELECT_FILE);
}
private void cameraIntent() {
Intent intent = new
Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
//intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,android.provi der.MediaStore.Images.Media.EXTERNAL_CONTENT_URI );
startActivityForResult(intent, REQUEST_CAMERA); }
@Override
public void onActivityResult(intrequestCode, intresultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_FILE)
onSelectFromGalleryResult(data);
else if (requestCode == REQUEST_CAMERA) onCaptureImageResult(data);
} }
private void onCaptureImageResult(Intent data){
Bitmap bmp = (Bitmap) data.getExtras().get("data"); /*
ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray();
// convert byte array to Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
*/
Uri tempuri = getImageUri(getContext(), bmp); String pat =getttRealPathFromURI(tempuri); photo.setImageBitmap(bmp);
}
public Uri getImageUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path =
MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
returnUri.parse(path); }
Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
intidx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); returncursor.getString(idx);
}
private void onSelectFromGalleryResult(Intent data) { //String LOG_TAG;
Uri photoUri = data.getData();
// Do something with the photo based on Uri Bitmap selectedImage = null;
try {
selectedImage =
MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver( ), photoUri);
} catch (IOException e) { e.printStackTrace();
}
pat =getRealPathFromURI(photoUri, this.getContext()); // Bitmap otate = rotateBitmap(pat, selectedImage); photo.setImageBitmap(selectedImage);
}
public StringgetRealPathFromURI(Uri contentURI,Context context) { String path= contentURI.getPath();
try {
Cursor cursor =
context.getContentResolver().query(contentURI, null, null, null, null); cursor.moveToFirst();
String document_id = cursor.getString(0);
document_id = document_id.substring(document_id.lastIndexOf(":") + 1); cursor.close();
cursor = context.getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
cursor.moveToFirst(); path =
cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); cursor.close();
}
catch(Exception e) {
privateintgetExifOrientation(String src) throws IOException { int orientation = 1;
ExifInterfaceexif = new ExifInterface(src); String
orientationString=exif.getAttribute(ExifInterface.TAG_ORIENTATION); try {
orientation = Integer.parseInt(orientationString); }
catch(NumberFormatException e){}
return orientation; }
public BitmaprotateBitmap(String src, Bitmap bitmap) { try {
int orientation = getExifOrientation(src);
Toast.makeText(getActivity(), "ori ="+orientation, Toast.LENGTH_SHORT).show();
if (orientation == 1) {
// return bitmap;
Toast.makeText(getActivity(), "ori = 1", Toast.LENGTH_SHORT).show();
}
Matrix matrix = new Matrix(); switch (orientation) {
case 2:
matrix.setScale(-1, 1); break;
case 3:
//fotokebalik matrix.setRotate(90);
break; case 4:
matrix.setRotate(180); matrix.postScale(-1, 1); break;
case 5:
matrix.setRotate(90); matrix.postScale(-1, 1); break;
case 6:
matrix.setRotate(270);
Toast.makeText(getActivity(), "ori = 6", Toast.LENGTH_SHORT).show(); break;
case 7:
matrix.postScale(-1, 1); break;
case 8:
//kekiri matrix.setRotate(90);
break; default: return bitmap; }
bismilah = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
//bitmap.recycle();
} catch (IOException e) { e.printStackTrace();
}
returnbismilah ; }
public Bitmap BITMAP_RESIZER(Bitmap bitmap,intnewWidth,intnewHeight) { Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
floatratioX = newWidth / (float) bitmap.getWidth(); floatratioY = newHeight / (float) bitmap.getHeight(); floatmiddleX = newWidth / 2.0f;
floatmiddleY = newHeight / 2.0f;
Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);
Canvas canvas = new Canvas(scaledBitmap); canvas.setMatrix(scaleMatrix);
canvas.drawBitmap(bitmap, middleX - bitmap.getWidth() / 2, middleY - bitmap.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));
returnscaledBitmap; }
// TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri); }
}
@Override
mListener = null; }
public interface OnFragmentInteractionListener { // TODO: Update argument type and name voidonFragmentInteraction(Uri uri);
}
public static String execute(final String text, final Language from, final Language to) throws Exception {
validateServiceState(text);
YandexTranslatorAPIapi = new YandexTranslatorAPI(); String PARAM_API_KEY = api.PARAM_API_KEY; String ENCODING = api.ENCODING;
String PARAM_TEXT = api.PARAM_TEXT;
String PARAM_LANG_PAIR = api.PARAM_LANG_PAIR; final String params =
PARAM_API_KEY + URLEncoder.encode(apiKey,ENCODING) + PARAM_LANG_PAIR +
URLEncoder.encode(from.toString(),ENCODING) + URLEncoder.encode("-",ENCODING) + URLEncoder.encode(to.toString(),ENCODING)
+ PARAM_TEXT + URLEncoder.encode(text,ENCODING); final URL url = new URL(SERVICE_URL + params);
returnapi.retrievePropArrString(url, TRANSLATION_LABEL).trim(); }
private static void validateServiceState(final String text) throws Exception {
YandexTranslatorAPIapi = new YandexTranslatorAPI(); String ENCODING = api.ENCODING;
finalintbyteLength = text.getBytes(ENCODING).length;
if(byteLength>10240) { // TODO What is the maximum text length allowable for Yandex?
throw new RuntimeException("TEXT_TOO_LARGE"); }
//validateServiceState(); }
@Override
public void onClick(View view) { if(view==trans) {
ocr_has = ((BitmapDrawable) photo.getDrawable()).getBitmap(); Bitmap rotate = rotateBitmap(pat, ocr_has);
//Bitmap resaize = BITMAP_RESIZER(rotate,100,300); //Bitmap smoothing = smooth(rotate,50);
Bitmap gray = Otsu_method.toGray(rotate); Bitmap binary = Otsu_method.binarize(gray);
String OCRresult = null; mTess.setImage(binary);
// TextViewOCRTextView = (TextView) findViewById(R.id.OCRTextView);
chararr[]= OCRresult.toCharArray(); for(int i=0; i<arr.length; i++){ if(arr[i]=='一')
{ arr[i]=' '; } else if(arr[i]==' ') { arr[i]=' '; } else
{ arr[i]=arr[i]; } }
OCR.setText(String.valueOf(arr).replace(" ","")); Toast.makeText(getActivity(), OCR.getText().toString(), Toast.LENGTH_SHORT).show();
newgetTrans().execute();
newGetCustomerDetails().execute(new ApiConnector());
}
if(view==voice){
String kata = OCR.getText().toString(); if(result==TextToSpeech.LANG_MISSING_DATA ||
result==TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(getActivity(),"NOtsuppord",Toast.LENGTH_SHORT).show(); }
else
{
toSpeech.speak(kata, TextToSpeech.QUEUE_FLUSH, null); }
} }
public void shifttable(String pattern) { inti,j,m;
char p[] = pattern.toCharArray(); m=pattern.length();
for (i=0;i<SIZE;i++) table[i]=m;
public static inthorspool(String source,String pattern) {
inti,k,pos,m;
char s[] = source.toCharArray(); char p[] = pattern.toCharArray(); m=pattern.length(); for(i=m-1;i<source.length();) {
k=0;
while((k<m) && (p[m-1-k] == s[i-k])) k++;
if(k==m)
{ pos=i-m+2; returnpos;
} else
i+=table[s[i]]; }
return -1; }
publicinthorspool_execute(String kata, String pattern){ intpos;
String text = kata; String patt = pattern; shifttable(patt);
pos = horspool(text,patt); if(pos==-1){
//Toast.makeText(getActivity(), "Tidakada", Toast.LENGTH_SHORT).show();
} else {
//Toast.makeText(getActivity(), "ada", Toast.LENGTH_SHORT).show();
}
returnpos ; }
private class getTrans extends AsyncTask<String, Void, String> { String kata = OCR.getText().toString();
String trans =""; @Override
protected String doInBackground(String... params) { try {
trans = CaptureActivity.execute(kata, Language.JAPANANESE,Language.INDONESIA); } catch (Exception e) { e.printStackTrace();
}
@Override
protected void onPostExecute(String trans){ if(trans != null) {
hasil.setText(trans);
Toast.makeText(CaptureActivity.this.getActivity(), "SuksesTRasnlate"+trans, Toast.LENGTH_SHORT).show(); }
} }
private class GetCustomerDetails extends AsyncTask<ApiConnector,Long,JSONArray> {
ProgressDialogpDialog;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub super.onPreExecute();
pDialog = new ProgressDialog(getActivity()); pDialog.setMessage("Please Wait...");
pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show();
}
@Override
protectedJSONArraydoInBackground(ApiConnector... params) {
// it is executed on Background thread
returnparams[0].GetAllCustomers(); }
@Override
protected void onPostExecute(JSONArrayjsonArray) { String kata_trans =
hasil.getText().toString().toLowerCase(); booleancek = false;
intcek_proses = 50; try
{
intpanjang = jsonArray.length();
Toast.makeText(getActivity(), "panjang"+panjang, Toast.LENGTH_SHORT).show();
for (int i = 0; i<panjang; i++) {
String getString = customer.getString("b_indo"); String getGambar = customer.getString("nameImage"); data[i] = getString;
dataGambar[i]=getGambar; }
for(int x=1; x<data.length; x++) { if(data[x].equals(kata_trans)){
inthasil = horspool_execute(kata_trans,data[x]); if (hasil == -1) {
cek=false;
} else {
Toast.makeText(getActivity(), "ada"+x, Toast.LENGTH_SHORT).show(); cek=true;
String urlForImage = baseUrlForImage + dataGambar[x];
newDownloadImageTask(tulis).execute(urlForImage); break;
} } else {
tulis.setImageResource(R.drawable.img); cek = false;
}
pDialog.dismiss(); } if(cek=false){
Toast.makeText(getActivity(), "tidakada", Toast.LENGTH_SHORT).show(); }
else {
Toast.makeText(getActivity(), "ada", Toast.LENGTH_SHORT).show(); }