2016-12-08 2 views
0

J'ai une image de femmes. Je trouve ses points de vue en utilisant FaceDetector. Maintenant, je veux ajouter une image de cheveux sur son visage en utilisant ces points d'yeux.Ajouter l'image sur l'image à des points XY spécifiques dans ImageView

Je chargeais cette image de la galerie en utilisant ci-dessous le code

btnLoad.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     startActivityForResult(intent, RQS_LOADIMAGE); 
    } 
}); 

En onActivityResult, je vérifie le visage cordinates

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    try { 
     InputStream inputStream = getContentResolver().openInputStream(data.getData()); 
     myBitmap = BitmapFactory.decodeStream(inputStream); 
     inputStream.close(); 
     imgView.setImageBitmap(myBitmap); 

     if (myBitmap == null) { 
      Toast.makeText(MainActivity.this, "myBitmap == null", Toast.LENGTH_LONG).show(); 
     } else { 
      detectFace(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

méthode de détection des visages

private void detectFace() { 

    Paint myRectPaint = new Paint(); 
    myRectPaint.setStrokeWidth(5); 
    myRectPaint.setColor(Color.RED); 
    myRectPaint.setStyle(Paint.Style.STROKE); 

    tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565); 
    Canvas tempCanvas = new Canvas(tempBitmap); 
    tempCanvas.drawBitmap(myBitmap, 0, 0, null); 

    FaceDetector faceDetector = new FaceDetector.Builder(this) 
      .setTrackingEnabled(true) 
      .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
      .setMode(FaceDetector.ACCURATE_MODE) 
      .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
      .build(); 

    Frame frame = new Frame.Builder().setBitmap(myBitmap).build(); 
    SparseArray<Face> faces = faceDetector.detect(frame); 

    imgView.setImageDrawable(new BitmapDrawable(getResources(), drawOnFace(faces))); 
} 

Obtenir les coordonnées des yeux en utilisant ci-dessous le code: -

private Bitmap drawOnFace(SparseArray<Face> faceArray) { 

    tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(tempBitmap); 
    canvas.drawBitmap(myBitmap, 0, 0, null); 

    for (int i = 0; i < faceArray.size(); i++) { 

     Face face = faceArray.get(i); 

     for (Landmark landmark : face.getLandmarks()) { 
      switch (landmark.getType()) { 
       case Landmark.LEFT_EYE: 
        drawPoint(canvas, landmark.getPosition()); 
        break; 
       case Landmark.RIGHT_EYE: 
        drawPoint(canvas, landmark.getPosition()); 
        break; 
      } 
     } 
    } 
    return tempBitmap; 
} 

cercle Draw sur les yeux à l'aide ci-dessous le code: -

private void drawPoint(Canvas canvas, PointF point) { 

    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 
    paint.setStrokeWidth(8); 
    paint.setStyle(Paint.Style.STROKE); 

    float x = point.x; 
    float y = point.y; 

    canvas.drawCircle(x, y, 10, paint); 
} 

maintenant à l'intérieur méthode point de soutirage, j'ai les coordonnées yeux. Je veux utiliser ces points pour mettre l'image des cheveux sur le visage. Je ne sais vraiment pas quoi faire ensuite. Appréciez l'aide les gars. Nous vous remercions à l'avance

+0

avait encore une chance? – Redman

+0

n'ai pas de solution pour ce problème – Mahesh

+0

j'ai compris comment mettre l'image sur l'aperçu de la caméra, mais l'image n'est pas placée à la bonne position – Redman

Répondre

0

Pour placer l'image sur l'appareil photo aperçu utiliser ce code

float left=0,top=0; 
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.mustache); 
//if you are in non activity then use context.getResources() 
canvas.drawBitmap(bitmap,left,top,paint);