Skip to content

Commit

Permalink
add file input api
Browse files Browse the repository at this point in the history
  • Loading branch information
huzongyao committed Oct 14, 2019
1 parent b5bdb14 commit eb876d4
Show file tree
Hide file tree
Showing 25 changed files with 354 additions and 93 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ Study DLib and port dlib to android with ndk/cmake.
* DLib Official Site: http://dlib.net/

### Screenshot:
![screenshot](https://github.com/huzongyao/AndroidDlibApp/blob/master/misc/screen1.jpg?raw=true)
| Screenshot | Face Detection |
| ------------ | -------------- |
|![pic](https://github.com/huzongyao/AndroidDlibApp/blob/master/misc/screen1.png?raw=true)|![pic](https://github.com/huzongyao/AndroidDlibApp/blob/master/misc/screen2.png?raw=true)|

### About Me
* GitHub: [https://huzongyao.github.io/](https://huzongyao.github.io/)
Expand Down
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ android {
applicationId "com.hzy.dlib.simple.app"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
versionCode 2
versionName "1.0.1"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
Expand All @@ -34,7 +34,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled false
minifyEnabled true
signingConfig signingConfigs.demokey
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Expand Down
11 changes: 11 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,14 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

## ARouter
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

# If you use the byType method to obtain Service, add the following rules to protect the interface:
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

# If single-type injection is used, that is, no interface is defined to implement IProvider, the following rules need to be added to protect the implementation
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@
</intent-filter>
</activity>
<activity
android:name=".activity.DetectActivity"
android:name=".activity.DetectBitmapActivity"
android:label="@string/detect_from_image" />
<activity
android:name=".activity.DetectFileActivity"
android:label="@string/detect_from_file" />
</application>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.widget.ImageView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import com.alibaba.android.arouter.facade.annotation.Route;
Expand All @@ -19,6 +21,7 @@
import com.hzy.dlib.simple.app.consts.RequestCode;
import com.hzy.dlib.simple.app.consts.RouterHub;
import com.hzy.dlib.simple.app.utils.BitmapDrawUtils;
import com.hzy.dlib.simple.app.utils.DetectUtils;

import java.io.IOException;
import java.io.InputStream;
Expand All @@ -27,8 +30,8 @@
import butterknife.ButterKnife;
import butterknife.OnClick;

@Route(path = RouterHub.DETECT_ACTIVITY)
public class DetectActivity extends AppCompatActivity {
@Route(path = RouterHub.DETECT_BITMAP_ACTIVITY)
public class DetectBitmapActivity extends AppCompatActivity {

@BindView(R.id.demo_image)
ImageView mDemoImage;
Expand All @@ -39,19 +42,32 @@ public class DetectActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detect);
setContentView(R.layout.activity_detect_bitmap);
ButterKnife.bind(this);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
loadBitmapFromImage();
detectFromBitmap();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}

private void detectFromBitmap() {
snakeBarShow("Detecting... Please Wait!!");
new Thread() {
@Override
public void run() {
DLibDetector.INSTANCE.detectFromBitmap(mDemoBitmap);
Rect[] faces = DLibDetector.INSTANCE.getLastDetectedRects();
Rect[] faces = DLibDetector.INSTANCE.detectFromBitmap(mDemoBitmap);
BitmapDrawUtils.drawRectOnBitmap(mDemoBitmap, faces);
mDemoImage.post(() -> {
mDemoImage.setImageBitmap(mDemoBitmap);
Expand All @@ -67,7 +83,7 @@ private void snakeBarShow(String msg) {

private void loadBitmapFromImage() {
try {
InputStream is = getAssets().open("demo.jpg");
InputStream is = getAssets().open(DetectUtils.DEMO_ASSET_NAME);
Bitmap bitmap = ImageUtils.getBitmap(is, MAX_BITMAP_SIZE, MAX_BITMAP_SIZE);
mDemoBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
bitmap.recycle();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.hzy.dlib.simple.app.activity;

import android.graphics.Bitmap;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ImageView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.ImageUtils;
import com.blankj.utilcode.util.SnackbarUtils;
import com.hzy.dlib.libdlib.DLibDetector;
import com.hzy.dlib.simple.app.R;
import com.hzy.dlib.simple.app.consts.RouterHub;
import com.hzy.dlib.simple.app.utils.BitmapDrawUtils;
import com.hzy.dlib.simple.app.utils.DetectUtils;
import com.hzy.dlib.simple.app.utils.SpaceUtils;

import java.io.File;

import butterknife.BindView;
import butterknife.ButterKnife;

@Route(path = RouterHub.DETECT_FILE_ACTIVITY)
public class DetectFileActivity extends AppCompatActivity {

@BindView(R.id.demo_image)
ImageView mDemoImage;
private File mDetectFile;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detect_file);
ButterKnife.bind(this);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
prepareAndDetectFile();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}

private void snakeBarShow(String msg) {
SnackbarUtils.with(mDemoImage).setMessage(msg).show();
}

private void prepareAndDetectFile() {
new Thread() {
@Override
public void run() {
try {
File dir = SpaceUtils.getUsableFilePath();
mDetectFile = new File(dir, DetectUtils.DEMO_ASSET_NAME);
if (!mDetectFile.exists()) {
FileIOUtils.writeFileFromIS(mDetectFile,
getAssets().open(DetectUtils.DEMO_ASSET_NAME));
}
loadAndShowImage(null);
Rect[] faces = DLibDetector.INSTANCE.detectFromFile(mDetectFile.getPath());
loadAndShowImage(faces);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}

private void loadAndShowImage(Rect[] faces) {
Bitmap bitmap = ImageUtils.getBitmap(mDetectFile);
Bitmap newBitmap = bitmap.copy(bitmap.getConfig(), true);
bitmap.recycle();
if (faces != null) {
BitmapDrawUtils.drawRectOnBitmap(newBitmap, faces);
}
mDemoImage.post(() -> {
mDemoImage.setImageBitmap(newBitmap);
if (faces != null) {
snakeBarShow(faces.length + " Faces Detected!!");
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,13 @@ private void showVersionInfo() {
mVersionText.setText(String.format("DLib Version: %s", DLibApi.getVersionString()));
}

@OnClick(R.id.detect_from_image)
public void onDetectImageClicked() {
ARouter.getInstance().build(RouterHub.DETECT_ACTIVITY).navigation();
@OnClick(R.id.detect_from_bitmap)
public void onDetectBitmapClicked() {
ARouter.getInstance().build(RouterHub.DETECT_BITMAP_ACTIVITY).navigation();
}

@OnClick(R.id.detect_from_file)
public void onDetectFileClicked() {
ARouter.getInstance().build(RouterHub.DETECT_FILE_ACTIVITY).navigation();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hzy.dlib.simple.app.consts;

public class RouterHub {
public static final String DETECT_ACTIVITY = "/main/DetectActivity";
public static final String DETECT_BITMAP_ACTIVITY = "/main/DetectBitmapActivity";
public static final String DETECT_FILE_ACTIVITY = "/main/DetectFileActivity";
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.hzy.dlib.libdlib.DLibDetector;

public class DetectUtils {
public static final String DEMO_ASSET_NAME = "demo.jpg";

public static void initDLibAsync() {
new Thread() {
@Override
Expand Down
58 changes: 58 additions & 0 deletions app/src/main/java/com/hzy/dlib/simple/app/utils/SpaceUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.hzy.dlib.simple.app.utils;

import android.os.Environment;

import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.Utils;

import java.io.File;
import java.util.UUID;

public class SpaceUtils {

public static final String WORKSPACE_DIR = "workspace";

/**
* new some file with random file name
*
* @return file object
*/
public static File newUsableFile() {
File fileDir = getUsableFilePath();
if (fileDir.exists()) {
String randomName = UUID.randomUUID().toString();
return new File(fileDir, randomName);
}
return null;
}

public static void clearUsableSpace() {
File spacePath = getUsableFilePath();
if (spacePath.exists()) {
FileUtils.deleteAllInDir(spacePath);
}
}

/**
* get some available path to store files
*
* @return some path
*/
public static File getUsableFilePath() {
File fileDir = null;
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
fileDir = Utils.getApp().getExternalFilesDir(WORKSPACE_DIR);
}
if (fileDir == null) {
fileDir = new File(Utils.getApp().getFilesDir(), WORKSPACE_DIR);
}
if (!fileDir.exists()) {
fileDir.mkdirs();
}
} catch (Exception e) {
e.printStackTrace();
}
return fileDir;
}
}
7 changes: 7 additions & 0 deletions app/src/main/res/drawable/back_rect_round.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="6dp" />
<stroke
android:width="1px"
android:color="@color/colorAccent" />
</shape>
File renamed without changes.
15 changes: 15 additions & 0 deletions app/src/main/res/layout/activity_detect_file.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="6dp">

<ImageView
android:id="@+id/demo_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f7f7f7"
android:maxHeight="400dp" />

</LinearLayout>
Loading

0 comments on commit eb876d4

Please sign in to comment.