diff --git a/.gradle/5.6.4/executionHistory/executionHistory.bin b/.gradle/5.6.4/executionHistory/executionHistory.bin index b2f3290..e01f685 100644 Binary files a/.gradle/5.6.4/executionHistory/executionHistory.bin and b/.gradle/5.6.4/executionHistory/executionHistory.bin differ diff --git a/.gradle/5.6.4/executionHistory/executionHistory.lock b/.gradle/5.6.4/executionHistory/executionHistory.lock index f41905f..c07f4cb 100644 Binary files a/.gradle/5.6.4/executionHistory/executionHistory.lock and b/.gradle/5.6.4/executionHistory/executionHistory.lock differ diff --git a/.gradle/5.6.4/fileHashes/fileHashes.bin b/.gradle/5.6.4/fileHashes/fileHashes.bin index 0738f83..7b35081 100644 Binary files a/.gradle/5.6.4/fileHashes/fileHashes.bin and b/.gradle/5.6.4/fileHashes/fileHashes.bin differ diff --git a/.gradle/5.6.4/fileHashes/fileHashes.lock b/.gradle/5.6.4/fileHashes/fileHashes.lock index 72a755d..dd7e35f 100644 Binary files a/.gradle/5.6.4/fileHashes/fileHashes.lock and b/.gradle/5.6.4/fileHashes/fileHashes.lock differ diff --git a/.gradle/5.6.4/fileHashes/resourceHashesCache.bin b/.gradle/5.6.4/fileHashes/resourceHashesCache.bin index 6553a44..f9c317d 100644 Binary files a/.gradle/5.6.4/fileHashes/resourceHashesCache.bin and b/.gradle/5.6.4/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/5.6.4/javaCompile/javaCompile.lock b/.gradle/5.6.4/javaCompile/javaCompile.lock index 4c15796..5cee508 100644 Binary files a/.gradle/5.6.4/javaCompile/javaCompile.lock and b/.gradle/5.6.4/javaCompile/javaCompile.lock differ diff --git a/.gradle/5.6.4/javaCompile/taskHistory.bin b/.gradle/5.6.4/javaCompile/taskHistory.bin index f069e30..8673ce3 100644 Binary files a/.gradle/5.6.4/javaCompile/taskHistory.bin and b/.gradle/5.6.4/javaCompile/taskHistory.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 2bd32c5..b16ddbd 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 7727c82..f0a13a7 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..dab7fb0 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +digitrecognizer \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 9c1f4b4..6d0cbe5 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml index ab507b6..ea3afea 100644 --- a/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml index e1319e2..a741d2b 100644 --- a/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml index c414b56..74e9637 100644 --- a/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml index 725cefe..2c66c82 100644 --- a/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml index 9d18c99..df31b1b 100644 --- a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml +++ b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml index eb2d2db..54edef6 100644 --- a/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml index ef11442..99541b8 100644 --- a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml index f29a998..f176395 100644 --- a/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_databinding_viewbinding_3_6_1_aar.xml b/.idea/libraries/Gradle__androidx_databinding_viewbinding_3_6_1_aar.xml index 2c60683..58838ef 100644 --- a/.idea/libraries/Gradle__androidx_databinding_viewbinding_3_6_1_aar.xml +++ b/.idea/libraries/Gradle__androidx_databinding_viewbinding_3_6_1_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml index 6c31791..4c5a7a8 100644 --- a/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml index bd4660d..184aee0 100644 --- a/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml index 2f1959c..bd9878d 100644 --- a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml index 8961b53..9f34422 100644 --- a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml index a81b3d1..3ba122b 100644 --- a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml index 93b7495..73100c5 100644 --- a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml index 9d58e90..7941d51 100644 --- a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml index c8ad800..62fdbf1 100644 --- a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml index f73916c..b6445fd 100644 --- a/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml index 9ce1dc0..5f266f9 100644 --- a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml index 4563e86..9980c3c 100644 --- a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml index 1905601..0f70c6e 100644 --- a/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml index a33bd3b..e47f74c 100644 --- a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__org_pytorch_pytorch_android_1_4_0_aar.xml b/.idea/libraries/Gradle__org_pytorch_pytorch_android_1_4_0_aar.xml index fc26482..b80da7f 100644 --- a/.idea/libraries/Gradle__org_pytorch_pytorch_android_1_4_0_aar.xml +++ b/.idea/libraries/Gradle__org_pytorch_pytorch_android_1_4_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__org_pytorch_pytorch_android_fbjni_1_4_0_aar.xml b/.idea/libraries/Gradle__org_pytorch_pytorch_android_fbjni_1_4_0_aar.xml index 1ccf310..daec18d 100644 --- a/.idea/libraries/Gradle__org_pytorch_pytorch_android_fbjni_1_4_0_aar.xml +++ b/.idea/libraries/Gradle__org_pytorch_pytorch_android_fbjni_1_4_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__org_pytorch_pytorch_android_torchvision_1_4_0_aar.xml b/.idea/libraries/Gradle__org_pytorch_pytorch_android_torchvision_1_4_0_aar.xml index 60b8657..6fb1a10 100644 --- a/.idea/libraries/Gradle__org_pytorch_pytorch_android_torchvision_1_4_0_aar.xml +++ b/.idea/libraries/Gradle__org_pytorch_pytorch_android_torchvision_1_4_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/app/app.iml b/app/app.iml index def9491..04a1bdf 100644 --- a/app/app.iml +++ b/app/app.iml @@ -10,11 +10,11 @@ - + + + - - + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -87,6 +133,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index 6e2766d..2ae893f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,10 +1,22 @@ apply plugin: 'com.android.application' +apply plugin: 'com.chaquo.python' // Add this line repositories { jcenter() } android { + flavorDimensions "abi" + productFlavors { + arm { + dimension "abi" + ndk { abiFilters "armeabi-v7a" } + } + x86 { + dimension "abi" + ndk { abiFilters "x86" } + } + } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -22,6 +34,16 @@ android { targetSdkVersion 28 versionCode 1 versionName "1.0" + ndk { + abiFilters "armeabi-v7a", "x86" + } + + python { + pip { + install "Pillow" + } + } + } buildTypes { release { diff --git a/app/src/__init__.py b/app/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5606d43..51ddc2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + 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)); + } + } + + // return final image + return bmOut; + } + public Bitmap preprocess_images(Bitmap input_bitmap) { Bitmap gray_bitmap = toGrayscale(input_bitmap); Bitmap resize_bitmap = Bitmap.createScaledBitmap(gray_bitmap, 100, 100, true); //if filter is set to false worse quality Bitmap crop_bitmap = Bitmap.createBitmap(resize_bitmap, (resize_bitmap.getWidth() - 28) / 2, (resize_bitmap.getHeight() - 28) / 2, 28, 28); - Bitmap out_bitmap = changeBitmapContrastBrightness(crop_bitmap, 1, 0); + Bitmap out_bitmap = createContrast(crop_bitmap, 20); return out_bitmap; } @@ -156,10 +207,22 @@ protected void onActivityResult(int requestCode, int resultCode, Intent imageRet if(resultCode == RESULT_OK) { if (resultCode != RESULT_CANCELED) { if (imageReturnedIntent != null) { + PackageManager m = getPackageManager(); + PackageInfo p = null; + try { + p = m.getPackageInfo(getPackageName(), 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + String dataDir = p.applicationInfo.dataDir; + Bundle extras = imageReturnedIntent.getExtras(); photo = (Bitmap) extras.get("data"); - updateScreen(preprocess_images(photo), predict_digits(preprocess_images(photo))); + preprocessImage(photo, dataDir); + + Bitmap bitmap = BitmapFactory.decodeFile(dataDir + "/out.png"); + updateScreen(bitmap, predict_digits(bitmap)); } } } @@ -167,19 +230,48 @@ protected void onActivityResult(int requestCode, int resultCode, Intent imageRet case 1: if(resultCode == RESULT_OK) { if (resultCode != RESULT_CANCELED) { + PackageManager m = getPackageManager(); + PackageInfo p = null; + try { + p = m.getPackageInfo(getPackageName(), 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + String dataDir = p.applicationInfo.dataDir; + Uri uri_photo = imageReturnedIntent.getData(); try { photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri_photo); } catch (IOException e) { e.printStackTrace(); } - updateScreen(preprocess_images(photo), predict_digits(preprocess_images(photo))); + preprocessImage(photo, dataDir); + Bitmap bitmap = BitmapFactory.decodeFile(dataDir + "/out.png"); + updateScreen(bitmap, predict_digits(bitmap)); } } break; } } + public void preprocessImage(Bitmap bitmap, String dataDir) { + //save the bitmap + try (FileOutputStream out = new FileOutputStream(dataDir + "/photo.png")) { + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance + // PNG is a lossless format, the compression factor (100) is ignored + } catch (IOException e) { + e.printStackTrace(); + } + + if(!Python.isStarted()) { + Python.start(new AndroidPlatform(MainActivity.this)); + } + + Python py = Python.getInstance(); + PyObject pym = py.getModule("preprocess"); + PyObject pyf = pym.callAttr("save_image", dataDir); + } + public void btnpressed(View view) { AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); diff --git a/app/src/main/python/__init__.py b/app/src/main/python/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/python/preprocess.py b/app/src/main/python/preprocess.py new file mode 100644 index 0000000..acce078 --- /dev/null +++ b/app/src/main/python/preprocess.py @@ -0,0 +1,26 @@ +from PIL import Image +from PIL import ImageEnhance +import os + +# preprocess the image +def save_image(datadir): + image = Image.open(datadir + "/photo.png").convert('L').point(lambda x: 0 if x<170 else 1) + + image = image.resize((128, 128)) + + new_size = 28 + + width, height = image.size + + left = (width - new_size)/2 + top = (height - new_size)/2 + right = (width + new_size)/2 + bottom = (height + new_size)/2 + image_crop = image.crop((left, top, right, bottom)) + + # enhance the image + # enhance = ImageEnhance.Sharpness(image_crop).enhance(2) + # enhance_contrast = ImageEnhance.Contrast(enhance).enhance(2) + + # save the image + image_crop.convert('L').save(datadir + "/out.png") \ No newline at end of file diff --git a/build.gradle b/build.gradle index addbaa0..dcb2d96 100644 --- a/build.gradle +++ b/build.gradle @@ -2,10 +2,11 @@ buildscript { repositories { google() jcenter() - + maven { url "https://chaquo.com/maven" } } dependencies { classpath 'com.android.tools.build:gradle:3.6.1' + classpath "com.chaquo.python:gradle:7.0.2" } } @@ -13,7 +14,6 @@ allprojects { repositories { google() jcenter() - } }