繁体   English   中英

无法在 android 上使用 firebase ml 套件检测 QR 码,但在 ios 上工作(颤振)

[英]Not detecting QR codes with firebase ml kit on android but works on ios (flutter)

我的二维码扫描仪停止在 Android 上工作,我不明白为什么......它以前工作过,扫描仪仍然在 iOS 上工作。

Firebase ML 套件在扫描时仅返回一个空列表,我尝试了许多不同的 android 设备和 QR 码,但都没有工作(不再)。

我试图清理并重新安装所有依赖项,我试图清除 Google Play 服务中的所有数据并重新安装应用程序(以便重新安装 ML 模型)

我有一个想法,它可能是不正确的图像格式,来自相机的格式是 YUV_420_888,我认为它使用下面的代码转换为 NV21,但不能 100% 确定它是如何工作的。

令人讨厌的是,这之前确实有效,但突然停止工作。

这是我对 QR 扫描仪的实现,它从相机 stream 接收图像

class QRCodeReader {

  BarcodeDetector _barcodeDetector = FirebaseVision.instance.barcodeDetector(BarcodeDetectorOptions(barcodeFormats: BarcodeFormat.qrCode));

  void dispose() {
    _barcodeDetector.close();
  }

  void scanImage(CameraImage availableImage, ScanCompleted scanCompleted) async {
    final FirebaseVisionImageMetadata metadata = FirebaseVisionImageMetadata(
      rawFormat: availableImage.format.raw,
      size: Size(availableImage.width.toDouble(), availableImage.height.toDouble()),
      planeData: availableImage.planes.map((currentPlane) => FirebaseVisionImagePlaneMetadata(
        bytesPerRow: currentPlane.bytesPerRow,
        height: currentPlane.height,
        width: currentPlane.width
        )).toList(),
      rotation: ImageRotation.rotation0,
    );

    final FirebaseVisionImage visionImage = FirebaseVisionImage.fromBytes(availableImage.planes[0].bytes, metadata);

    //this list is empty on android
    List barCodes = await _barcodeDetector.detectInImage(visionImage);

    for(Barcode barcode in barCodes) {
      //process barcode...
    }

    scanCompleted();
  } 
}

我像这样初始化 stream ...

_initializeControllerFuture = _controller.initialize();
_initializeControllerFuture.whenComplete(() {
  setState((){
    _controller.startImageStream(_handleImageStream);
  });
});

void _handleImageStream(CameraImage availableImage) {
    if (!_isScanning && !_disposed) {
      final state = Provider.of<ScannerState>(context);
      _isScanning = true;

      qrReader.scanImage(availableImage, () => _isScanning = false);
    }
}

应用程序/build.gradle

...
dependencies {
    ...
    api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2'
}

apply plugin: 'com.google.gms.google-services'

build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

AndroidManifest.xml

...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />


    <application
        android:name="io.flutter.app.FlutterApplication"
        ...>
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode" />
        ...
    </application>

pubspec.yaml

...
dependencies:
  ...
  camera: ^0.5.4+2
  firebase_core: ^0.4.0+9
  cloud_firestore: ^0.12.9+4
  cloud_functions: ^0.4.1+1
  firebase_ml_vision: ^0.9.2+1
...

编辑:正如弗兰克所建议的,问题是相机上的分辨率设置,如果它太低,则无法检测到 QR 码。 把它放在“高”或更高的位置可以解决这个问题。

我通过将相机插件回滚到版本解决了这个问题:“相机:^0.5.2+2”

不确定在较新版本中究竟是什么破坏了 android 的 ML 视觉 package,但这暂时解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM