新しいGoogle Barcode APIのサンプルコードで遊んでいます。ボックスとバーコード値を、バーコードのライブカメラフィードにオーバーレイします。 (顔も)
アプリにバーコード値を返す方法がわかりません。 A)検出イベントがいつ発生したかを知る方法、およびB)アプリの他の部分で使用するためにravValueにアクセスする方法。誰でもこれを助けることができますか?
https://developers.google.com/vision/multi-tracker-tutorial
https://github.com/googlesamples/Android-vision
UPDATE:@ pm0733464の回答に基づいて、アクティビティでアクセスできるトラッカークラスにコールバックインターフェイス(onFoundと呼ばれる)を追加しました。 Googleマルチトラッカーサンプルの調整:
GraphicTracker:
class GraphicTracker<T> extends Tracker<T> {
private GraphicOverlay mOverlay;
private TrackedGraphic<T> mGraphic;
private Callback mCallback;
GraphicTracker(GraphicOverlay overlay, TrackedGraphic<T> graphic, Callback callback) {
mOverlay = overlay;
mGraphic = graphic;
mCallback = callback;
}
public interface Callback {
void onFound(String barcodeValue);
}
@Override
public void onUpdate(Detector.Detections<T> detectionResults, T item) {
mCallback.onFound(((Barcode) item).rawValue);
mOverlay.add(mGraphic);
mGraphic.updateItem(item);
}
BarcodeTrackerFactory:
class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
private GraphicOverlay mGraphicOverlay;
private GraphicTracker.Callback mCallback;
BarcodeTrackerFactory(GraphicOverlay graphicOverlay, GraphicTracker.Callback callback) {
mGraphicOverlay = graphicOverlay;
mCallback = callback;
}
@Override
public Tracker<Barcode> create(Barcode barcode) {
BarcodeGraphic graphic = new BarcodeGraphic(mGraphicOverlay);
return new GraphicTracker<>(mGraphicOverlay, graphic, mCallback);
}
}
主な活動:
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(mGraphicOverlay, new GraphicTracker.Callback() {
@Override
public void onFound(String barcodeValue) {
Log.d(TAG, "Barcode in Multitracker = " + barcodeValue);
}
});
MultiProcessor<Barcode> barcodeMultiProcessor = new MultiProcessor.Builder<>(barcodeFactory).build();
barcodeDetector.setProcessor(barcodeMultiProcessor);
バーコード検出器を直接使用する
1つのアプローチは、次のように、ビットマップ上でバーコード検出器を直接使用することです。
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<Barcode> barcodes = barcodeDetector.detect(frame);
if (barcodes.size() > 0) {
// Access detected barcode values
}
通知の受信
別のアプローチは、カメラプレビュービデオから検出されたバーコードを受信するためのパイプライン構造をセットアップすることです(GitHubの MultiTrackerの例 を参照)。次のように、検出されたバーコードを受信する独自のトラッカーを定義します。
class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
@Override
public Tracker<Barcode> create(Barcode barcode) {
return new MyBarcodeTracker();
}
}
class MyBarcodeTracker extends Tracker<Barcode> {
@Override
public void onUpdate(Detector.Detections<Barcode> detectionResults, Barcode barcode) {
// Access detected barcode values
}
}
このトラッカーの新しいインスタンスがバーコードごとに作成され、onUpdateメソッドが検出されたバーコード値を受け取ります。
次に、カメラソースをセットアップして、画像を検出器に連続的にストリーミングし、トラッカーで結果を受け取ります。
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory();
barcodeDetector.setProcessor(
new MultiProcessor.Builder<>(barcodeFactory).build());
mCameraSource = new CameraSource.Builder(context, barcodeDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(1600, 1024)
.build();
後で、カメラソースを直接起動するか、カメラプレビューを表示するビューと組み合わせて使用します(詳細については MultiTrackerの例 を参照してください)。