如何在使用Android移动视觉库时处理单个相机帧

时间:2017-02-14 11:37:17

标签: android camera face-detection android-vision

我正在尝试使用带有自定义相机实例的Google移动视觉API制作一个可以检测面部的相机应用程序,而不是相同的#34; CameraSource"在Google API中我也在处理帧以检测颜色,而且使用Camerasource我不允许获取相机帧。

在搜索此问题后,我发现的唯一结果是将移动视觉与其CameraSource配合使用,而不是使用任何自定义camera1 API。 我试图覆盖帧处理,然后对输出的图片进行检测,如下所示:

angular.module('starter', [
  'ionic', 'starter.controllers', 'angular-google-analytics'
])

.run(function($ionicPlatform, $rootScope, Analytics, $location) {
  $ionicPlatform.ready(function() {
    // [...]

    $rootScope.$on('$stateChangeSuccess', function (event) {
      console.log('Location changed to ' + $location.path());
      Analytics.trackPage($location.path());
    });
  });
})

.config(function($stateProvider, $urlRouterProvider, AnalyticsProvider) {
  AnalyticsProvider
    .setAccount('UA-XXXXXXXX-X')
    .logAllCalls(true) // Log all outbound calls to an in-memory array accessible via ```Analytics.log``` (default is false). This is useful for troubleshooting and seeing the order of calls with parameters
    .useAnalytics(true) // Use ga.js (classic) instead of analytics.js (universal). By default, universal analytics is used, unless this is called with a falsey value.
    .setHybridMobileSupport(true) // If set to a truthy value then each account object will disable protocol checking and all injected scripts will use the HTTPS protocol.
    .setPageEvent('$stateChangeSuccess') // Change the default page event name. Helpful when using ui-router, which fires $stateChangeSuccess instead of $routeChangeSuccess.
    .enterDebugMode(true); //Calling this method will enable debugging mode for Universal Analytics

  // Here routing ...
});

那么有什么方法可以将移动视觉与我的相机实例联系起来,以便进行帧处理并用它来检测面部? 你可以看到我到目前为止所做的事情: https://github.com/etman55/FaceDetectionSampleApp

**新更新

找到CameraSource类的开源文件后,我解决了大部分问题,但现在当试图检测到面部时,探测器正确地接收了帧,但它无法检测到任何内容>>你可以在github repo中看到我的最后一次提交。

2 个答案:

答案 0 :(得分:3)

我可以为您提供一些非常有用的提示。

  • 为相机提供的每个帧构建一个新的FaceDetector是非常坏主意,也是不必要的。您只需在相机框架接收器外启动一次。

  • 没有必要获取YUV_420_SP(或NV21)帧,然后将其转换为YUV实例,然后将其转换为Bitmap,然后使用Bitmap创建Frame.Builder()。如果您查看Frame.Builder Documentation,您可以看到它直接来自Camera Preview的NV21。 像这样:

    @override public void onPreviewFrame(byte[] data, Camera camera) {detector.detect(new Frame.Builder().setImageData(ByteBuffer.wrap(data), previewW, previewH, ImageFormat.NV21));}

答案 1 :(得分:0)

以及Kotin版本:

    import com.google.android.gms.vision.Frame as GoogleVisionFrame
    import io.fotoapparat.preview.Frame as FotoapparatFrame

    fun recogniseFrame(frame: FotoapparatFrame) = detector.detect(buildDetectorFrame(frame))
        .asSequence()
        .firstOrNull { it.displayValue.isNotEmpty() }
        ?.displayValue

    private fun buildDetectorFrame(frame: FotoapparatFrame) =
        GoogleVisionFrame.Builder()
            .setRotation(frame.rotation.toGoogleVisionRotation())
            .setImageData(
                ByteBuffer.wrap(frame.image),
                frame.size.width,
                frame.size.height,
                ImageFormat.NV21
            ).build()