1

このSO スレッドで、pm0733464は次のように述べています。

オート フォーカス メソッドも持つ CameraSource クラスをオープン ソース化しました。これにより、公式 API のデフォルトである「連続ビデオ」モードとは対照的に、特定のフォーカス モードを設定できます。

それは素晴らしかった。しかし、Google Vision API は進んでいるように見えますが、オープン ソース バージョンは進んでいません。公式 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();

私の実験では、公式の Google Vision API サンプルで例が示しているプロセッサを使用するよりもはるかに高速にバーコードを「検出」します。

私はどこかで何かを逃していますか?または、Google.Vision ライブラリの CameraSource は、オープン ソースで表示されているものと同じではありませんか?

[編集] 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
    {

    }
4

1 に答える 1

0

一部のオプションに若干の違いはありますが、CameraSource の公式バージョンとオープン ソース バージョンの両方が最新です。

FocusingProcessor は、API の最初の起動時に含まれていたため、新しいものではありません。これは実際には、カメラのフォーカスまたは OnFocus の概念とはまったく関係ありません。代わりに、検出された特定の項目に「焦点を合わせる」という検出器の選択に関連しています。たとえば、LargestFaceFocusingProcessor (FocusingProcessor のサブクラス) があります。これは、最初にビュー内の最大の顔を検出し、その顔が表示されている間だけ追跡します。

CameraSource の両方のバージョンでオートフォーカスがサポートされるようになりましたが、それぞれのバージョンでこれがどのように指定されているかの詳細は少し異なります。公式のバーコード サンプル アプリが遅い場合は、そのアプリでオートフォーカスが有効になっていない可能性があります。

于 2016-09-30T20:39:47.537 に答える