首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android人脸检测API存储的视频文件

问Android人脸检测API存储的视频文件
EN

Stack Overflow用户
提问于 2016-08-18 21:47:16
回答 2查看 2.2K关注 0票数 4

我想使用Android Vision FaceDetector API对视频文件(例如,来自用户图库的MP4 )执行人脸检测/跟踪。我可以看到许多使用CameraSource类在直接来自摄像头(例如on the android-vision github)的流上执行人脸跟踪的示例,但在视频文件上却没有。

我试着通过Android Studio查看了CameraSource的源代码,但它被混淆了,我在网上看不到原件。我想象一下,在使用相机和使用文件之间有许多共性。假设我只是在Surface上播放视频文件,然后将其传递到管道。

或者,我可以看到Frame.Builder有函数setImageData和setTimestampMillis。如果我能够以ByteBuffer格式读取视频,我如何将其传递给FaceDetector应用程序接口?我猜this question也很相似,但没有答案。同样,将视频解码为Bitmap帧并将其传递给setBitmap。

理想情况下,我不想将视频渲染到屏幕上,并且处理速度应该与FaceDetector应用程序接口的处理速度一样快。

EN

回答 2

Stack Overflow用户

发布于 2016-08-18 21:56:07

或者,我可以看到Frame.Builder有setImageData和setTimestampMillis函数。如果我能够以ByteBuffer格式读取视频,我如何将其传递给FaceDetector应用程序接口?

只需调用SparseArray<Face> faces = detector.detect(frame);,其中必须像这样创建detector:

代码语言:javascript
复制
FaceDetector detector = new FaceDetector.Builder(context)
   .setProminentFaceOnly(true)
   .build();
票数 2
EN

Stack Overflow用户

发布于 2017-04-05 03:52:52

如果处理时间不是问题,那么使用MediaMetadataRetriever.getFrameAtTime就可以解决问题。正如安东建议的那样,您也可以使用FaceDetector.detect

代码语言:javascript
复制
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"
    }

其中deltaT=1000000/fps和fps是所需的每秒帧数。例如,如果您希望每秒提取4个帧,deltaT=250000 (请注意,faces将在每次迭代中被覆盖,因此您应该在循环中执行某些操作(存储/报告结果

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39019899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档