2016-08-18 10 views
2

Android Vision FaceDetector APIを使用して、動画ファイル(ユーザーギャラリーのMP4など)で顔検出/追跡を行いたいとします。 CameraSourceクラスを使用して、カメラから直接送信されるストリーム(たとえばon the android-vision github)に顔のトラッキングを実行することについての多くの例を見ることができますが、ビデオファイルには何も表示されません。Androidの顔検出API - 保存された動画ファイル

CameraSourceのソースコードをAndroid Studioから見てみましたが、難読化されていて、元のオンラインを見ることができませんでした。私はイメージを使用して、カメラとファイルを使用する間に多くの共通点があります。おそらく私はSurfaceでビデオファイルを再生し、それをパイプラインに渡すだけです。

また、Frame.Builderは、機能がsetImageDataおよびsetTimestampMillisであることがわかります。動画の中でByteBufferと読むことができたら、それをどのようにFaceDetector APIに渡すのですか?私はthis questionは似ていますが、答えはないと思います。同様に、ビデオをBitmapフレームにデコードし、それをsetBitmapに渡します。

理想的には、ビデオを画面にレンダリングしたくないので、処理は、APIが可能な限り速く行わなければなりません。

+0

オープンソース版のCameraSourceここ:https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/カメラ/ CameraSource.java – pm0733464

+0

あなたの問題を解決しましたか?同じですか? –

答えて

2

また、Frame.BuilderにsetImageDataとsetTimestampMillisという関数があることがわかります。私がByteBufferとしてビデオを読むことができたら、それをFaceDetector APIにどのように渡すのでしょうか?

単にdetectorは次のように作成する必要がありますSparseArray<Face> faces = detector.detect(frame);を呼び出す:

FaceDetector detector = new FaceDetector.Builder(context) 
    .setProminentFaceOnly(true) 
    .build(); 
+0

ありがとうございます。私が述べたSOの質問(33173525)は、データを正しいバッファフォーマット(ImageFormat.YV12)に変換する際に問題が発生しており、解決策はありません。 –

+0

MediaCodec APIは、このようなことを「公式に」行う方法です。しかし、それは過度に複雑です。たぶん、ffmpegライブラリでもっと成功するでしょうが、私はむしろMediaCodecを使いたいと思います。 –

1

処理時間が問題でない場合は、MediaMetadataRetriever.getFrameAtTimeを使用して問題を解決します。アントンが示唆したように、あなたもFaceDetector.detectを使用することができます。

deltaT=1000000/fps
Bitmap bitmap; 
Frame frame; 
SparseArray<Face> faces; 
MediaMetadataRetriever mMMR = new MediaMetadataRetriever(); 
mMMR.setDataSource(videoPath); 
String timeMs = mMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // video time in ms 
int totalVideoTime= 1000*Integer.valueOf(timeMs); // total video time, in uS 
for (int time_us=1;time_us<totalVideoTime;time_us+=deltaT){ 
     bitmap = mMMR.getFrameAtTime(time_us, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); // extract a bitmap element from the closest key frame from the specified time_us 
     if (bitmap==null) break; 
     frame = new Frame.Builder().setBitmap(bitmap).build(); // generates a "Frame" object, which can be fed to a face detector 
     faces = detector.detect(frame); // detect the faces (detector is a FaceDetector) 
     // TODO ... do something with "faces" 
    } 

、及びfps 1秒あたりのフレームの所望の数です。たとえば、毎秒4フレームを抽出する場合は、deltaT=250000 (すべての反復で上書きされるので、ループ内で何か(ストア/レポート結果)を行う必要があります。

+0

あなたのforループは何をしていますか、親切に –

+0

を更新しました。説明を追加しました – pwoolvett

+0

顔は、顔が検出されたフレームか、実際には何ですか? と対処する方法をビットマップに変換するか、ファイルに保存することはできますか? –

関連する問題