Android Vision - 减少条码跟踪窗口

标签 android barcode-scanner google-vision

我正在尝试将 Google Visions 扫描仪应用到我正在开发的应用中。默认情况下,它是一个全屏 Activity ,并且在整个屏幕上跟踪条形码。

但是,我需要一个全屏摄像头,但扫描窗口有限。例如,相机的表面 View 需要全屏,它有 2 个透明叠加层设置为屏幕高度顶部和底部的 35%,在中心留下 30% 的视口(viewport)。

我已经更改了图形叠加层,因此它只会显示在中间视口(viewport)中,但无法弄清楚如何将条形码跟踪器限制在同一区域。

有什么想法吗?

最佳答案

当前的 API 不提供限制扫描区域的方法。但是,您可以过滤来自检测器的结果或裁剪传递到检测器的图像。

过滤结果方法

使用这种方法,条形码检测器仍会扫描整个图像区域,但检测到的目标区域之外的条形码将被忽略。这样做的一种方法是实现一个“聚焦处理器”,它从检测器接收结果,并且最多只将一个条形码传递给相关的跟踪器。例如:

public class CentralBarcodeFocusingProcessor extends FocusingProcessor<Barcode> {

  public CentralBarcodeFocusingProcessor(Detector<Barcode> detector, Tracker<Barcode> tracker) {
    super(detector, tracker);
  }

  @Override
  public int selectFocus(Detections<Barcode> detections) {
    SparseArray<Barcode> barcodes = detections.getDetectedItems();
    for (int i = 0; i < barcodes.size(); ++i) {
      int id = barcodes.keyAt(i);
      if (/* barcode in central region */) {
        return id;
      }
    }
    return -1;
  }
}

然后您可以像这样将此处理器与检测器相关联:

   BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
   barcodeDetector.setProcessor(
                new CentralBarcodeFocusingProcessor(myTracker));

裁剪图像的方法

在调用检测器之前,您需要先自己裁剪图像。这可以通过实现一个 Detector 子类来完成,该子类包装条形码检测器,裁剪接收到的图像,并使用裁剪后的图像调用条形码扫描仪。

例如,您可以制作一个检测器来拦截和裁剪图像,如下所示:

class MyDetector extends Detector<Barcode> {
  private Detector<Barcode> mDelegate;

  MyDetector(Detector<Barcode> delegate) {
    mDelegate = delegate;
  }

  public SparseArray<Barcode> detect(Frame frame) {
    // *** crop the frame here
    return mDelegate.detect(croppedFrame);
  }

  public boolean isOperational() {
    return mDelegate.isOperational();
  }

  public boolean setFocus(int id) {
    return mDelegate.setFocus(id);
  }
} 

您可以用这个包裹条码检测器,将其放在相机源和条码检测器之间:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context)
        .build();
MyDetector myDetector = new MyDetector(barcodeDetector);

myDetector.setProcessor(/* include your processor here */);

mCameraSource = new CameraSource.Builder(context, myDetector)
        .build();

关于Android Vision - 减少条码跟踪窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405717/

相关文章:

javascript - Angular2 + Cordova + 条码扫描仪插件 : Android behavior

android - 无法确定 com.google.android.gms :play-services-vision:18. 0.0 的 Artifact

java - AppCompatActivity 中的 GoogleMap 对象为 null

android - 如何从android中的条形码显示值中获取完整的产品信息?

ios - RedLaser 驾照扫描仪 - 针对每个州进行校准 (iOS)

Android Multi-tracker 示例项目运行但未显示任何形式的检测

android - 适用于 Android 的计算机视觉和 AR 库?

java - android中如何进行序列化和反序列化?

固定大小窗口中的android应用程序

android - 从生产中删除应用程序并继续测试