1

在这个SO Thread中,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 回答