-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathMLKitObjectsAnalyzer.java
141 lines (125 loc) · 5.37 KB
/
MLKitObjectsAnalyzer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.asmaamir.mlkitdemo.RealTimeObjectDetection;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.util.Log;
import android.view.TextureView;
import android.widget.ImageView;
import androidx.camera.core.CameraX;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageProxy;
import com.google.firebase.ml.vision.FirebaseVision;
import com.google.firebase.ml.vision.common.FirebaseVisionImage;
import com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata;
import com.google.firebase.ml.vision.objects.FirebaseVisionObject;
import com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetector;
import com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions;
import java.util.Arrays;
import java.util.List;
public class MLKitObjectsAnalyzer implements ImageAnalysis.Analyzer {
private static final String TAG = "MLKitObjectsAnalyzer";
private FirebaseVisionObjectDetector objectDetector;
private TextureView tv;
private ImageView iv;
private Bitmap bitmap;
private Canvas canvas;
private Paint linePaint;
private float widthScaleFactor = 1.0f;
private float heightScaleFactor = 1.0f;
private FirebaseVisionImage fbImage;
private CameraX.LensFacing lens;
MLKitObjectsAnalyzer(TextureView tv, ImageView iv, CameraX.LensFacing lens) {
this.tv = tv;
this.iv = iv;
this.lens = lens;
}
@Override
public void analyze(ImageProxy image, int rotationDegrees) {
if (image == null || image.getImage() == null) {
return;
}
int rotation = degreesToFirebaseRotation(rotationDegrees);
fbImage = FirebaseVisionImage.fromMediaImage(image.getImage(), rotation);
initDrawingUtils();
initDetector();
detectObjects();
}
private void initDrawingUtils() {
bitmap = Bitmap.createBitmap(tv.getWidth(), tv.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
linePaint = new Paint();
linePaint.setColor(Color.CYAN);
linePaint.setStyle(Paint.Style.STROKE);
linePaint.setStrokeWidth(3f);
linePaint.setTextSize(40);
widthScaleFactor = canvas.getWidth() / (fbImage.getBitmap().getWidth() * 1.0f);
heightScaleFactor = canvas.getHeight() / (fbImage.getBitmap().getHeight() * 1.0f);
}
private void initDetector() {
FirebaseVisionObjectDetectorOptions detectorOptions = new FirebaseVisionObjectDetectorOptions
.Builder()
.setDetectorMode(FirebaseVisionObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.build();
objectDetector = FirebaseVision.getInstance().getOnDeviceObjectDetector(detectorOptions);
}
private void detectObjects() {
objectDetector.processImage(fbImage).addOnSuccessListener(firebaseVisionObjects -> {
if (!firebaseVisionObjects.isEmpty()) {
processObjects(firebaseVisionObjects);
} else {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY);
}
}).addOnFailureListener(e -> {
});
}
private void processObjects(List<FirebaseVisionObject> firebaseVisionObjects) {
List<String> classes = Arrays.asList("CATEGORY_UNKNOWN", "CATEGORY_HOME_GOOD",
"CATEGORY_FASHION_GOOD", "CATEGORY_FOOD",
"CATEGORY_PLACE", "CATEGORY_PLANT");
Log.i(TAG, "Size: " + firebaseVisionObjects.size());
for (FirebaseVisionObject object : firebaseVisionObjects) {
Log.i(TAG, object.getClassificationCategory() + "");
Rect box = new Rect((int) translateX(object.getBoundingBox().left),
(int) translateY(object.getBoundingBox().top),
(int) translateX(object.getBoundingBox().right),
(int) translateY(object.getBoundingBox().bottom));
canvas.drawRect(box, linePaint);
canvas.drawText(String.format("%s %.2f",
classes.get(object.getClassificationCategory()),
object.getClassificationConfidence() == null ? 0 : object.getClassificationConfidence()),
translateX(object.getBoundingBox().centerX()),
translateY(object.getBoundingBox().centerY()),
linePaint);
}
iv.setImageBitmap(bitmap);
}
private float translateY(float y) {
return y * heightScaleFactor;
}
private float translateX(float x) {
float scaledX = x * widthScaleFactor;
if (lens == CameraX.LensFacing.FRONT) {
return canvas.getWidth() - scaledX;
} else {
return scaledX;
}
}
private int degreesToFirebaseRotation(int degrees) {
switch (degrees) {
case 0:
return FirebaseVisionImageMetadata.ROTATION_0;
case 90:
return FirebaseVisionImageMetadata.ROTATION_90;
case 180:
return FirebaseVisionImageMetadata.ROTATION_180;
case 270:
return FirebaseVisionImageMetadata.ROTATION_270;
default:
throw new IllegalArgumentException("Rotation must be 0, 90, 180, or 270.");
}
}
}