2017-01-18 8 views

答えて

1

[OK]を、私は公式APIでCameraSourceクラスのカメラ2版のための短期的計画はありません。このcamera2 with mobile vision? #65

を見つけました。しかし、APIの構造を考えれば、CameraSourceの代替バージョンは、camera2を使用する開発者コミュニティによって作成される可能性があります。フレームと検出器を扱うための既存のAPIはすべて、camera2の実装をサポートするのに十分です。

4

はい、Google Vision APIでCamera2 APIを使用することは可能です。

まず、Google Vision APIの顔検出器は、顔とその目印を検出するために使用する​​オブジェクトを受け取ります。

Camera1 APIは、NV21イメージ形式のプレビューフレームを提供します。これは私たちにとって理想的です。 Google Vision Frame.Builderは、Bitmapを処理するプレビューフレームとして使用するために、setImageData(NV16、NV21またはYV12イメージフォーマットのByteBuffer)とsetBitmapの両方をサポートしています。

問題は、Camera2 APIがプレビューフレームを別の形式で提供することです。それはYUV_420_888です。すべてを機能させるには、プレビューフレームをサポートされているフォーマットに変換する必要があります。

ImageReaderからCamera2プレビューフレームを取得したら、Imageとしてこの機能を使用して、サポートされているフォーマット(この場合はNV21)に変換できます。

private byte[] convertYUV420888ToNV21(Image imgYUV420) { 
    // Converting YUV_420_888 data to YUV_420_SP (NV21). 
    byte[] data; 
    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer(); 
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer(); 
    int buffer0_size = buffer0.remaining(); 
    int buffer2_size = buffer2.remaining(); 
    data = new byte[buffer0_size + buffer2_size]; 
    buffer0.get(data, 0, buffer0_size); 
    buffer2.get(data, buffer0_size, buffer2_size); 
    return data; 
} 

その後は、Googleビジョンフレームを作成するには、[]返されたバイトを使用することができます。

outputFrame = new Frame.Builder() 
    .setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21) 
    .setId(mPendingFrameId) 
    .setTimestampMillis(mPendingTimeMillis) 
    .setRotation(mSensorOrientation) 
    .build(); 

最後に、あなたが作成したフレームで検出器を呼ぶ:とにかく

mDetector.receiveFrame(outputFrame); 

、これについてもっと知りたければ、GitHub:Camera2Visionで無料で利用可能な私の作業例をテストすることができます。私は助けて欲しいと思います:)

+0

私はあなたのgithubの例に従って、バーコードpdf417の検出を適用しようとすると、期待どおりに動作しません。 pdf417バーコードがうまく検出されない(QRコードはうまく機能するが、pdf417フォーマットではない、なぜならそれはスレッド問題によるものだと思う...) –

関連する問題