Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 22c5041

Browse files
#699 Add ML Kit support (renamed all methods to *OnDevice/*Cloud, and started documentation)
1 parent e3aaeff commit 22c5041

34 files changed

+342
-156
lines changed

demo-ng/app/app.css

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,6 @@ button {
7575
background-color: #1832d5;
7676
}
7777

78-
.mlKitCamera {
79-
/*border-radius: 20;*/
80-
/*border-width: 8;*/
81-
/*border-color: #ddd;*/
82-
width: 280;
83-
height: 280;
84-
margin-top: 16;
85-
}
86-
8778
Label.mlkit-result {
8879
margin: 5;
8980
text-align: left;

demo-ng/app/tabs/mlkit/barcodescanning/barcodescanning.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<MLKitBarcodeScanner
1010
row="1"
11-
width="300"
11+
width="260"
1212
height="340"
1313
formats="QR_CODE, EAN_8, EAN_13"
1414
processEveryNthFrame="5"

demo-ng/app/tabs/mlkit/barcodescanning/barcodescanning.component.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component } from "@angular/core";
2-
import { MLKitScanBarcodesResult } from "nativescript-plugin-firebase/mlkit/barcodescanning";
2+
import { MLKitScanBarcodesOnDeviceResult } from "nativescript-plugin-firebase/mlkit/barcodescanning";
33

44
@Component({
55
selector: "mlkit-barcodescanning",
@@ -13,8 +13,7 @@ export class BarcodeScanningComponent {
1313
}>;
1414

1515
onBarcodeScanResult(event): void {
16-
const result: MLKitScanBarcodesResult = event.value;
16+
const result: MLKitScanBarcodesOnDeviceResult = event.value;
1717
this.barcodes = result.barcodes;
18-
console.log(">>> onBarcodeScanResult, this.barcodes: " + JSON.stringify(this.barcodes));
1918
}
2019
}

demo-ng/app/tabs/mlkit/facedetection/facedetection.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<MLKitFaceDetection
1010
row="1"
11-
width="300"
11+
width="260"
1212
height="340"
1313
processEveryNthFrame="30"
1414
(scanResult)="onFaceDetectionResult($event)">
@@ -25,9 +25,9 @@
2525
<ListView row="4" [items]="faces">
2626
<ng-template let-item="item">
2727
<GridLayout columns="*, *, *">
28-
<Label col="0" class="mlkit-result" textWrap="true" [text]="item.smilingProbability | number"></Label>
29-
<Label col="1" class="mlkit-result" textWrap="true" [text]="item.leftEyeOpenProbability | number"></Label>
30-
<Label col="2" class="mlkit-result" textWrap="true" [text]="item.rightEyeOpenProbability | number"></Label>
28+
<Label col="0" class="mlkit-result" [class.c-purple]="item.smilingProbability > 0.7" [text]="item.smilingProbability | number" textWrap="true"></Label>
29+
<Label col="1" class="mlkit-result" [class.c-purple]="item.leftEyeOpenProbability > 0.7" [text]="item.leftEyeOpenProbability | number" textWrap="true"></Label>
30+
<Label col="2" class="mlkit-result" [class.c-purple]="item.rightEyeOpenProbability > 0.7" [text]="item.rightEyeOpenProbability | number" textWrap="true"></Label>
3131
</GridLayout>
3232
</ng-template>
3333
</ListView>

demo-ng/app/tabs/mlkit/facedetection/facedetection.component.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Component } from "@angular/core";
2-
import { MLKitDetectFacesResult } from "nativescript-plugin-firebase/mlkit/facedetection";
3-
import { ImageSource } from "tns-core-modules/image-source";
2+
import { MLKitDetectFacesOnDeviceResult } from "nativescript-plugin-firebase/mlkit/facedetection";
43

54
@Component({
65
selector: "mlkit-facedetection",
@@ -18,7 +17,7 @@ export class FaceDetectionComponent {
1817
mlKitAllOK: string;
1918

2019
onFaceDetectionResult(scanResult: any): any {
21-
const value: MLKitDetectFacesResult = scanResult.value;
20+
const value: MLKitDetectFacesOnDeviceResult = scanResult.value;
2221
if (value.faces.length > 0) {
2322
this.faces = value.faces;
2423

demo-ng/app/tabs/mlkit/imagelabeling/imagelabeling.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<MLKitImageLabeling
88
row="0"
9-
width="300"
9+
width="260"
1010
height="340"
1111
(scanResult)="onImageLabeledResult($event)">
1212
</MLKitImageLabeling>

demo-ng/app/tabs/mlkit/imagelabeling/imagelabeling.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component } from "@angular/core";
2-
import { MLKitImageLabelingResult } from "nativescript-plugin-firebase/mlkit/imagelabeling";
2+
import { MLKitImageLabelingOnDeviceResult } from "nativescript-plugin-firebase/mlkit/imagelabeling";
33

44
@Component({
55
selector: "mlkit-imagelabeling",
@@ -13,7 +13,7 @@ export class ImageLabelingComponent {
1313
}>;
1414

1515
onImageLabeledResult(scanResult: any): void {
16-
const value: MLKitImageLabelingResult = scanResult.value;
16+
const value: MLKitImageLabelingOnDeviceResult = scanResult.value;
1717
this.labels = value.labels;
1818
}
1919
}

demo-ng/app/tabs/mlkit/mlkit.component.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
<StackLayout row="1" orientation="horizontal" horizontalAlignment="center">
66
<Button text="Cameraroll" (tap)="fromCameraroll()" class="button"></Button>
7-
<Button text="Cam picture" (tap)="fromCameraPicture()" class="button"></Button>
7+
<!-- the image may require rotation on Android, and permission may be required - not feeling like exposing this for now -->
8+
<iOS>
9+
<Button text="Cam picture" (tap)="fromCameraPicture()" class="button"></Button>
10+
</iOS>
811
<Button text="Cam feed" (tap)="fromCameraFeed()" class="button"></Button>
912
</StackLayout>
1013

demo-ng/app/tabs/mlkit/mlkit.component.ts

Lines changed: 66 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import { Component, NgZone } from "@angular/core";
2+
import { RouterExtensions } from "nativescript-angular";
23
import { ImageSource } from "tns-core-modules/image-source";
3-
4-
import { BarcodeFormat, MLKitScanBarcodesResult } from "nativescript-plugin-firebase/mlkit/barcodescanning";
5-
import { MLKitRecognizeTextLocalResult, MLKitRecognizeTextCloudResult } from "nativescript-plugin-firebase/mlkit/textrecognition";
6-
import { MLKitLandmarkRecognitionCloudResult } from "nativescript-plugin-firebase/mlkit/landmarkrecognition";
7-
import { MLKitDetectFacesResult } from "nativescript-plugin-firebase/mlkit/facedetection";
84
import { action } from "tns-core-modules/ui/dialogs";
95
import { ImageAsset } from "tns-core-modules/image-asset";
6+
import { isIOS } from "tns-core-modules/platform";
107
import * as ImagePicker from "nativescript-imagepicker";
118
import * as Camera from "nativescript-camera";
12-
import { RouterExtensions } from "nativescript-angular";
13-
import { isIOS } from "tns-core-modules/platform";
14-
import { MLKitImageLabelingResult } from "nativescript-plugin-firebase/mlkit/imagelabeling";
9+
import { BarcodeFormat, MLKitScanBarcodesOnDeviceResult } from "nativescript-plugin-firebase/mlkit/barcodescanning";
10+
import { MLKitLandmarkRecognitionCloudResult } from "nativescript-plugin-firebase/mlkit/landmarkrecognition";
11+
import { MLKitDetectFacesOnDeviceResult } from "nativescript-plugin-firebase/mlkit/facedetection";
12+
import {
13+
MLKitRecognizeTextCloudResult,
14+
MLKitRecognizeTextOnDeviceResult
15+
} from "nativescript-plugin-firebase/mlkit/textrecognition";
16+
import {
17+
MLKitImageLabelingCloudResult,
18+
MLKitImageLabelingOnDeviceResult
19+
} from "nativescript-plugin-firebase/mlkit/imagelabeling";
1520

1621
const firebase = require("nativescript-plugin-firebase");
1722

@@ -25,15 +30,16 @@ export class MLKitComponent {
2530
pickedImage: ImageSource;
2631

2732
private mlkitFeatures: Array<string> = [
28-
"Text recognition (local)",
33+
"Text recognition (on device)",
2934
"Text recognition (cloud)",
30-
"Barcode scanning",
31-
"Face detection",
32-
"Image labeling",
35+
"Barcode scanning (on device)",
36+
"Face detection (on device)",
37+
"Image labeling (on device)",
38+
"Image labeling (cloud)",
3339
"Landmark recognition (cloud)"
3440
];
3541

36-
private mlkitLocalFeatures: Array<string> = [
42+
private mlkitOnDeviceFeatures: Array<string> = [
3743
"Text recognition",
3844
"Barcode scanning",
3945
"Face detection",
@@ -46,9 +52,9 @@ export class MLKitComponent {
4652

4753
fromCameraFeed(): void {
4854
action(
49-
"Test which ML Kit feature? No cloud processing will be used.",
55+
"Test which on-device ML Kit feature?",
5056
"Cancel",
51-
this.mlkitLocalFeatures
57+
this.mlkitOnDeviceFeatures
5258
).then((pickedItem: string) => {
5359
let to;
5460
if (pickedItem === "Text recognition") {
@@ -83,7 +89,7 @@ export class MLKitComponent {
8389
width: 800,
8490
height: 800,
8591
keepAspectRatio: true,
86-
saveToGallery: true,
92+
saveToGallery: false,
8793
cameraFacing: "rear"
8894
}).then(imageAsset => {
8995
new ImageSource().fromAsset(imageAsset).then(imageSource => {
@@ -147,34 +153,34 @@ export class MLKitComponent {
147153
this.mlkitFeatures
148154
).then((pickedItem: string) => {
149155
let pickedItemIndex = this.mlkitFeatures.indexOf(pickedItem);
150-
if (pickedItem === "Text recognition (local)") {
151-
this.recognizeTextLocal(imageSource);
156+
if (pickedItem === "Text recognition (on device)") {
157+
this.recognizeTextOnDevice(imageSource);
152158
} else if (pickedItem === "Text recognition (cloud)") {
153159
this.recognizeTextCloud(imageSource);
154-
} else if (pickedItem === "Barcode scanning") {
155-
this.scanBarcode(imageSource);
156-
} else if (pickedItem === "Face detection") {
157-
this.detectFaces(imageSource);
158-
} else if (pickedItem === "Image labeling") {
159-
this.labelImage(imageSource);
160+
} else if (pickedItem === "Barcode scanning (on device)") {
161+
this.scanBarcodeOnDevice(imageSource);
162+
} else if (pickedItem === "Face detection (on device)") {
163+
this.detectFacesOnDevice(imageSource);
164+
} else if (pickedItem === "Image labeling (on device)") {
165+
this.labelImageOnDevice(imageSource);
166+
} else if (pickedItem === "Image labeling (cloud)") {
167+
this.labelImageCloud(imageSource);
160168
} else if (pickedItem === "Landmark recognition (cloud)") {
161169
this.recognizeLandmarkCloud(imageSource);
162170
}
163171
});
164172
}
165173

166-
private recognizeTextLocal(imageSource: ImageSource): void {
167-
firebase.mlkit.textrecognition.recognizeTextLocal({
174+
private recognizeTextOnDevice(imageSource: ImageSource): void {
175+
firebase.mlkit.textrecognition.recognizeTextOnDevice({
168176
image: imageSource
169-
}).then(
170-
(result: MLKitRecognizeTextLocalResult) => {
171-
alert({
172-
title: `Result`,
173-
message: result.features.map(feature => feature.text).join(""),
174-
okButtonText: "OK"
175-
});
176-
})
177-
.catch(errorMessage => console.log("ML Kit error: " + errorMessage));
177+
}).then((result: MLKitRecognizeTextOnDeviceResult) => {
178+
alert({
179+
title: `Result`,
180+
message: result.features.map(feature => feature.text).join(""),
181+
okButtonText: "OK"
182+
});
183+
}).catch(errorMessage => console.log("ML Kit error: " + errorMessage));
178184
}
179185

180186
private recognizeTextCloud(imageSource: ImageSource): void {
@@ -207,12 +213,13 @@ export class MLKitComponent {
207213
.catch(errorMessage => console.log("ML Kit error: " + errorMessage));
208214
}
209215

210-
private scanBarcode(imageSource: ImageSource): void {
211-
firebase.mlkit.barcodescanning.scanBarcodes({
216+
private scanBarcodeOnDevice(imageSource: ImageSource): void {
217+
console.log(">>> imageSource.rotationAngle: " + imageSource.rotationAngle);
218+
firebase.mlkit.barcodescanning.scanBarcodesOnDevice({
212219
image: imageSource,
213220
formats: [BarcodeFormat.QR_CODE, BarcodeFormat.EAN_13]
214221
}).then(
215-
(result: MLKitScanBarcodesResult) => {
222+
(result: MLKitScanBarcodesOnDeviceResult) => {
216223
alert({
217224
title: `Result`,
218225
message: JSON.stringify(result.barcodes),
@@ -222,11 +229,11 @@ export class MLKitComponent {
222229
.catch(errorMessage => console.log("ML Kit error: " + errorMessage));
223230
}
224231

225-
private detectFaces(imageSource: ImageSource): void {
226-
firebase.mlkit.facedetection.detectFaces({
232+
private detectFacesOnDevice(imageSource: ImageSource): void {
233+
firebase.mlkit.facedetection.detectFacesOnDevice({
227234
image: imageSource
228235
}).then(
229-
(result: MLKitDetectFacesResult) => {
236+
(result: MLKitDetectFacesOnDeviceResult) => {
230237
alert({
231238
title: `Result`,
232239
message: JSON.stringify(result.faces),
@@ -236,12 +243,27 @@ export class MLKitComponent {
236243
.catch(errorMessage => console.log("ML Kit error: " + errorMessage));
237244
}
238245

239-
private labelImage(imageSource: ImageSource): void {
240-
firebase.mlkit.imagelabeling.labelImage({
246+
private labelImageOnDevice(imageSource: ImageSource): void {
247+
firebase.mlkit.imagelabeling.labelImageOnDevice({
248+
image: imageSource,
249+
confidenceThreshold: 0.3
250+
}).then(
251+
(result: MLKitImageLabelingOnDeviceResult) => {
252+
alert({
253+
title: `Result`,
254+
message: JSON.stringify(result.labels),
255+
okButtonText: "OK"
256+
});
257+
})
258+
.catch(errorMessage => console.log("ML Kit error: " + errorMessage));
259+
}
260+
261+
private labelImageCloud(imageSource: ImageSource): void {
262+
firebase.mlkit.imagelabeling.labelImageCloud({
241263
image: imageSource,
242264
confidenceThreshold: 0.3
243265
}).then(
244-
(result: MLKitImageLabelingResult) => {
266+
(result: MLKitImageLabelingCloudResult) => {
245267
alert({
246268
title: `Result`,
247269
message: JSON.stringify(result.labels),

demo-ng/app/tabs/mlkit/textrecognition/textrecognition.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<MLKitTextRecognition
88
row="0"
9-
width="300"
9+
width="260"
1010
height="340"
1111
(scanResult)="onTextRecognitionResult($event)">
1212
</MLKitTextRecognition>

0 commit comments

Comments
 (0)