2015-10-29 2 views
0

Я использую Mobile Vision API в своем приложении для обнаружения лиц до сих пор. Мне это удалось. Он отлично работает для определенного изображения, которое я установил, когда я запускал приложение в первый раз, но после этого .. Я попытался заменить разные изображения для обнаружения лиц, он дает ошибку java.lang.OutOfMemoryErrorНевозможно обнаружить разные изображения для распознавания лиц Mobile Vision API

Ниже мой код

 Bitmap myBitmap; 
     FaceDetector detector; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
      //Load An Image//// 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inMutable=true; 
     Bitmap b = = BitmapFactory.decodeResource(
     getApplicationContext().getResources(), 
     R.drawable.image,options); 
     myBitmap = b.copy(Bitmap.Config.RGB_565, true); 
     b.recycle(); 
     //////////////// 
     detector = new FaceDetector.Builder(getApplicationContext()) 
     .setTrackingEnabled(false) 
     .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
      .build(); 
     if (!detector.isOperational()) 
       { Toast.makeText(MainActivity.this, "NO face deteted."Toast.LENGTH_SHORT) 
      .show();} 
      else { 
      Frame frame = new Frame.Builder().setBitmap(myBitmap).build(); 
        SparseArray<com.google.android.gms.vision.face.Face> faces =     detector.detect(frame); 
       FaceView faceView = (FaceView) findViewById(R.id.faceView); 
       faceView.setContent(myBitmap, faces); 
     } 

вот мой LogCat

     java.lang.OutOfMemoryError 
         at com.google.android.gms.vision.Frame.zzEx(Unknown Source) 
         at com.google.android.gms.vision.Frame.getGrayscaleImageData(Unknown Source) 
     at com.google.android.gms.vision.face.FaceDetector.detect(Unknown Source) 
     at com.chat.elearnplayer.mobilevisionapi.MainActivity.onCreate(MainActivity.java:43) 
     at android.app.Activity.performCreate(Activity.java:5296) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2283) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2370) 
     at android.app.ActivityThread.access$800(ActivityThread.java:155) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5426) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(Native Method) 

... Нужна ваша помощь ...

+0

может быть, ваши изображения больше, чем ваши тесты – behrooz

+0

поста ваш LogCat – behrooz

+0

i выбрасывает исключение, когда я пытаюсь заменить это перкулярное изображение ... хотя я также использовал метод bitmap.recycle, но у меня все еще такая же проблема ... ?? Не знаю, почему? –

ответ

0

Попробуйте

Bitmap myBitmap; 
FaceDetector detector; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //Load An Image//// 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inMutable=true; 
    Bitmap b = = BitmapFactory.decodeResource(
    getApplicationContext().getResources(), 
    R.drawable.image,options); 
    myBitmap = b.copy(Bitmap.Config.RGB_565, true); 
    b.recycle(); 
    ////////////////// 
    detector = new FaceDetector.Builder(getApplicationContext()) 
      .setTrackingEnabled(false) 
      .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
      .build(); 

    Detector<Face> safeDetector = new SafeFaceDetector(detector); 

    Frame frame = new Frame.Builder().setBitmap(myBitmap).build(); 
    SparseArray<com.google.android.gms.vision.face.Face> faces = safeDetector.detect(frame); 

    if (!safeDetector.isOperational()) { 
     Toast.makeText(MainActivity.this, "NO face deteted."Toast.LENGTH_SHORT) 
       .show(); 
    } else { 

     FaceView faceView = (FaceView) findViewById(R.id.faceView); 
     faceView.setContent(myBitmap, faces); 

     safeDetector.release(); 
    } 
} 

для повторного использования facedetector release(); должна вызываться после использования.

и SafeDetector использования: детектор лица есть ошибка для маленьких изображений и safeDetector является патчем для этой ошибки

добавить эту строку в импорте деятельности

import com.google.android.gms.samples.vision.face.patch.SafeFaceDetector;