【问题标题】:Is the Open Sourced Google Vision API CameraSource class Out-Dated?开源的 Google Vision API CameraSource 类过时了吗?
【发布时间】:2016-09-30 17:42:43
【问题描述】:

在这个SO Threadpm0733464,这样说:

我们开源了 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();

在我的实验中,这比使用Official Google Vision API Samples 中示例中显示的处理器快得多

我是否在某处遗漏了什么?还是 Google.Vision 库中的 CameraSource 与它们在开源中显示的不同?

[编辑] 根据pm0733464的要求分享代码:

为了记录,我从vision api Demo的分支开始,它允许automatically detecting barcode

我的代码做了一些简单的更改。首先,我将 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
    {

    }

【问题讨论】:

    标签: android android-camera google-play-services android-vision google-vision


    【解决方案1】:

    CameraSource 的官方和开源版本都是最新的,尽管在某些选项上存在细微差别。

    FocusingProcessor 并不是新的,因为它包含在 API 的初始启动中。这实际上与相机的焦点或 OnFocus 概念完全无关。相反,它与检测器选择“关注”特定检测项目有关。例如,有一个 LargestFaceFocusingProcessor(FocusingProcessor 的子类),它最初会检测视野中最大的人脸,并且只要该人脸可见,就只会跟踪它。

    两个版本的 CameraSource 现在都支持自动对焦,尽管每个版本中如何指定自动对焦的细节略有不同。如果官方的条形码示例应用程序速度较慢,则可能表明该应用程序中未启用自动对焦。

    【讨论】:

    • 感谢您的回复。有没有合并这两个版本的计划?还是分叉是永久性的,而开源版本现在总是有点偏离?既然你都见过,那么承诺将开源版本用于专业项目有什么缺点吗?我问是因为正式版似乎有一个错误。当我调用 cameraSource.release() 时出现错误:应用程序传递了 NULL 表面。我已经在 SO 上尝试了几种解决方案,但它总是会发生。应用程序继续运行,但我希望对 CameraSource 进行更精细的控制以避免此类事情。
    • “CameraSource 的官方和开源版本是最新的,虽然有细微的差别”@pm0733464 - 我想了解细微的差别。因为即使我添加了 FocussingProcessor,openSource 的速度仍然几乎是“官方”版本的两倍。两者都在调用自动​​对焦。 (当调用 mCamera.setPreviewTexture(null) 时,两者都会在 stop() 上抛出错误。)
    • 当然,pm0733464。上面更改以反映代码 sn-ps。如果您想查看整个项目,我可以将其压缩并通过电子邮件发送或其他方式。
    • 正式版只使用了FOCUS_MODE_CONTINUOUS_VIDEO,但是您的代码将焦点模式设置为FOCUS_MODE_CONTINUOUS_PICTURE。这可能是速度差异的原因。我建议尝试 FOCUS_MODE_CONTINUOUS_VIDEO。
    • pm0733464 - 使用“关闭”自动对焦仍然更快。这不是一个完美的测试,因为有一些代码更改。但是让我问你,衡量“认识时间”的最佳方法是什么?现在,我在 Preview Start 上添加了一个计时器: mPreview.start(mCameraSource, mGraphicOverlay); startTime = System.currentTimeMillis();然后我在 selectFocus 覆盖 LongestimateTime = System.currentTimeMillis() - startTime; 中再次检查它。这合理吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2023-03-08
    • 2019-05-11
    • 2021-03-01
    相关资源
    最近更新 更多