Skip to content

Commit 17566d2

Browse files
author
Vladimir Kocheryzhkin
committed
Add custom detector
1 parent 9e6a1bb commit 17566d2

File tree

4 files changed

+114
-27
lines changed

4 files changed

+114
-27
lines changed

visionSamples/FaceTracker/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<uses-feature android:name="android.hardware.camera" />
99

1010
<uses-permission android:name="android.permission.CAMERA" />
11+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
12+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1113

1214
<uses-sdk
1315
android:minSdkVersion="9"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.google.android.gms.samples.vision.face.facetracker;
2+
3+
import android.graphics.Bitmap;
4+
import android.os.Environment;
5+
import android.util.Log;
6+
import android.util.SparseArray;
7+
8+
import com.google.android.gms.vision.Detector;
9+
import com.google.android.gms.vision.Frame;
10+
import com.google.android.gms.vision.face.Face;
11+
12+
import java.io.FileOutputStream;
13+
import java.io.IOException;
14+
import java.util.Map;
15+
16+
public class CustomDetector extends Detector<Face> {
17+
private static final String TAG = "CustomDetector";
18+
private Detector<Face> mDelegate;
19+
private Map<Face, String> mFaceNameMap;
20+
21+
CustomDetector(Detector<Face> delegate, Map<Face, String> faceNameMap) {
22+
mDelegate = delegate;
23+
mFaceNameMap = faceNameMap;
24+
}
25+
//@Override
26+
public SparseArray<Face> detect(Frame frame) {
27+
Log.i(TAG, "CustomDetector detect");
28+
SparseArray<Face> faces = mDelegate.detect(frame);
29+
// Bitmap bmp = frame.getBitmap();
30+
//
31+
// FileOutputStream out = null;
32+
// try {
33+
// String path = Environment.getExternalStorageDirectory().toString();
34+
// out = new FileOutputStream(path +"SDCARD name + increment");
35+
// bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
36+
// } catch (Exception e) {
37+
// e.printStackTrace();
38+
// } finally {
39+
// try {
40+
// if (out != null) {
41+
// out.close();
42+
// }
43+
// } catch (IOException e) {
44+
// e.printStackTrace();
45+
// }
46+
// }
47+
48+
for(int i = 0; i < faces.size(); i++) {
49+
Face f = faces.valueAt(i);
50+
mFaceNameMap.put(f, "put cropped bitmap here");
51+
}
52+
return faces;
53+
}
54+
55+
public boolean isOperational() {
56+
return mDelegate.isOperational();
57+
}
58+
59+
public boolean setFocus(int id) {
60+
return mDelegate.setFocus(id);
61+
}
62+
}

visionSamples/FaceTracker/app/src/main/java/com/google/android/gms/samples/vision/face/facetracker/FaceGraphic.java

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@
1919
import android.graphics.Color;
2020
import android.graphics.Paint;
2121
import android.util.Log;
22+
import android.util.SparseArray;
2223

2324
import com.google.android.gms.samples.vision.face.facetracker.ui.camera.GraphicOverlay;
25+
import com.google.android.gms.vision.Detector;
2426
import com.google.android.gms.vision.face.Face;
2527

28+
import java.util.Map;
29+
2630
/**
2731
* Graphic instance for rendering face position, orientation, and landmarks within an associated
2832
* graphic overlay view.
2933
*/
3034
class FaceGraphic extends GraphicOverlay.Graphic {
35+
private static final String TAG = "FaceGraphic";
3136
private static final float FACE_POSITION_RADIUS = 10.0f;
3237
private static final float ID_TEXT_SIZE = 40.0f;
3338
private static final float ID_Y_OFFSET = 50.0f;
@@ -53,7 +58,7 @@ class FaceGraphic extends GraphicOverlay.Graphic {
5358
private int mFaceId;
5459
private float mFaceHappiness;
5560

56-
private static final String RTAG = "RTAG";
61+
5762
private Thread mT;
5863

5964
FaceGraphic(GraphicOverlay overlay) {
@@ -79,31 +84,39 @@ void setId(int id) {
7984
mFaceId = id;
8085
}
8186

82-
public void startRecognition(Face item)
87+
public void startRecognition(Face item, Map<Face, String> mFaceNameMap)
8388
{
84-
test();
85-
mT = new Thread(new Runnable() {
86-
@Override
87-
public void run() {
88-
Log.i(RTAG, "startRecognition: ");
89-
try {
90-
Thread.sleep(5000);
91-
mFaceId = 777;
92-
} catch (InterruptedException e) {
93-
e.printStackTrace();
94-
}
95-
//mFace
96-
}
97-
});
98-
mT.start();
89+
Log.i(TAG, String.format("hashmap: %d" , mFaceNameMap.size()));
90+
// test();
91+
// mT = new Thread(new Runnable() {
92+
// @Override
93+
// public void run() {
94+
// Log.i(TAG, "startRecognition: ");
95+
//
96+
// try {
97+
// Thread.sleep(5000);
98+
// mFaceId = 777;
99+
// } catch (InterruptedException e) {
100+
// e.printStackTrace();
101+
// }
102+
// //mFace
103+
// }
104+
// });
105+
// mT.start();
99106
}
100107

101-
public void stopRecognition()
108+
public void stopRecognition(Detector.Detections<Face> detectionResults, Map<Face, String> mFaceNameMap)
102109
{
103-
Log.i(RTAG, "stopRecognition: ");
104-
if (mT.isAlive())
105-
{
106-
mT.stop();
110+
Log.i(TAG, "stopRecognition: ");
111+
// if (mT.isAlive())
112+
// {
113+
// mT.stop();
114+
// }
115+
//mFaceNameMap.remove(fa)
116+
SparseArray<Face> faces = detectionResults.getDetectedItems();
117+
for(int i = 0; i < faces.size(); i++) {
118+
Face f = faces.valueAt(i);
119+
mFaceNameMap.remove(f);
107120
}
108121
}
109122

visionSamples/FaceTracker/app/src/main/java/com/google/android/gms/samples/vision/face/facetracker/FaceTrackerActivity.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import com.google.android.gms.samples.vision.face.facetracker.ui.camera.GraphicOverlay;
4141

4242
import java.io.IOException;
43+
import java.util.HashMap;
44+
import java.util.Map;
4345

4446
/**
4547
* Activity for the face tracker app. This app detects faces with the rear facing camera, and draws
@@ -52,6 +54,9 @@ public final class FaceTrackerActivity extends AppCompatActivity {
5254

5355
private CameraSourcePreview mPreview;
5456
private GraphicOverlay mGraphicOverlay;
57+
private CustomDetector customDetector;
58+
59+
public Map<Face, String> mFaceNameMap;
5560

5661
private static final int RC_HANDLE_GMS = 9001;
5762
// permission request codes need to be < 256
@@ -130,11 +135,16 @@ private void createCameraSource() {
130135
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
131136
.build();
132137

133-
detector.setProcessor(
138+
mFaceNameMap = new HashMap<>();
139+
customDetector = new CustomDetector(detector, mFaceNameMap);
140+
//.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
141+
//.build();
142+
143+
customDetector.setProcessor(
134144
new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
135145
.build());
136146

137-
if (!detector.isOperational()) {
147+
if (!customDetector.isOperational()) {
138148
// Note: The first time that an app using face API is installed on a device, GMS will
139149
// download a native library to the device in order to do detection. Usually this
140150
// completes before the app is run for the first time. But if that download has not yet
@@ -146,7 +156,7 @@ private void createCameraSource() {
146156
Log.w(TAG, "Face detector dependencies are not yet available.");
147157
}
148158

149-
mCameraSource = new CameraSource.Builder(context, detector)
159+
mCameraSource = new CameraSource.Builder(context, customDetector)
150160
.setRequestedPreviewSize(640, 480)
151161
.setFacing(CameraSource.CAMERA_FACING_BACK)
152162
.setRequestedFps(30.0f)
@@ -298,7 +308,7 @@ private class GraphicFaceTracker extends Tracker<Face> {
298308
public void onNewItem(int faceId, Face item)
299309
{
300310
mFaceGraphic.setId(faceId);
301-
mFaceGraphic.startRecognition(item);
311+
mFaceGraphic.startRecognition(item, mFaceNameMap);
302312
}
303313

304314
/**
@@ -317,7 +327,7 @@ public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face)
317327
*/
318328
@Override
319329
public void onMissing(FaceDetector.Detections<Face> detectionResults) {
320-
mFaceGraphic.stopRecognition();
330+
mFaceGraphic.stopRecognition(detectionResults, mFaceNameMap);
321331
mOverlay.remove(mFaceGraphic);
322332
}
323333

0 commit comments

Comments
 (0)