2017-02-14 59 views
4

我正在試圖製作相機應用,使用谷歌移動視覺檢測臉部使用自定義相機實例的Api Api Array中的「CameraSource」不同於我製作的幀處理以檢測顏色,並與相機源我不允許獲取相機幀。 我搜索它後,我得到的所有結果都是關於使用CameraSource的移動視覺而不是任何定製的camera1 Api。 我試圖讓那麼幀處理檢測喜歡這裏如何使用Android移動視覺庫處理單個相機框架

camera.setPreviewCallback(new Camera.PreviewCallback() { 
      @Override 
      public void onPreviewFrame(byte[] data, Camera camera) { 
       Log.d("onPreviewFrame", "" + data.length); 
       Camera.Parameters parameters = camera.getParameters(); 
       int width = parameters.getPreviewSize().width; 
       int height = parameters.getPreviewSize().height; 
       ByteArrayOutputStream outstr = new ByteArrayOutputStream(); 
       Rect rect = new Rect(0, 0, width, height); 
       YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null); 
       yuvimage.compressToJpeg(rect, 20, outstr); 
       Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size()); 
       detector = new FaceDetector.Builder(getApplicationContext()) 
         .setTrackingEnabled(true) 
         .setClassificationType(FaceDetector.ALL_LANDMARKS) 
         .setMode(FaceDetector.FAST_MODE) 
         .build(); 

       detector.setProcessor(
         new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory()) 
           .build()); 

       if (detector.isOperational()) { 
        frame = new Frame.Builder().setBitmap(bmp).build(); 
        mFaces = detector.detect(frame); 
//     detector.release(); 
       } 
      } 
     }); 

輸出圖片所以是沒有辦法,我可以用我的相機實例鏈接移動願景幀處理的麻袋來檢測它的臉什麼辦法? 你可以看到我在這裏迄今所做: https://github.com/etman55/FaceDetectionSampleApp

**新的更新

找到了CameraSource類的開源文件我解決我的大部分問題,但現在經過努力到人臉時,探測器正確地接收幀,但它無法檢測到任何東西>>你可以看到我在github回購中的最後一次提交。

+0

我覺得這很難支持視覺API的API級別21的Android視覺API的 檢查先決條件是SDK 26級以上,並且 攝像機1從API棄用21級 https://github.com/googlesamples/android-vision https://developer.android.com/reference/android/hardware/Camera.html –

+0

其實android視覺是使用自己的camera1 Api類,它是與proguard鎖定,因此很難判斷出'爲什麼我要讓我的自定義camera1類 –

回答

2

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

  • 建築爲相機提供了每個幀的新FaceDetector是非常糟糕的主意,也沒有必要。您只需在相機框架接收器外啓動一次。

  • 沒有必要獲取YUV_420_SP(或NV21)幀,然後將其轉換爲YUV實例,然後將其轉換爲位圖,然後使用位圖創建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

它應該調用.build()也像detector.detect(新Frame.Builder()。setImageData(ByteBuffer.wrap(數據),previewW,previewH,ImageFormat.NV21).build() )); – Pradeeshnarayan