Image de culture avec détection de visage dans Android

J'avais besoin d'une démo où toute image peut être recadrée avec la fonction de détection de visage.

FIXÉ

  • Accès au serveur Web exécuté dans Eclipse depuis l'extérieur du poste de travail
  • Plusieurs dépôts maven à Gradle
  • EOFException est lancé lors de la lecture des contenus d'un fichier ePub
  • EditText reste incohérent dans les mises en page
  • Le meilleur pour utiliser Android Studio ou Intellij Idea wth plugins?
  • Pourquoi n'est-ce pas SetVisibility sur Android ProgressBar?
  • Mais après quelques heures de surf, je ne suis pas venu à une démo unique, alors j'ai préparé une démo unique avec une conjonction de quelques démonstrations que j'ai trouvées en ligne.

    J'ai préparé une démo pour recadrer l'image.

    Ma démo récolte le rectangle d'image, et aussi circulaire.

    Il détecte également le visage et récolte l'image en fonction de la détection de visage.

    J'utilise l'image suivante pour la recadrer.

    Image principale

    Et la capture d'écran du résultat de la récolte est:

    Capture d'écran

    Le xml pour l'exemple est:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity" > <View android:id="@+id/part1" android:layout_width="fill_parent" android:layout_height="100dp" > </View> <View android:id="@+id/part2" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginTop="30dp" > </View> </LinearLayout> 

    Le code java pour l'activité:

     public class MainActivity extends Activity { public View part1, part2; int viewHeight, viewWidth; private FaceDetector myFaceDetect; private FaceDetector.Face[] myFace; float myEyesDistance; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); part1 = findViewById(R.id.part1); part2 = findViewById(R.id.part2); part1.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub viewHeight = part1.getMeasuredHeight(); viewWidth = part1.getMeasuredWidth(); try { Paint paint = new Paint(); paint.setFilterBitmap(true); Bitmap bitmapOrg = BitmapFactory.decodeResource( getResources(), R.drawable.sachin_tendulkar_10102013); int targetWidth = bitmapOrg.getWidth(); int targetHeight = bitmapOrg.getHeight(); Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); RectF rectf = new RectF(0, 0, viewWidth, viewHeight); Canvas canvas = new Canvas(targetBitmap); Path path = new Path(); path.addRect(rectf, Path.Direction.CW); canvas.clipPath(path); canvas.drawBitmap( bitmapOrg, new Rect(0, 0, bitmapOrg.getWidth(), bitmapOrg .getHeight()), new Rect(0, 0, targetWidth, targetHeight), paint); Matrix matrix = new Matrix(); matrix.postScale(1f, 1f); BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options(); bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565; bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.sachin_tendulkar_10102013, bitmapFatoryOptions); myFace = new FaceDetector.Face[5]; myFaceDetect = new FaceDetector(targetWidth, targetHeight, 5); int numberOfFaceDetected = myFaceDetect.findFaces( bitmapOrg, myFace); Bitmap resizedBitmap = null; if (numberOfFaceDetected > 0) { PointF myMidPoint = null; Face face = myFace[0]; myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance(); if (myMidPoint.x + viewWidth > targetWidth) { while (myMidPoint.x + viewWidth > targetWidth) { myMidPoint.x--; } } if (myMidPoint.y + viewHeight > targetHeight) { while (myMidPoint.y + viewHeight > targetHeight) { myMidPoint.y--; } } resizedBitmap = Bitmap.createBitmap(bitmapOrg, (int) (myMidPoint.x - myEyesDistance), (int) (myMidPoint.y - myEyesDistance), viewWidth, viewHeight, matrix, true); } else { resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, viewWidth, viewHeight, matrix, true); } /* convert Bitmap to resource */ // Bitmap resizedBitmap = Bitmap.createBitmap(targetBitmap, // 0, // 0, viewWidth, viewHeight, matrix, true); BitmapDrawable bd = new BitmapDrawable(resizedBitmap); part1.setBackgroundDrawable(bd); } catch (Exception e) { System.out.println("Error1 : " + e.getMessage() + e.toString()); } } }); part2.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub viewHeight = part2.getMeasuredHeight(); viewWidth = part2.getMeasuredWidth(); try { Paint paint = new Paint(); paint.setFilterBitmap(true); Bitmap bitmapOrg = BitmapFactory.decodeResource( getResources(), R.drawable.sachin_tendulkar_10102013); int targetWidth = bitmapOrg.getWidth(); int targetHeight = bitmapOrg.getHeight(); Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); RectF rectf = new RectF(0, 0, viewWidth, viewHeight); Canvas canvas = new Canvas(targetBitmap); Path path = new Path(); path.addRect(rectf, Path.Direction.CW); canvas.clipPath(path); canvas.drawBitmap( bitmapOrg, new Rect(0, 0, bitmapOrg.getWidth(), bitmapOrg .getHeight()), new Rect(0, 0, targetWidth, targetHeight), paint); Matrix matrix = new Matrix(); matrix.postScale(1f, 1f); BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options(); bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565; bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.sachin_tendulkar_10102013, bitmapFatoryOptions); myFace = new FaceDetector.Face[5]; myFaceDetect = new FaceDetector(targetWidth, targetHeight, 5); int numberOfFaceDetected = myFaceDetect.findFaces( bitmapOrg, myFace); Bitmap resizedBitmap = null; if (numberOfFaceDetected > 0) { PointF myMidPoint = null; Face face = myFace[0]; myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance() + 20; if (myMidPoint.x + viewWidth > targetWidth) { while (myMidPoint.x + viewWidth > targetWidth) { myMidPoint.x--; } } if (myMidPoint.y + viewHeight > targetHeight) { while (myMidPoint.y + viewHeight > targetHeight) { myMidPoint.y--; } } resizedBitmap = Bitmap.createBitmap(bitmapOrg, (int) (myMidPoint.x - myEyesDistance), (int) (myMidPoint.y - myEyesDistance), viewWidth, viewHeight, matrix, true); } else { resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, viewWidth, viewHeight, matrix, true); } /* convert Bitmap to resource */ // Bitmap resizedBitmap = Bitmap.createBitmap(targetBitmap, // 0, // 0, viewWidth, viewHeight, matrix, true); BitmapDrawable bd = new BitmapDrawable(resizedBitmap); part2.setBackgroundDrawable(new BitmapDrawable( getCroppedBitmap(bd.getBitmap()))); } catch (Exception e) { System.out.println("Error1 : " + e.getMessage() + e.toString()); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public Bitmap getCroppedBitmap(Bitmap bitmap) { // Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), // bitmap.getHeight(), Config.ARGB_8888); // Canvas canvas = new Canvas(output); // // final int color = 0xff424242; // final Paint paint = new Paint(); // final Rect rect = new Rect(0, 0, bitmap.getWidth(), // bitmap.getHeight()); // // paint.setAntiAlias(true); // canvas.drawARGB(0, 0, 0, 0); // paint.setColor(color); // // canvas.drawRoundRect(rectF, roundPx, roundPx, paint); // canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, // bitmap.getWidth() / 2, paint); // paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // canvas.drawBitmap(bitmap, rect, rect, paint); // // Bitmap _bmp = Bitmap.createScaledBitmap(output, 60, 60, false); // // return _bmp; // return output; int targetWidth = bitmap.getWidth(); int targetHeight = bitmap.getHeight(); Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(targetBitmap); Path path = new Path(); path.addCircle(((float) targetWidth - 1) / 2, ((float) targetHeight - 1) / 2, (Math.min(((float) targetWidth), ((float) targetHeight)) / 2), Path.Direction.CCW); canvas.clipPath(path); Bitmap sourceBitmap = bitmap; canvas.drawBitmap(sourceBitmap, new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()), new Rect(0, 0, targetWidth, targetHeight), null); return targetBitmap; } } 

  • Comment rendre Android ProgressBar déterminé dans le code?
  • R.id.container non résolu
  • Eclipse n'a pas pu résoudre l'erreur de ressource de chaîne
  • Relier un service à une autre application
  • Téléchargement Multipart Android
  • Impossible de résoudre le symbole Google API Client dans Android Studio
  • One Solution collect form web for “Image de culture avec détection de visage dans Android”

    La démo fonctionne pour toute image placée dans le dossier dessiné,

    Mais si vous souhaitez recadrer une image dynamique, par exemple, toute image téléchargée ou choisie dans la galerie, faites quelques modifications dans le code:

    Voir la ligne:

     Bitmap bitmapOrg = BitmapFactory.decodeResource( getResources(), R.drawable.sachin_tendulkar_10102013); 

    Ici, je prends l'image à partir du dossier dessiné, maintenant pour toute image téléchargée, il vous suffit d'enregistrer cette image dans la variable bitmapOrg, alors modifiez la ligne ci-dessus deux fois, une pour la partie 1 pour le rectangle et la partie 2 pour ciculart avec votre image téléchargée En sauvegardant bitmapOrg en tant que bitmap, et utilisez la démo, elle recadrera votre image de manière rectangulaire et circulaire.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.