2013-08-30 2 views
2

J'essaie de faire Face swap type d'application en utilisant faceetection. Jusqu'à présent, je reçois les visages détectés en bitmap et dessiner ovale sur les visages détectés. Mais maintenant je dois utiliser les visages à l'intérieur de l'ovale pour pouvoir échanger deux visages. C'est possible. J'ai besoin de quelques suggestions à ce sujet.Permutation de visage à l'aide de la détection des visages Android

Ma classe d'activité comme suit

public class FaceDetectionActivity extends Activity 
{ 


public MyView faceview; 
public ImageView gallery; 
private Uri imageURI; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.main); 
    setContentView(R.layout.main); 

    faceview = (MyView)findViewById(R.id.faceview); 

    gallery=(ImageView)findViewById(R.id.gallery); 

    gallery.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType("image/*"); 
      startActivityForResult(intent, 0); 

     } 
    }); 


} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == Activity.RESULT_OK) { 

     if(requestCode==0){ 

     imageURI = data.getData(); 


     try { 
      Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI); 

      faceview.myBitmap=b; 


     } catch (FileNotFoundException e) { 
//    TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (IOException e) { 
//    TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



     faceview.invalidate(); 

     } 


     faceview.invalidate(); 
    } else { 
     System.exit(0); 
     Log.e("result", "BAD"); 
    } 
} 


} 

et moi classe

public class MyView extends ImageViewTouchBase { 

public RectF rectF; 
public Bitmap myBitmap; 
private int width, height; 
private FaceDetector.Face[] detectedFaces; 
private int NUMBER_OF_FACES=10; 
private FaceDetector faceDetector; 
private int NUMBER_OF_FACE_DETECTED; 
private float eyeDistance; 
Matrix mImageMatrix; 

public MyView(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options(); 
    bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565; 
    myBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.familyportrait,bitmapFatoryOptions); 
    width=myBitmap.getWidth(); 
    height=myBitmap.getHeight(); 
    detectedFaces=new FaceDetector.Face[NUMBER_OF_FACES]; 
    faceDetector=new FaceDetector(width,height,NUMBER_OF_FACES); 
    NUMBER_OF_FACE_DETECTED=faceDetector.findFaces(myBitmap, detectedFaces); 
} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    if(myBitmap!=null) 
    { 


    canvas.drawBitmap(myBitmap, 0,0, null); 

    } 
    Paint myPaint = new Paint(); 
    myPaint.setColor(Color.GREEN); 
    myPaint.setStyle(Paint.Style.STROKE); 
    myPaint.setStrokeWidth(3); 

    for(int count=0;count<NUMBER_OF_FACE_DETECTED;count++) 
    { 
     Face face=detectedFaces[count]; 
     PointF midPoint=new PointF(); 
     face.getMidPoint(midPoint); 

     eyeDistance=face.eyesDistance(); 

    float left = midPoint.x - (float)(1.4 * eyeDistance); 
    float right = midPoint.x + (float)(1.4 * eyeDistance); 
    float top = midPoint.y - (float)(1.8 * eyeDistance); 
    float bottom = midPoint.y + (float)(1.8 * eyeDistance); 

    Rect imageRect = new Rect(0, 0, width, height); 
    rectF = new RectF(); 

    rectF.set(left,top,right,bottom); 

    canvas.drawOval(rectF, myPaint); 


    } 
} 

} 

Maintenant, je veux le contenu à l'intérieur de l'ovale à sélectionner. S'il vous plaît me suggérer quelques idées.

Répondre

1

Je viens de comprendre. Je crée un autre bitmap avec les variables Left, Right, Top et Bottom à partir du code ci-dessus. et puis j'obtiens un bitmap carré des visages. J'extrais le bitmap circulaire des faces carrées de bitmap. C'est tout.

+0

pouvez-vous s'il vous plaît partager votre code? – NoviceMe

+1

son code un peu encombrant. Je vais écrire un tutoriel et le partager en une semaine. –

+0

Hey @Sandeep, j'adore votre idée, je serais ravi de voir le code si c'est possible. – KickAss

Questions connexes