mediversal-rn-image-intelligence 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +328 -36
- package/android/build.gradle +3 -0
- package/android/src/main/java/com/mediversalrnimagintelligence/ImageIntelligencePackage.kt +2 -1
- package/android/src/main/java/com/mediversalrnimagintelligence/ObjectDetectionModule.kt +120 -0
- package/ios/ObjectDetectionModule.m +14 -0
- package/ios/ObjectDetectionModule.swift +129 -0
- package/lib/commonjs/NativeObjectDetectionModule.js +12 -0
- package/lib/commonjs/NativeObjectDetectionModule.js.map +1 -0
- package/lib/commonjs/index.js +24 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/NativeObjectDetectionModule.js +8 -0
- package/lib/module/NativeObjectDetectionModule.js.map +1 -0
- package/lib/module/index.js +24 -2
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/NativeObjectDetectionModule.d.ts +11 -0
- package/lib/typescript/NativeObjectDetectionModule.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +37 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/mediversal-rn-image-intelligence.podspec +2 -0
- package/package.json +1 -1
- package/src/NativeObjectDetectionModule.ts +14 -0
- package/src/index.tsx +35 -1
- package/src/types.ts +40 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
package com.mediversalrnimagintelligence
|
|
2
|
+
|
|
3
|
+
import android.net.Uri
|
|
4
|
+
import com.facebook.react.bridge.Arguments
|
|
5
|
+
import com.facebook.react.bridge.Promise
|
|
6
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
8
|
+
import com.facebook.react.bridge.ReactMethod
|
|
9
|
+
import com.facebook.react.bridge.WritableArray
|
|
10
|
+
import com.facebook.react.bridge.WritableMap
|
|
11
|
+
import com.google.mlkit.vision.common.InputImage
|
|
12
|
+
import com.google.mlkit.vision.objects.DetectedObject
|
|
13
|
+
import com.google.mlkit.vision.objects.ObjectDetection
|
|
14
|
+
import com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
|
|
15
|
+
import java.io.IOException
|
|
16
|
+
|
|
17
|
+
class ObjectDetectionModule(reactContext: ReactApplicationContext) :
|
|
18
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
19
|
+
|
|
20
|
+
override fun getName(): String {
|
|
21
|
+
return "ObjectDetectionModule"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@ReactMethod
|
|
25
|
+
fun detectObjects(imageUri: String, promise: Promise) {
|
|
26
|
+
try {
|
|
27
|
+
val image = parseImageFromUri(imageUri)
|
|
28
|
+
|
|
29
|
+
val options = ObjectDetectorOptions.Builder()
|
|
30
|
+
.setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
|
|
31
|
+
.enableMultipleObjects()
|
|
32
|
+
.enableClassification()
|
|
33
|
+
.build()
|
|
34
|
+
|
|
35
|
+
val detector = ObjectDetection.getClient(options)
|
|
36
|
+
|
|
37
|
+
detector.process(image)
|
|
38
|
+
.addOnSuccessListener { objects ->
|
|
39
|
+
val result = Arguments.createMap()
|
|
40
|
+
val objectsArray = Arguments.createArray()
|
|
41
|
+
|
|
42
|
+
for (obj in objects) {
|
|
43
|
+
objectsArray.pushMap(convertObjectToMap(obj))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
result.putArray("objects", objectsArray)
|
|
47
|
+
promise.resolve(result)
|
|
48
|
+
}
|
|
49
|
+
.addOnFailureListener { e ->
|
|
50
|
+
val result = Arguments.createMap()
|
|
51
|
+
result.putArray("objects", Arguments.createArray())
|
|
52
|
+
result.putString("error", e.message ?: "Object detection failed")
|
|
53
|
+
promise.resolve(result)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
} catch (e: Exception) {
|
|
57
|
+
val result = Arguments.createMap()
|
|
58
|
+
result.putArray("objects", Arguments.createArray())
|
|
59
|
+
result.putString("error", e.message ?: "Failed to process image")
|
|
60
|
+
promise.resolve(result)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private fun parseImageFromUri(uriString: String): InputImage {
|
|
65
|
+
val context = reactApplicationContext
|
|
66
|
+
|
|
67
|
+
return try {
|
|
68
|
+
when {
|
|
69
|
+
uriString.startsWith("file://") -> {
|
|
70
|
+
val uri = Uri.parse(uriString)
|
|
71
|
+
InputImage.fromFilePath(context, uri)
|
|
72
|
+
}
|
|
73
|
+
uriString.startsWith("content://") -> {
|
|
74
|
+
val uri = Uri.parse(uriString)
|
|
75
|
+
InputImage.fromFilePath(context, uri)
|
|
76
|
+
}
|
|
77
|
+
uriString.startsWith("/") -> {
|
|
78
|
+
val uri = Uri.parse("file://$uriString")
|
|
79
|
+
InputImage.fromFilePath(context, uri)
|
|
80
|
+
}
|
|
81
|
+
else -> {
|
|
82
|
+
throw IOException("Unsupported URI format: $uriString")
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (e: IOException) {
|
|
86
|
+
throw IOException("Failed to load image from URI: ${e.message}")
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private fun convertObjectToMap(obj: DetectedObject): WritableMap {
|
|
91
|
+
val objectMap = Arguments.createMap()
|
|
92
|
+
|
|
93
|
+
// Bounding box
|
|
94
|
+
val boundingBox = Arguments.createMap()
|
|
95
|
+
val bounds = obj.boundingBox
|
|
96
|
+
boundingBox.putInt("x", bounds.left)
|
|
97
|
+
boundingBox.putInt("y", bounds.top)
|
|
98
|
+
boundingBox.putInt("width", bounds.width())
|
|
99
|
+
boundingBox.putInt("height", bounds.height())
|
|
100
|
+
objectMap.putMap("boundingBox", boundingBox)
|
|
101
|
+
|
|
102
|
+
// Tracking ID
|
|
103
|
+
if (obj.trackingId != null) {
|
|
104
|
+
objectMap.putInt("trackingId", obj.trackingId!!)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Labels
|
|
108
|
+
val labelsArray = Arguments.createArray()
|
|
109
|
+
for (label in obj.labels) {
|
|
110
|
+
val labelMap = Arguments.createMap()
|
|
111
|
+
labelMap.putString("text", label.text)
|
|
112
|
+
labelMap.putDouble("confidence", label.confidence.toDouble())
|
|
113
|
+
labelMap.putInt("index", label.index)
|
|
114
|
+
labelsArray.pushMap(labelMap)
|
|
115
|
+
}
|
|
116
|
+
objectMap.putArray("labels", labelsArray)
|
|
117
|
+
|
|
118
|
+
return objectMap
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
|
|
3
|
+
@interface RCT_EXTERN_MODULE(ObjectDetectionModule, NSObject)
|
|
4
|
+
|
|
5
|
+
RCT_EXTERN_METHOD(detectObjects:(NSString *)imageUri
|
|
6
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
7
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
8
|
+
|
|
9
|
+
+ (BOOL)requiresMainQueueSetup
|
|
10
|
+
{
|
|
11
|
+
return NO;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import MLKitObjectDetection
|
|
3
|
+
import MLKitVision
|
|
4
|
+
|
|
5
|
+
@objc(ObjectDetectionModule)
|
|
6
|
+
class ObjectDetectionModule: NSObject {
|
|
7
|
+
|
|
8
|
+
@objc
|
|
9
|
+
func detectObjects(
|
|
10
|
+
_ imageUri: String,
|
|
11
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
12
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
13
|
+
) {
|
|
14
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
15
|
+
do {
|
|
16
|
+
guard let image = self.parseImageFromUri(imageUri) else {
|
|
17
|
+
let result: [String: Any] = [
|
|
18
|
+
"objects": [],
|
|
19
|
+
"error": "Failed to load image from URI"
|
|
20
|
+
]
|
|
21
|
+
DispatchQueue.main.async {
|
|
22
|
+
resolve(result)
|
|
23
|
+
}
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let visionImage = VisionImage(image: image)
|
|
28
|
+
visionImage.orientation = image.imageOrientation
|
|
29
|
+
|
|
30
|
+
let options = ObjectDetectorOptions()
|
|
31
|
+
options.detectorMode = .singleImage
|
|
32
|
+
options.shouldEnableMultipleObjects = true
|
|
33
|
+
options.shouldEnableClassification = true
|
|
34
|
+
|
|
35
|
+
let detector = ObjectDetector.objectDetector(options: options)
|
|
36
|
+
|
|
37
|
+
detector.process(visionImage) { objects, error in
|
|
38
|
+
if let error = error {
|
|
39
|
+
let result: [String: Any] = [
|
|
40
|
+
"objects": [],
|
|
41
|
+
"error": error.localizedDescription
|
|
42
|
+
]
|
|
43
|
+
DispatchQueue.main.async {
|
|
44
|
+
resolve(result)
|
|
45
|
+
}
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
guard let objects = objects, !objects.isEmpty else {
|
|
50
|
+
let result: [String: Any] = ["objects": []]
|
|
51
|
+
DispatchQueue.main.async {
|
|
52
|
+
resolve(result)
|
|
53
|
+
}
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let objectsArray = objects.map { self.convertObjectToDict($0) }
|
|
58
|
+
let result: [String: Any] = ["objects": objectsArray]
|
|
59
|
+
|
|
60
|
+
DispatchQueue.main.async {
|
|
61
|
+
resolve(result)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
} catch {
|
|
66
|
+
let result: [String: Any] = [
|
|
67
|
+
"objects": [],
|
|
68
|
+
"error": error.localizedDescription
|
|
69
|
+
]
|
|
70
|
+
DispatchQueue.main.async {
|
|
71
|
+
resolve(result)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private func parseImageFromUri(_ uriString: String) -> UIImage? {
|
|
78
|
+
var path = uriString
|
|
79
|
+
|
|
80
|
+
if path.hasPrefix("file://") {
|
|
81
|
+
path = String(path.dropFirst(7))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if path.hasPrefix("ph://") || path.hasPrefix("assets-library://") {
|
|
85
|
+
return nil
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if FileManager.default.fileExists(atPath: path) {
|
|
89
|
+
return UIImage(contentsOfFile: path)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return nil
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private func convertObjectToDict(_ obj: Object) -> [String: Any] {
|
|
96
|
+
var objectDict: [String: Any] = [:]
|
|
97
|
+
|
|
98
|
+
let frame = obj.frame
|
|
99
|
+
let boundingBox: [String: Any] = [
|
|
100
|
+
"x": Int(frame.origin.x),
|
|
101
|
+
"y": Int(frame.origin.y),
|
|
102
|
+
"width": Int(frame.size.width),
|
|
103
|
+
"height": Int(frame.size.height)
|
|
104
|
+
]
|
|
105
|
+
objectDict["boundingBox"] = boundingBox
|
|
106
|
+
|
|
107
|
+
if obj.trackingID != nil {
|
|
108
|
+
objectDict["trackingId"] = obj.trackingID!.intValue
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
var labelsArray: [[String: Any]] = []
|
|
112
|
+
for label in obj.labels {
|
|
113
|
+
let labelDict: [String: Any] = [
|
|
114
|
+
"text": label.text,
|
|
115
|
+
"confidence": label.confidence,
|
|
116
|
+
"index": label.index
|
|
117
|
+
]
|
|
118
|
+
labelsArray.append(labelDict)
|
|
119
|
+
}
|
|
120
|
+
objectDict["labels"] = labelsArray
|
|
121
|
+
|
|
122
|
+
return objectDict
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@objc
|
|
126
|
+
static func requiresMainQueueSetup() -> Bool {
|
|
127
|
+
return false
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
/**
|
|
9
|
+
* Object Detection TurboModule Specification
|
|
10
|
+
*/
|
|
11
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.getEnforcing('ObjectDetectionModule');
|
|
12
|
+
//# sourceMappingURL=NativeObjectDetectionModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeObjectDetectionModule.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AACA;AAFA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAOeC,gCAAmB,CAACC,YAAY,CAC7C,uBACF,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -9,6 +9,7 @@ exports.isAvailable = isAvailable;
|
|
|
9
9
|
var _reactNative = require("react-native");
|
|
10
10
|
var _NativeFaceDetectionModule = _interopRequireDefault(require("./NativeFaceDetectionModule"));
|
|
11
11
|
var _NativeTextRecognitionModule = _interopRequireDefault(require("./NativeTextRecognitionModule"));
|
|
12
|
+
var _NativeObjectDetectionModule = _interopRequireDefault(require("./NativeObjectDetectionModule"));
|
|
12
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
// Export types for consumers
|
|
14
15
|
|
|
@@ -18,6 +19,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
18
19
|
const DEFAULT_OPTIONS = {
|
|
19
20
|
detectFaces: true,
|
|
20
21
|
detectPrintedText: true,
|
|
22
|
+
detectObjects: true,
|
|
21
23
|
faceDetectionMode: 'fast',
|
|
22
24
|
minFaceSize: 0.1
|
|
23
25
|
};
|
|
@@ -95,7 +97,8 @@ async function analyzeImage(imageUri, options = {}) {
|
|
|
95
97
|
// Initialize result
|
|
96
98
|
const result = {
|
|
97
99
|
containsFace: false,
|
|
98
|
-
containsPrintedText: false
|
|
100
|
+
containsPrintedText: false,
|
|
101
|
+
containsObjects: false
|
|
99
102
|
};
|
|
100
103
|
|
|
101
104
|
// Create promises array for parallel execution
|
|
@@ -139,6 +142,25 @@ async function analyzeImage(imageUri, options = {}) {
|
|
|
139
142
|
})());
|
|
140
143
|
}
|
|
141
144
|
|
|
145
|
+
// Object Detection
|
|
146
|
+
if (opts.detectObjects) {
|
|
147
|
+
promises.push((async () => {
|
|
148
|
+
try {
|
|
149
|
+
const objectResult = await _NativeObjectDetectionModule.default.detectObjects(validatedUri);
|
|
150
|
+
if (objectResult.error) {
|
|
151
|
+
result.errors = result.errors || {};
|
|
152
|
+
result.errors.objectDetection = objectResult.error;
|
|
153
|
+
} else if (objectResult.objects && objectResult.objects.length > 0) {
|
|
154
|
+
result.containsObjects = true;
|
|
155
|
+
result.objects = objectResult.objects;
|
|
156
|
+
}
|
|
157
|
+
} catch (error) {
|
|
158
|
+
result.errors = result.errors || {};
|
|
159
|
+
result.errors.objectDetection = error instanceof Error ? error.message : 'Unknown error';
|
|
160
|
+
}
|
|
161
|
+
})());
|
|
162
|
+
}
|
|
163
|
+
|
|
142
164
|
// Wait for all analyses to complete
|
|
143
165
|
await Promise.all(promises);
|
|
144
166
|
|
|
@@ -157,7 +179,7 @@ async function analyzeImage(imageUri, options = {}) {
|
|
|
157
179
|
*/
|
|
158
180
|
async function isAvailable() {
|
|
159
181
|
try {
|
|
160
|
-
return !!(_NativeFaceDetectionModule.default && _NativeTextRecognitionModule.default);
|
|
182
|
+
return !!(_NativeFaceDetectionModule.default && _NativeTextRecognitionModule.default && _NativeObjectDetectionModule.default);
|
|
161
183
|
} catch {
|
|
162
184
|
return false;
|
|
163
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_NativeFaceDetectionModule","_interopRequireDefault","_NativeTextRecognitionModule","e","__esModule","default","DEFAULT_OPTIONS","detectFaces","detectPrintedText","faceDetectionMode","minFaceSize","validateImageUri","imageUri","Error","trimmedUri","trim","length","Platform","OS","startsWith","analyzeImage","options","validatedUri","opts","result","containsFace","containsPrintedText","promises","push","faceResult","FaceDetectionModule","error","errors","faceDetection","faces","message","textResult","TextRecognitionModule","recognizeText","textRecognition","text","printedText","Promise","all","enabledCount","errorCount","Object","keys","JSON","stringify","isAvailable","_default","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAD,sBAAA,CAAAF,OAAA;AAAkE,SAAAE,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_NativeFaceDetectionModule","_interopRequireDefault","_NativeTextRecognitionModule","_NativeObjectDetectionModule","e","__esModule","default","DEFAULT_OPTIONS","detectFaces","detectPrintedText","detectObjects","faceDetectionMode","minFaceSize","validateImageUri","imageUri","Error","trimmedUri","trim","length","Platform","OS","startsWith","analyzeImage","options","validatedUri","opts","result","containsFace","containsPrintedText","containsObjects","promises","push","faceResult","FaceDetectionModule","error","errors","faceDetection","faces","message","textResult","TextRecognitionModule","recognizeText","textRecognition","text","printedText","objectResult","ObjectDetectionModule","objectDetection","objects","Promise","all","enabledCount","errorCount","Object","keys","JSON","stringify","isAvailable","_default","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeObjectDetectionModule.ts"],"mappings":"AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAGlD;AACA;AACA;;AAKA,eAAeA,mBAAmB,CAACC,YAAY,CAC7C,uBACF,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Platform } from 'react-native';
|
|
2
2
|
import FaceDetectionModule from './NativeFaceDetectionModule';
|
|
3
3
|
import TextRecognitionModule from './NativeTextRecognitionModule';
|
|
4
|
+
import ObjectDetectionModule from './NativeObjectDetectionModule';
|
|
4
5
|
|
|
5
6
|
// Export types for consumers
|
|
6
7
|
|
|
@@ -10,6 +11,7 @@ import TextRecognitionModule from './NativeTextRecognitionModule';
|
|
|
10
11
|
const DEFAULT_OPTIONS = {
|
|
11
12
|
detectFaces: true,
|
|
12
13
|
detectPrintedText: true,
|
|
14
|
+
detectObjects: true,
|
|
13
15
|
faceDetectionMode: 'fast',
|
|
14
16
|
minFaceSize: 0.1
|
|
15
17
|
};
|
|
@@ -87,7 +89,8 @@ export async function analyzeImage(imageUri, options = {}) {
|
|
|
87
89
|
// Initialize result
|
|
88
90
|
const result = {
|
|
89
91
|
containsFace: false,
|
|
90
|
-
containsPrintedText: false
|
|
92
|
+
containsPrintedText: false,
|
|
93
|
+
containsObjects: false
|
|
91
94
|
};
|
|
92
95
|
|
|
93
96
|
// Create promises array for parallel execution
|
|
@@ -131,6 +134,25 @@ export async function analyzeImage(imageUri, options = {}) {
|
|
|
131
134
|
})());
|
|
132
135
|
}
|
|
133
136
|
|
|
137
|
+
// Object Detection
|
|
138
|
+
if (opts.detectObjects) {
|
|
139
|
+
promises.push((async () => {
|
|
140
|
+
try {
|
|
141
|
+
const objectResult = await ObjectDetectionModule.detectObjects(validatedUri);
|
|
142
|
+
if (objectResult.error) {
|
|
143
|
+
result.errors = result.errors || {};
|
|
144
|
+
result.errors.objectDetection = objectResult.error;
|
|
145
|
+
} else if (objectResult.objects && objectResult.objects.length > 0) {
|
|
146
|
+
result.containsObjects = true;
|
|
147
|
+
result.objects = objectResult.objects;
|
|
148
|
+
}
|
|
149
|
+
} catch (error) {
|
|
150
|
+
result.errors = result.errors || {};
|
|
151
|
+
result.errors.objectDetection = error instanceof Error ? error.message : 'Unknown error';
|
|
152
|
+
}
|
|
153
|
+
})());
|
|
154
|
+
}
|
|
155
|
+
|
|
134
156
|
// Wait for all analyses to complete
|
|
135
157
|
await Promise.all(promises);
|
|
136
158
|
|
|
@@ -149,7 +171,7 @@ export async function analyzeImage(imageUri, options = {}) {
|
|
|
149
171
|
*/
|
|
150
172
|
export async function isAvailable() {
|
|
151
173
|
try {
|
|
152
|
-
return !!(FaceDetectionModule && TextRecognitionModule);
|
|
174
|
+
return !!(FaceDetectionModule && TextRecognitionModule && ObjectDetectionModule);
|
|
153
175
|
} catch {
|
|
154
176
|
return false;
|
|
155
177
|
}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","FaceDetectionModule","TextRecognitionModule","DEFAULT_OPTIONS","detectFaces","detectPrintedText","faceDetectionMode","minFaceSize","validateImageUri","imageUri","Error","trimmedUri","trim","length","OS","startsWith","analyzeImage","options","validatedUri","opts","result","containsFace","containsPrintedText","promises","push","faceResult","error","errors","faceDetection","faces","message","textResult","recognizeText","textRecognition","text","printedText","Promise","all","enabledCount","errorCount","Object","keys","JSON","stringify","isAvailable"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,mBAAmB,MAAM,6BAA6B;AAC7D,OAAOC,qBAAqB,MAAM,+BAA+B;;
|
|
1
|
+
{"version":3,"names":["Platform","FaceDetectionModule","TextRecognitionModule","ObjectDetectionModule","DEFAULT_OPTIONS","detectFaces","detectPrintedText","detectObjects","faceDetectionMode","minFaceSize","validateImageUri","imageUri","Error","trimmedUri","trim","length","OS","startsWith","analyzeImage","options","validatedUri","opts","result","containsFace","containsPrintedText","containsObjects","promises","push","faceResult","error","errors","faceDetection","faces","message","textResult","recognizeText","textRecognition","text","printedText","objectResult","objectDetection","objects","Promise","all","enabledCount","errorCount","Object","keys","JSON","stringify","isAvailable"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import type { NativeObjectDetectionResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Object Detection TurboModule Specification
|
|
5
|
+
*/
|
|
6
|
+
export interface Spec extends TurboModule {
|
|
7
|
+
detectObjects(imageUri: string): Promise<NativeObjectDetectionResult>;
|
|
8
|
+
}
|
|
9
|
+
declare const _default: Spec;
|
|
10
|
+
export default _default;
|
|
11
|
+
//# sourceMappingURL=NativeObjectDetectionModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeObjectDetectionModule.d.ts","sourceRoot":"","sources":["../../src/NativeObjectDetectionModule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACvE;;AAED,wBAEU"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AnalysisResult, AnalysisOptions } from './types';
|
|
2
|
-
export type { AnalysisResult, AnalysisOptions, FaceData, BoundingBox, } from './types';
|
|
2
|
+
export type { AnalysisResult, AnalysisOptions, FaceData, BoundingBox, ObjectData, ObjectLabel, } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Analyzes an image using Google ML Kit on-device APIs
|
|
5
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI/D,YAAY,EACV,cAAc,EACd,eAAe,EACf,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC;AA2DjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA+GzB;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAUpD;;;;;AAGD,wBAGE"}
|
|
@@ -36,12 +36,17 @@ export interface AnalysisResult {
|
|
|
36
36
|
containsPrintedText: boolean;
|
|
37
37
|
/** Array of detected faces with metadata */
|
|
38
38
|
faces?: FaceData[];
|
|
39
|
+
/** True if object was detected */
|
|
40
|
+
containsObjects: boolean;
|
|
41
|
+
/** Array of detected objects with labels */
|
|
42
|
+
objects?: ObjectData[];
|
|
39
43
|
/** Extracted printed text content */
|
|
40
44
|
printedText?: string;
|
|
41
45
|
/** Error messages if any module failed (won't throw, for graceful degradation) */
|
|
42
46
|
errors?: {
|
|
43
47
|
faceDetection?: string;
|
|
44
48
|
textRecognition?: string;
|
|
49
|
+
objectDetection?: string;
|
|
45
50
|
};
|
|
46
51
|
}
|
|
47
52
|
/**
|
|
@@ -54,6 +59,8 @@ export interface AnalysisOptions {
|
|
|
54
59
|
detectPrintedText?: boolean;
|
|
55
60
|
/** Face detection performance mode: 'fast' or 'accurate' (default: 'fast') */
|
|
56
61
|
faceDetectionMode?: 'fast' | 'accurate';
|
|
62
|
+
/** Enable object detection (default: false) */
|
|
63
|
+
detectObjects?: boolean;
|
|
57
64
|
/** Minimum face size relative to image (0.0 to 1.0, default: 0.1) */
|
|
58
65
|
minFaceSize?: number;
|
|
59
66
|
}
|
|
@@ -77,4 +84,34 @@ export interface NativeTextRecognitionResult {
|
|
|
77
84
|
* Internal handwriting recognition result from native module
|
|
78
85
|
* @internal
|
|
79
86
|
*/
|
|
87
|
+
/**
|
|
88
|
+
* Detected object information
|
|
89
|
+
*/
|
|
90
|
+
export interface ObjectData {
|
|
91
|
+
/** Bounding box of the detected object */
|
|
92
|
+
boundingBox: BoundingBox;
|
|
93
|
+
/** Tracking ID for video sequences */
|
|
94
|
+
trackingId?: number;
|
|
95
|
+
/** Object labels with confidence scores */
|
|
96
|
+
labels: ObjectLabel[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Object label with confidence
|
|
100
|
+
*/
|
|
101
|
+
export interface ObjectLabel {
|
|
102
|
+
/** Label text (e.g., "Dog", "Car", "Person") */
|
|
103
|
+
text: string;
|
|
104
|
+
/** Confidence score (0.0 to 1.0) */
|
|
105
|
+
confidence: number;
|
|
106
|
+
/** Label index */
|
|
107
|
+
index: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Internal object detection result from native module
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
export interface NativeObjectDetectionResult {
|
|
114
|
+
objects: ObjectData[];
|
|
115
|
+
error?: string;
|
|
116
|
+
}
|
|
80
117
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0DAA0D;IAC1D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACxC,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0DAA0D;IAC1D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,kCAAkC;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACxC,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mediversal-rn-image-intelligence",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "Production-ready React Native library for intelligent image analysis using Google ML Kit (on-device)",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
import type { NativeObjectDetectionResult } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Object Detection TurboModule Specification
|
|
7
|
+
*/
|
|
8
|
+
export interface Spec extends TurboModule {
|
|
9
|
+
detectObjects(imageUri: string): Promise<NativeObjectDetectionResult>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default TurboModuleRegistry.getEnforcing<Spec>(
|
|
13
|
+
'ObjectDetectionModule'
|
|
14
|
+
) as Spec;
|