在我们的 iOS 项目中,我们使用 Carthage 作为依赖管理器。我们希望将使用 ML Kit 的 Scan Barcodes添加到项目中。但似乎 Scan Barcodes 仅通过 Cocoapods 分发。有没有办法GoogleMLKit/BarcodeScanning通过迦太基或手动添加?
我有一个简单的布局:
<RelativeLayout
android:id="@+id/myP"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.camera.view.PreviewView
android:id="@+id/mPreviewView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.example.dochjavatestimplementation.pkgActivity.ExtendedImageView
android:id="@+id/imageViewOmgShowIt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
previewView 用于显示相机,ExtendedImageView 用于显示显示找到的对象 rect。
我的图像分析器:
imageAnalysis = new ImageAnalysis.Builder()
.setTargetResolution(new Size(mPreviewView.getWidth(),mPreviewView.getHeight()))
.build();
imageAnalysis.setAnalyzer(executor, new PaperImageAnalyser());
Run Code Online (Sandbox Code Playgroud)
纸图像分析器:
public class PaperImageAnalyser implements ImageAnalysis.Analyzer {
ObjectDetectorOptions options = new ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
.enableClassification() // Optional
.build();
ObjectDetector objectDetector = ObjectDetection.getClient(options);
@Override
public void analyze(@NonNull ImageProxy imageProxy) {
@SuppressLint("UnsafeExperimentalUsageError") Image mediaImage = imageProxy.getImage();
if (mediaImage != null) {
InputImage image =InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees());
objectDetector.process(image)
.addOnSuccessListener(
new OnSuccessListener<List<DetectedObject>>() {
@Override …Run Code Online (Sandbox Code Playgroud) android image-processing android-imageview android-camerax google-mlkit
我正在尝试在 flutter 中制作一个人脸识别应用程序。大部分代码取自此处。该项目使用了 Firebase ML Vision(现已弃用),因此我遵循了Google ML Kit 的迁移指南。我对代码的人脸检测部分进行了更改。
以下是检测功能的代码:
Future<List<Face>> detect(CameraImage image, InputImageRotation rotation) {
final faceDetector = GoogleMlKit.vision.faceDetector(
const FaceDetectorOptions(
mode: FaceDetectorMode.accurate,
enableLandmarks: true,
),
);
return faceDetector.processImage(
InputImage.fromBytes(
bytes: image.planes[0].bytes,
inputImageData:InputImageData(
inputImageFormat:InputImageFormatMethods.fromRawValue(image.format.raw)!,
size: Size(image.width.toDouble(), image.height.toDouble()),
imageRotation: rotation,
planeData: image.planes.map(
(Plane plane) {
return InputImagePlaneMetadata(
bytesPerRow: plane.bytesPerRow,
height: plane.height,
width: plane.width,
);
},
).toList(),
),
),
);
}
Run Code Online (Sandbox Code Playgroud)
当我调用该函数时,出现以下错误:
我无法弄清楚我哪里做错了。这是initializeCamera函数(其中调用了检测函数):
void _initializeCamera() async {
CameraDescription description = await getCamera(_direction);
InputImageRotation rotation = rotationIntToImageRotation(
description.sensorOrientation, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 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) 在 Android 中创建条形码扫描仪的最简单方法可能是使用 Google Code Scanner API https://developers.google.com/ml-kit/vision/barcode-scanning/code-scanner
然而,这似乎对我不起作用。我在 MainActivity.kt 文件中的代码如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val options = GmsBarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_AZTEC)
.build()
val scanner = GmsBarcodeScanning.getClient(this, options)
scanner.startScan()
.addOnSuccessListener { barcode ->
val rawValue: String? = barcode.rawValue
}
.addOnCanceledListener {
// Task canceled
}
.addOnFailureListener { e ->
// Task failed with an exception
}
}
}
Run Code Online (Sandbox Code Playgroud)
该settings.gradle文件有以下代码:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
Run Code Online (Sandbox Code Playgroud)
我的build.gradle …
通过CocoaPods使用GoogleMLKit 0.61.0将 Google Firebase 库从我的项目中定义的最新版本降级到下面详述的旧版本
before MLKit - Firebase/Analytics (6.27.0)
after MLKit - Firebase/Analytics (6.20.0)
before MLKit - Firebase/Core (6.27.0):
after MLKit - Firebase/Core (6.20.0):
before MLKit - nanopb (~> 1.30905.0)
before MLKit - FirebaseCore (6.8.0):
before MLKit - FirebaseCoreDiagnostics (~> 1.3)
after MLKit - nanopb (= 0.3.9011)
after MLKit - FirebaseAnalyticsInterop (1.5.0)
after MLKit - FirebaseCore (6.6.4):
after MLKit - FirebaseCoreDiagnostics (~> 1.2)
after MLKit - FirebaseCoreDiagnosticsInterop (~> 1.2)
Run Code Online (Sandbox Code Playgroud)
我的播客文件:
...
pod 'Firebase/Crashlytics'
pod 'Firebase/Analytics' …Run Code Online (Sandbox Code Playgroud) 应用程序具有 ML Kit 功能(翻译)。我试图通过引入动态模块功能、按需加载来减小应用程序的大小。
遵循本指南 将 'com.google.mlkit:playstore-dynamic-feature-support:16.0.0-beta1' 添加到基础 apk 的 build.gradle
com.google.mlkit:translate:16.1.2 在功能模块 build.gradle 中,
一切都会编译并尝试在模拟器上运行,但不幸的是应用程序从日志启动时崩溃
java.lang.RuntimeException: Unable to get provider com.google.mlkit.common.internal.MlKitInitProvider: com.google.firebase.components.MissingDependencyException: Unsatisfied dependency for component Component<[class com.google.android.gms.internal.mlkit_translate.zzxa]>{0, type=0, deps=[Dependency{anInterface=class com.google.mlkit.common.sdkinternal.SharedPrefManager, type=required, injection=direct}, Dependency{anInterface=class com.google.android.gms.internal.mlkit_translate.zzwx, type=required, injection=direct}]}: class com.google.mlkit.common.sdkinternal.SharedPrefManager
Caused by: com.google.firebase.components.MissingDependencyException: Unsatisfied dependency for component Component<[class com.google.android.gms.internal.mlkit_translate.zzxa]>{0, type=0, deps=[Dependency{anInterface=class com.google.mlkit.common.sdkinternal.SharedPrefManager, type=required, injection=direct}, Dependency{anInterface=class com.google.android.gms.internal.mlkit_translate.zzwx, type=required, injection=direct}]}: class com.google.mlkit.common.sdkinternal.SharedPrefManager
Run Code Online (Sandbox Code Playgroud)
哪一种没有意义。因为我添加了 playstore-dynamic-feature-support。