Here are the examples of the java api class android.media.FaceDetector taken from open source projects.
1. FaceAndColorDetectImageView#detectFace()
Project: apps-android-wikipedia
File: FaceAndColorDetectImageView.java
File: FaceAndColorDetectImageView.java
@Nullable private PointF detectFace(Bitmap testBitmap) { long millis = System.currentTimeMillis(); // initialize the face detector, and look for only one face... FaceDetector fd = new FaceDetector(testBitmap.getWidth(), testBitmap.getHeight(), 1); FaceDetector.Face[] faces = new FaceDetector.Face[1]; int numFound = fd.findFaces(testBitmap, faces); PointF facePos = null; if (numFound > 0) { facePos = new PointF(); faces[0].getMidPoint(facePos); // normalize the position to [0, 1] facePos.x /= testBitmap.getWidth(); facePos.y /= testBitmap.getHeight(); L.d("Found face at " + facePos.x + ", " + facePos.y); } L.d("Face detection took " + (System.currentTimeMillis() - millis) + "ms"); return facePos; }
2. FaceCropper#cropFace()
Project: UltimateAndroid
File: FaceCropper.java
File: FaceCropper.java
public Bitmap cropFace(Bitmap original) { Bitmap fixedBitmap = BitmapUtils.forceEvenBitmapSize(original); fixedBitmap = BitmapUtils.forceConfig565(fixedBitmap); FaceDetector faceDetector = new FaceDetector(fixedBitmap.getWidth(), fixedBitmap.getHeight(), mMaxFaces); FaceDetector.Face[] faces = new FaceDetector.Face[mMaxFaces]; // The bitmap must be in 565 format (for now). int faceCount = faceDetector.findFaces(fixedBitmap, faces); Logs.d("face crop"); if (faceCount == 0) { return fixedBitmap; } int initX = fixedBitmap.getWidth(); int initY = fixedBitmap.getHeight(); int endX = 0; int endY = 0; PointF centerFace = new PointF(); // Calculates minimum box to fit all detected faces for (int i = 0; i < faceCount; i++) { FaceDetector.Face face = faces[i]; // Eyes distance * 3 usually fits an entire face int faceSize = (int) (face.eyesDistance() * 3); if (SizeMode.FaceMarginPx.equals(mSizeMode)) { // *2 for top and down/right and left effect faceSize += mFaceMarginPx * 2; } else if (SizeMode.EyeDistanceFactorMargin.equals(mSizeMode)) { faceSize += face.eyesDistance() * mEyeDistanceFactorMargin; } faceSize = Math.max(faceSize, mFaceMinSize); face.getMidPoint(centerFace); int tInitX = (int) (centerFace.x - faceSize / 2); int tInitY = (int) (centerFace.y - faceSize / 2); tInitX = Math.max(0, tInitX); tInitY = Math.max(0, tInitY); int tEndX = tInitX + faceSize; int tEndY = tInitY + faceSize; tEndX = Math.min(tEndX, fixedBitmap.getWidth()); tEndY = Math.min(tEndY, fixedBitmap.getHeight()); initX = Math.min(initX, tInitX); initY = Math.min(initY, tInitY); endX = Math.max(endX, tEndX); endY = Math.max(endY, tEndY); } int sizeX = endX - initX; int sizeY = endY - initY; if (sizeX + initX > fixedBitmap.getWidth()) { sizeX = fixedBitmap.getWidth() - initX; } if (sizeY + initY > fixedBitmap.getHeight()) { sizeY = fixedBitmap.getHeight() - initY; } Bitmap croppedBitmap = Bitmap.createBitmap(fixedBitmap, initX, initY, sizeX, sizeY); if (fixedBitmap != croppedBitmap) { fixedBitmap.recycle(); } return croppedBitmap; }
3. FaceCropper#cropFace()
Project: UltimateAndroid
File: FaceCropper.java
File: FaceCropper.java
public Bitmap cropFace(Bitmap original) { Bitmap fixedBitmap = BitmapUtils.forceEvenBitmapSize(original); fixedBitmap = BitmapUtils.forceConfig565(fixedBitmap); FaceDetector faceDetector = new FaceDetector(fixedBitmap.getWidth(), fixedBitmap.getHeight(), mMaxFaces); FaceDetector.Face[] faces = new FaceDetector.Face[mMaxFaces]; // The bitmap must be in 565 format (for now). int faceCount = faceDetector.findFaces(fixedBitmap, faces); Logs.d("face crop"); if (faceCount == 0) { return fixedBitmap; } int initX = fixedBitmap.getWidth(); int initY = fixedBitmap.getHeight(); int endX = 0; int endY = 0; PointF centerFace = new PointF(); // Calculates minimum box to fit all detected faces for (int i = 0; i < faceCount; i++) { FaceDetector.Face face = faces[i]; // Eyes distance * 3 usually fits an entire face int faceSize = (int) (face.eyesDistance() * 3); if (SizeMode.FaceMarginPx.equals(mSizeMode)) { // *2 for top and down/right and left effect faceSize += mFaceMarginPx * 2; } else if (SizeMode.EyeDistanceFactorMargin.equals(mSizeMode)) { faceSize += face.eyesDistance() * mEyeDistanceFactorMargin; } faceSize = Math.max(faceSize, mFaceMinSize); face.getMidPoint(centerFace); int tInitX = (int) (centerFace.x - faceSize / 2); int tInitY = (int) (centerFace.y - faceSize / 2); tInitX = Math.max(0, tInitX); tInitY = Math.max(0, tInitY); int tEndX = tInitX + faceSize; int tEndY = tInitY + faceSize; tEndX = Math.min(tEndX, fixedBitmap.getWidth()); tEndY = Math.min(tEndY, fixedBitmap.getHeight()); initX = Math.min(initX, tInitX); initY = Math.min(initY, tInitY); endX = Math.max(endX, tEndX); endY = Math.max(endY, tEndY); } int sizeX = endX - initX; int sizeY = endY - initY; if (sizeX + initX > fixedBitmap.getWidth()) { sizeX = fixedBitmap.getWidth() - initX; } if (sizeY + initY > fixedBitmap.getHeight()) { sizeY = fixedBitmap.getHeight() - initY; } Bitmap croppedBitmap = Bitmap.createBitmap(fixedBitmap, initX, initY, sizeX, sizeY); if (fixedBitmap != croppedBitmap) { fixedBitmap.recycle(); } return croppedBitmap; }
4. PUtil#detectFaces()
Project: Protocoder
File: PUtil.java
File: PUtil.java
@ProtoMethod(description = "Detect faces in a bitmap", example = "") @ProtoMethodParam(params = { "Bitmap", "numFaces" }) public int detectFaces(Bitmap bmp, int num_faces) { FaceDetector face_detector = new FaceDetector(bmp.getWidth(), bmp.getHeight(), num_faces); FaceDetector.Face[] faces = new FaceDetector.Face[num_faces]; int face_count = face_detector.findFaces(bmp, faces); return face_count; }
5. FaceCropper#cropFace()
Project: FaceRecognition
File: FaceCropper.java
File: FaceCropper.java
/** * ????????? * * @param bitmap * ?????? * @param debug * ???????? * @return */ private FaceResult cropFace(Bitmap bitmap, boolean debug) { Bitmap formatBitmap = BitmapOperate.formatBitmap(bitmap); formatBitmap = BitmapOperate.formatBitmapTo565(formatBitmap); Bitmap aimBitmap = formatBitmap.copy(Bitmap.Config.RGB_565, true); if (formatBitmap != aimBitmap) { formatBitmap.recycle(); } // ????????? FaceDetector faceDetector = new FaceDetector(aimBitmap.getWidth(), aimBitmap.getHeight(), mMaxFaces); // ???? FaceDetector.Face[] faces = new FaceDetector.Face[mMaxFaces]; // Bitmap???565?? int faceCount = faceDetector.findFaces(aimBitmap, faces); if (debug) { Log.d("kymjs", faceCount + "?????"); } if (faceCount == 0) { return new FaceResult(aimBitmap); } int initX = aimBitmap.getWidth(); int initY = aimBitmap.getHeight(); int endX = 0; int endY = 0; PointF centerFace = new PointF(); Canvas canvas = new Canvas(aimBitmap); canvas.drawBitmap(aimBitmap, new Matrix(), null); // ??????????? for (int i = 0; i < faceCount; i++) { FaceDetector.Face face = faces[i]; // ???????????????????? int faceSize = (int) (face.eyesDistance() * 3); if (SizeMode.FACE_MARGIN.equals(mSizeMode)) { faceSize += mFaceMarginPx * 2; } else if (SizeMode.EYE_MARGIN.equals(mSizeMode)) { faceSize += face.eyesDistance() * mEyeMarginPx; } faceSize = Math.max(faceSize, mFaceMinSize); face.getMidPoint(centerFace); if (debug) { // ????????? canvas.drawPoint(centerFace.x, centerFace.y, mDebugPainter); canvas.drawCircle(centerFace.x, centerFace.y, face.eyesDistance() * 1.5f, mDebugPainter); } int tInitX = (int) (centerFace.x - faceSize / 2); int tInitY = (int) (centerFace.y - faceSize / 2); tInitX = Math.max(0, tInitX); tInitY = Math.max(0, tInitY); int tEndX = tInitX + faceSize; int tEndY = tInitY + faceSize; tEndX = Math.min(tEndX, aimBitmap.getWidth()); tEndY = Math.min(tEndY, aimBitmap.getHeight()); initX = Math.min(initX, tInitX); initY = Math.min(initY, tInitY); endX = Math.max(endX, tEndX); endY = Math.max(endY, tEndY); } int sizeX = endX - initX; int sizeY = endY - initY; if (sizeX + initX > aimBitmap.getWidth()) { sizeX = aimBitmap.getWidth() - initX; } if (sizeY + initY > aimBitmap.getHeight()) { sizeY = aimBitmap.getHeight() - initY; } Point init = new Point(initX, initY); Point end = new Point(initX + sizeX, initY + sizeY); return new FaceResult(aimBitmap, init, end); }
6. FaceCropper#cropFace()
Project: AndroidFaceCropper
File: FaceCropper.java
File: FaceCropper.java
protected CropResult cropFace(Bitmap original, boolean debug) { Bitmap fixedBitmap = BitmapUtils.forceEvenBitmapSize(original); fixedBitmap = BitmapUtils.forceConfig565(fixedBitmap); Bitmap mutableBitmap = fixedBitmap.copy(Bitmap.Config.RGB_565, true); if (fixedBitmap != mutableBitmap) { fixedBitmap.recycle(); } FaceDetector faceDetector = new FaceDetector(mutableBitmap.getWidth(), mutableBitmap.getHeight(), mMaxFaces); FaceDetector.Face[] faces = new FaceDetector.Face[mMaxFaces]; // The bitmap must be in 565 format (for now). int faceCount = faceDetector.findFaces(mutableBitmap, faces); if (BuildConfig.DEBUG) { Log.d(LOG_TAG, faceCount + " faces found"); } if (faceCount == 0) { return new CropResult(mutableBitmap); } int initX = mutableBitmap.getWidth(); int initY = mutableBitmap.getHeight(); int endX = 0; int endY = 0; PointF centerFace = new PointF(); Canvas canvas = new Canvas(mutableBitmap); canvas.drawBitmap(mutableBitmap, new Matrix(), null); // Calculates minimum box to fit all detected faces for (int i = 0; i < faceCount; i++) { FaceDetector.Face face = faces[i]; // Eyes distance * 3 usually fits an entire face int faceSize = (int) (face.eyesDistance() * 3); if (SizeMode.FaceMarginPx.equals(mSizeMode)) { // *2 for top and down/right and left effect faceSize += mFaceMarginPx * 2; } else if (SizeMode.EyeDistanceFactorMargin.equals(mSizeMode)) { faceSize += face.eyesDistance() * mEyeDistanceFactorMargin; } faceSize = Math.max(faceSize, mFaceMinSize); face.getMidPoint(centerFace); if (debug) { canvas.drawPoint(centerFace.x, centerFace.y, mDebugPainter); canvas.drawCircle(centerFace.x, centerFace.y, face.eyesDistance() * 1.5f, mDebugPainter); } int tInitX = (int) (centerFace.x - faceSize / 2); int tInitY = (int) (centerFace.y - faceSize / 2); tInitX = Math.max(0, tInitX); tInitY = Math.max(0, tInitY); int tEndX = tInitX + faceSize; int tEndY = tInitY + faceSize; tEndX = Math.min(tEndX, mutableBitmap.getWidth()); tEndY = Math.min(tEndY, mutableBitmap.getHeight()); initX = Math.min(initX, tInitX); initY = Math.min(initY, tInitY); endX = Math.max(endX, tEndX); endY = Math.max(endY, tEndY); } int sizeX = endX - initX; int sizeY = endY - initY; if (sizeX + initX > mutableBitmap.getWidth()) { sizeX = mutableBitmap.getWidth() - initX; } if (sizeY + initY > mutableBitmap.getHeight()) { sizeY = mutableBitmap.getHeight() - initY; } Point init = new Point(initX, initY); Point end = new Point(initX + sizeX, initY + sizeY); return new CropResult(mutableBitmap, init, end); }