Android Vision – Уменьшите окно отслеживания штрих-кода

Я пытаюсь внедрить сканер Google Visions в приложение, над которым я работаю. По умолчанию его полноэкранная активность и штрих-коды отслеживаются по всему экрану.

Тем не менее, мне нужна полноэкранная камера, но с ограниченным окном сканирования. Например, поверхностный вид камеры должен быть полноэкранным, у него есть 2 прозрачных оверлея, установленных на 35% высоты экрана сверху и снизу, оставляя 30% -ное окно просмотра в центре.

Я изменил графический оверлей, поэтому он будет отображаться только в среднем видовом экране, но havent смог определить, как ограничить отслеживание штрих-кода в той же области.

Есть идеи?

Текущий 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(); 
Intereting Posts