Является ли класс CameraSource API-интерфейса Google Vision с открытым исходным кодом устаревшим?

В этой теме, pm0733464, говорится следующее:

мы открыли источник класса CameraSource, который также имеет метод автофокуса. Этот позволяет вам установить конкретный режим фокусировки, а не режим "непрерывного видео", который по умолчанию установлен в официальном API:

Это было здорово. Но похоже, что Google Vision API продвинулся дальше, а открытая версия Sourced - нет. Официальный API теперь имеет новый тип процессора под названием: FocusingProcessor, который позволяет детектору реагировать только на событие OnFocus.

 barcodeDetector = new BarcodeDetector.Builder(this)
            .setBarcodeFormats(Barcode.QR_CODE | Barcode.PDF417)
            .build();
 barcodeDetector.setProcessor(new BarcodeFocusingProcessor(
            barcodeDetector,
            new NullTracker()));
 CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setRequestedPreviewSize(1600, 1024)
            .setAutoFocusEnabled(true)
            .setRequestedFps(24.0f);
    cameraSource = builder.build();

В моих экспериментах это "находит" штрих-коды намного быстрее, чем при использовании процессора, который приведен в Примерах API Google Vision.

Я что-то упустил где-то? Или CameraSource в библиотеках Google.Vision отличается от того, который они показывают в открытом коде?

[РЕДАКТИРОВАТЬ] Совместное использование кода по запросу pm0733464:

Для справки, я начал с развилки Vision Api Demo, который позволяет автоматически определять штрих-код

Мой код вносит несколько простых изменений. Прежде всего, я добавляю PDF417 к сканируемым штрих-кодам. Затем я установил процессор на автофокус-эр. Я превращаю трекер в nullTracker, потому что мне не нужно отображение графики, и я надеялся, что это ускорит некоторые вещи

в BarcodeCaptureActivity я изменяю createCameraSource, где он определил детектор штрих-кода следующим образом:

  BarcodeDetector barcodeDetector =
                new BarcodeDetector.Builder(context)
                        .setBarcodeFormats(Barcode.PDF417)
                        .build();


        barcodeDetector.setProcessor(new MyCameraFocusingProcessor(
                barcodeDetector,
                new NullTracker()));


// Creates and starts the camera.  Note that this uses a higher resolution in comparison
        // to other detection examples to enable the barcode detector to detect small barcodes
        // at long distances.

        CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
                .setFacing(CameraSource.CAMERA_FACING_BACK)
                .setRequestedPreviewSize(1600, 1024)
                .setRequestedFps(24.0f);

        // make sure that auto focus is an available option
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        {
            builder = builder.setFocusMode(
                    autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
        }

        mCameraSource = builder
                .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
                .build();
    }

Мой FocusProcessor (в том же классе) выглядит так:

private class MyCameraFocusingProcessor implements Detector.Processor<Barcode>
    {
        public MyCameraFocusingProcessor(BarcodeDetector barcodeDetector, NullTracker emptyTracker)
        {

        }

        @Override
        public void release()
        {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections)
        {
            //  boolean chk = detections.detectorIsOperational();
            int sizeCheck = detections.getDetectedItems().size();
            if (sizeCheck > 0)
            {
                SparseArray<Barcode> codes = detections.getDetectedItems();
                for (int i = 0; i < sizeCheck; i++)
                {
                    Barcode barcode = codes.valueAt(i);
                    try
                    {
                        if (barcode.format == Barcode.PDF417)
                        {
                            Intent data = new Intent();
                            data.putExtra(BarcodeObject, barcode);
                            setResult(CommonStatusCodes.SUCCESS, data);
                            finish();
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.d("Detect", "Error: " + ex.getMessage());
                    }
                }
            }
            return;
        }
    }

    private class NullTracker
    {

    }

1 ответ

Как официальная, так и открытая версии CameraSource являются актуальными, хотя в некоторых вариантах есть небольшие различия.

FocusingProcessor не нов, поскольку он был включен в первоначальный запуск API. На самом деле это никак не связано с понятием фокуса камеры или OnFocus. Вместо этого это связано с выбором детектора "фокусироваться" на конкретном обнаруженном предмете. Например, существует LargestFaceFocusingProcessor - подкласс FocusingProcessor - который изначально определяет самое большое видимое лицо и отслеживает только то лицо, которое видимо.

Обе версии CameraSource теперь поддерживают автофокусировку, хотя особенности того, как это указано в каждой, немного разошлись. Если официальный пример приложения со штрих-кодом работает медленнее, это, вероятно, означает, что автофокусировка не была включена в этом приложении.

Другие вопросы по тегам