我正在考虑在我的 Android 应用程序中实现 MLKit 人脸识别库。我唯一不明白的是,如果可能的话,我如何比较两张照片并检测它们是否是同一个人。我已阅读这些指南:
谢谢
我正在为自己制作一个应用程序来扫描收据,并将数据放入数据库中。我尝试使用机器学习套件文本识别,效果非常好。但是,我在从识别的文本中提取数据时遇到问题。我将用一个例子来解释:
这是收据的格式,这就是我想要获取数据的方式:
+--------+--------+-------+-------+
| Amount | Name | Price | Total |
+--------+--------+-------+-------+
| 1 | Cheese | | 1,15 |
| 1 | Eggs | | 2,59 |
| 2 | Milk | 0,99 | 1,98 |
| 1 | Butter | | 0,80 |
+--------+--------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
然而,当运行文本识别时,它会以非常奇怪的方式格式化数据。例如,上面的收据将给出这些块:
Amount
Price
Name Cheese Eggs Milk 0,99
Butter
Total 1,15 2,59
1,98 0,80
Run Code Online (Sandbox Code Playgroud)
它似乎跳过了金额列中的单个数字,但我可以解决这个问题。但是,我不知道如何将上述数据解析为我想要的数据,尤其是将价格与名称连接起来。有没有办法改变块,以便只需要收据的行或列,而不是这种随机性?
编辑:当使用线条或元素而不是块时,我得到以下结果:
Amount
Price
Name
Cheese
Eggs
Milk
0,99
Butter
Total
1,15
2,59
1,98
0,80
Run Code Online (Sandbox Code Playgroud)
但是我仍然遇到同样的问题:如何将商品与正确的价格配对?
我有一种情况,我必须在不使用 Firebase ML-Kit Vision API.help 拍照的情况下即时检测来自相机的条形码。
我需要从我的应用程序实现一个二维码生成器。firebase ML kit会提供这样的功能来从字符串生成QR码吗?或者我需要使用一些替代库,例如 zXing?
我最近更改了我的旧条码/二维码扫描库,转而使用Google ML Kit 进行条码扫描,自从我这样做后,我通过 crashlytics 收到了一些我以前没有的新崩溃报告。
致命异常:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.my.app-Q4EYyt2jmFlLaZ-mHL-J5A==/base.apk"],nativeLibraryDirectories=[/ data/app/com.my.app-Q4EYyt2jmFlLaZ-mHL-J5A==/lib/arm64, /system/lib64, /vendor/lib64, /product/lib64]]] 在 java 中找不到“libbarhopper_v2.so” .lang.Runtime.loadLibrary0(Runtime.java:1011) 在 java.lang.System.loadLibrary(System.java:1660) 在 com.google.android.libraries.barhopper.BarhopperV2.(BarhopperV2.java:5) 在 com .google.mlkit.vision.barcode.zza.a_(zza.java:7) 在 com.google.mlkit.vision.barcode.internal.zzf.b(zzf.java:17) 在 com.google.mlkit.common .sdkinternal.ModelResource.zza(ModelResource.java:1) 在 com.google.mlkit.common.sdkinternal.zzl.run(zzl.java:1) 在 com.google.mlkit.common.sdkinternal.zzp.run(zzp .java:3) 在 com.google。mlkit.common.sdkinternal.MlKitThreadPool.zzd(MlKitThreadPool.java:19) at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zza(MlKitThreadPool.java:1) at com.google.mlkit.common.sdkinternal.zzh。在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 在 java.lang.Thread 运行(zzh.java:1) .run(Thread.java:784)
致命异常:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.my.app-Y8cCSVtTMYVdnQQovlR0cw==/base.apk"],nativeLibraryDirectories=[/data/app/ com.my.app-Y8cCSVtTMYVdnQQovlR0cw==/lib/arm, /system/lib, /vendor/lib]]] 在 java.lang.Runtime.loadLibrary0(Runtime.java:1067) 中找不到“libbarhopper_v2.so”在 java.lang.Runtime.loadLibrary0(Runtime.java:1007) 在 java.lang.System.loadLibrary(System.java:1667) 在 com.google.android.libraries.barhopper.BarhopperV2.(BarhopperV2.java:5)在 com.google.mlkit.vision.barcode.zza.a_(zza.java:7) 在 com.google.mlkit.vision.barcode.internal.zzf.b(zzf.java:17) 在 com.google.mlkit .common.sdkinternal.ModelResource.zza(ModelResource.java:1) 在 com.google.mlkit.common.sdkinternal.zzl.run(zzl.java:1) 在 com.google.mlkit.common.sdkinternal.zzp。运行(zzp.java:3) 在com.google.mlkit.common.sdkinternal.MlKitThreadPool.zzd(MlKitThreadPool.java:19) 在com.google.mlkit.common.sdkinternal.MlKitThreadPool.zza(MlKitThreadPool.java:1)在 com.google.mlkit.common.sdkinternal.zzh.run(zzh.java:1) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run …
我正在使用 Google MLKit 进行条形码扫描仪。当我使用时imageProxy.image,IDE显示警告;
” This declaration is opt-in and its usage should be marked with '@androidx.camera.core.ExperimentalGetImage' or '@OptIn(markerClass = androidx.camera.core.ExperimentalGetImage.class)'“
并且它强制使用@SuppressLint("UnsafeOptInUsageError")注释。我不知道它是什么,也找不到任何相关资源(甚至是官方资源)。那么为什么要使用这个注解呢?
我正在尝试将 Google MLKit Translate 添加到我的 SwiftUI 项目中。我已经通过 SPM 使用 firebase,并且仅在首次启动后才出现此错误:-[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x600001afa700
这是我的代码:
应用程序委托
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
FirebaseApp.configure()
...
let spanishRemoteTranslator = TranslateRemoteModel.translateRemoteModel(language: .spanish)
if ModelManager.modelManager().isModelDownloaded(spanishRemoteTranslator) {
print("Spanish Translator Downloaded")
}else {
print("Downloading Spanish Translator")
ModelManager.modelManager().download(spanishRemoteTranslator, conditions: ModelDownloadConditions(allowsCellularAccess: true, allowsBackgroundDownloading: true))
}
return true
}
Run Code Online (Sandbox Code Playgroud)
然后我这样称呼它:
if ModelManager.modelManager().isModelDownloaded(spanishModel) {
Translator.translator(options: englishSpanishTranslator).translate(buis.name!) { translatedText, error in
if error == nil {
if let translatedText = translatedText …Run Code Online (Sandbox Code Playgroud) 我尝试使用 Jetpack Compose 和 Google ML Kit 编写条形码扫描仪代码。我将 ImageAnalysis 与 STRATEGY_KEEP_ONLY_LATEST 一起使用,并调用 BarCodeAnalyzer 类来初始化和创建条形码扫描仪。
但是当我扫描条形码时,我的代码检测到两次相同的条形码并打开两个屏幕。
那么如何暂停扫描呢?或者当我发现条形码时停止图像分析?
Android视图
AndroidView(
factory = { context ->
val previewView = PreviewView(context)
val preview = Preview.Builder().build()
val selector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
preview.setSurfaceProvider(previewView.surfaceProvider)
val imageAnalysis = ImageAnalysis.Builder()
.setTargetResolution(
Size(
previewView.width,
previewView.height
)
)
.setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(
ContextCompat.getMainExecutor(context),
BarCodeAnalyzer { result ->
code = result
navController.navigate(
Screen.FormProduct.route + "?barcode=$code"
)
}
)
try {
cameraProviderFuture.get().bindToLifecycle(
lifecycleOwner,
selector,
preview,
imageAnalysis
)
} catch (e: Exception) {
e.printStackTrace() …Run Code Online (Sandbox Code Playgroud) 是否可以将处理后的图像保存为文件?
这就是我想要做的,我们的应用程序有 KYC(了解你的客户),并且我们实现了面部检测以使用户做几个姿势。我想要的是将它们保存为图像文件并将其上传到数据库
示例场景:应用程序要求用户微笑 > 用户微笑 > 保存图像。
这是我现在所拥有的:
应用程序检查用户是否微笑的位置
if (faces.isNotEmpty) {
if (inputImage.inputImageData?.size != null &&
inputImage.inputImageData?.imageRotation != null) {
if (faces[0].smilingProbability! > 0.85) {
await _getImg();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我调用一个函数来停止图像流,然后拍照(这可以工作,但在某些物理设备上它会崩溃),但如果我不停止图像流,然后立即调用 takePicture() ,它就会一直崩溃。
_getImg() async {
setState(() {
globalBusy = true;
});
await _controller.stopImageStream();
var img = await _controller.takePicture();
VerificationVarHandler.livelinesImgsPaths.add(img.path);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,至少对我来说这不是最好的方法,所以也许我可以使用 _processCameraImage() 中的 inputImage 因为它有一个字节?那么我可以将这些字节传递给解码器并在触发函数时将其保存在本地吗?
或者也许有更好的更优雅的方法来实现这一目标?
也许自2023 年 3 月 21 日更新以来它现在可以工作,也许不行。如果您想使用它,可以在文档中阅读有关它的更多信息。
再次注意,我们还没有测试它现在是否有效。我们必须迅速决定如何让条形码扫描再次工作。因此,我们重构了自定义条码扫描电容插件来com.google.mlkit:barcode-scanning:17.1.0代替使用。有关它的更多信息请参见此处。这需要更多的努力,因为你必须自己实现 UI,并且花哨的扫描动画消失了,但它确实有效,而且似乎更快。
我们com.google.android.gms:play-services-code-scanner:16.0.0-beta3与自定义 Capacitor 插件结合使用来扫描 EAN-13 和 EAN-8 等条形码,但在某些设备上,每当用户尝试打开 Google 的条形码扫描仪 UI 时,该活动似乎都会崩溃。
这是logcat 的错误日志:
win=Window{f8c052d u0 com.[redacted]/com.google.mlkit.vision.codescanner.internal.GmsBarcodeScanningDelegateActivity} destroySurfaces: appStopped=true cleanupOnResume=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=4 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6529 com.android.server.wm.ActivityRecord.destroySurfaces:6510 com.android.server.wm.ActivityRecord.notifyAppStopped:6574 com.android.server.wm.ActivityRecord.activityStopped:7162 com.android.server.wm.ActivityClientController.activityStopped:258 android.app.IActivityClientController$Stub.onTransact:613 com.android.server.wm.ActivityClientController.onTransact:136
Run Code Online (Sandbox Code Playgroud)
处理扫描 UI 的代码:
win=Window{f8c052d u0 com.[redacted]/com.google.mlkit.vision.codescanner.internal.GmsBarcodeScanningDelegateActivity} destroySurfaces: appStopped=true cleanupOnResume=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=4 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6529 com.android.server.wm.ActivityRecord.destroySurfaces:6510 com.android.server.wm.ActivityRecord.notifyAppStopped:6574 com.android.server.wm.ActivityRecord.activityStopped:7162 com.android.server.wm.ActivityClientController.activityStopped:258 android.app.IActivityClientController$Stub.onTransact:613 com.android.server.wm.ActivityClientController.onTransact:136
Run Code Online (Sandbox Code Playgroud)
版本
minSdkVersion = 23
compileSdkVersion = 33
targetSdkVersion = 33
androidxActivityVersion = '1.6.1' …Run Code Online (Sandbox Code Playgroud)