この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
{
}