/** * Creates and starts the camera. Note that this uses a higher resolution in comparison * to other detection examples to enable the barcode detector to detect small barcodes * at long distances. */ private void createCameraSource() { mCameraSource = open(); maxFace = mCameraSource.getParameters().getMaxNumDetectedFaces(); if (maxFace == 0) maxFace = 10; //mCameraSource.setFaceDetectionListener(this); previewSize = mCameraSource.getParameters().getPreviewSize(); bufflen = previewSize.width * previewSize.height; grayBuff = new byte[bufflen]; rgbs = new int[bufflen]; faces = new FaceResult[maxFace]; faces_previous = new FaceResult[maxFace]; for (int i = 0; i < maxFace; i++) { faces[i] = new FaceResult(); faces_previous[i] = new FaceResult(); } fdet = new android.media.FaceDetector(previewSize.width, previewSize.height, maxFace); mCameraSource.setPreviewCallback(this); }
@Override public void onStart() { super.onStart(); initView(); mFaces = new FaceResult[MAX_FACE_COUNT]; mPreviousFaces = new FaceResult[MAX_FACE_COUNT]; mDetectedFaces = new FaceDetector.Face[MAX_FACE_COUNT]; for (int i = 0; i < MAX_FACE_COUNT; i++) { mFaces[i] = new FaceResult(); mPreviousFaces[i] = new FaceResult(); } mFacesCountMap = new SparseIntArray(); presenter = new SignInPresenter(this,getContext()); presenter.start(); }
private static PointF findFaceMid(Bitmap in){ PointF mid = new PointF(); Bitmap bitmap565 = in.copy(Bitmap.Config.RGB_565, true); FaceDetector fd = new FaceDetector(in.getWidth(), in.getHeight(), 1); FaceDetector.Face[] faces = new FaceDetector.Face[1]; fd.findFaces(bitmap565, faces); FaceDetector.Face face = faces[0]; if (face != null){ try{ face.getMidPoint(mid); return mid; } catch (NullPointerException n){} } return null; }
private int detectFace() { Bitmap bitmap = mOriginal.copy(Bitmap.Config.RGB_565, true); FaceDetector.Face faces[] = new FaceDetector.Face[MAX_FACES]; FaceDetector detector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES); int count = detector.findFaces(bitmap, faces); if (count > 0) { FaceDetector.Face face = faces[0]; face.getMidPoint(mCenterPoint); mEyeDistance = face.eyesDistance(); } else { mCenterPoint.x = 0.0f; mCenterPoint.y = 0.0f; mEyeDistance = 0.0f; } bitmap.recycle(); return count; }
private int detectFace() { Bitmap bitmap = mOriginal.copy(Bitmap.Config.RGB_565, true); FaceDetector.Face faces[] = new FaceDetector.Face[MAX_FACES]; FaceDetector detector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES); int count = detector.findFaces(bitmap, faces); if (count > 0) { FaceDetector.Face face = faces[0]; face.getMidPoint(mCenterPoint); mEyeDistance = face.eyesDistance(); } else { mCenterPoint.x = 0.0f; mCenterPoint.y = 0.0f; mEyeDistance = 0.0f; } bitmap.recycle(); bitmap = null; return count; }
@Override public List<Rect> findFaces(Bitmap img) { if(img.getWidth()!=width || img.getHeight()!=height) { width = img.getWidth(); height = img.getHeight(); Log.v("SkinFaceDetector", String.format("Changing face detector resolution to %dx%d", width, height)); myFaceDetect = new FaceDetector(width, height, NUMBER_OF_FACES); } faces.clear(); time = System.currentTimeMillis(); int n = myFaceDetect.findFaces(img, myFace); time = System.currentTimeMillis() - time; for (int i = 0; i < n; i++) { Rect r = face2Rect(myFace[i], img.getWidth(), img.getHeight()); faces.add(r); } return faces; }
@Nullable private static PointF detectFace(@NonNull Bitmap testBitmap) { final int maxFaces = 1; long millis = System.currentTimeMillis(); // initialize the face detector, and look for only one face... FaceDetector fd = new FaceDetector(testBitmap.getWidth(), testBitmap.getHeight(), maxFaces); FaceDetector.Face[] faces = new FaceDetector.Face[maxFaces]; int numFound = fd.findFaces(testBitmap, faces); PointF facePos = null; if (numFound > 0) { facePos = new PointF(); faces[0].getMidPoint(facePos); // center on the nose, not on the eyes facePos.y += faces[0].eyesDistance() / 2; // normalize the position to [0, 1] facePos.set(MathUtil.constrain(facePos.x / testBitmap.getWidth(), 0, 1), MathUtil.constrain(facePos.y / testBitmap.getHeight(), 0, 1)); L.d("Found face at " + facePos.x + ", " + facePos.y); } L.d("Face detection took " + (System.currentTimeMillis() - millis) + "ms"); return facePos; }
List<FaceDetector.Face> getFaces(UQI uqi) { int max = 10; List<FaceDetector.Face> faces = new ArrayList<>(); Bitmap bitmap = this.getBitmapRGB565(uqi); if (bitmap == null) return faces; FaceDetector detector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), max); FaceDetector.Face[] facesArray = new FaceDetector.Face[max]; int count = detector.findFaces(bitmap, facesArray); for (int i = 0; i < count; i++) { FaceDetector.Face face = facesArray[i]; if (face != null && face.confidence() > 0.3) faces.add(face); } return faces; }
/** * 计算识别框 */ private void getFaceRect() { Rect[] faceRectList = new Rect[mDetectorData.getFacesCount()]; Rect rect = null; float distance = 0; for (int i = 0; i < mDetectorData.getFacesCount(); i++) { faceRectList[i] = new Rect(); FaceDetector.Face face = mFaces[i]; if (face != null) { float eyeDistance = face.eyesDistance(); eyeDistance = eyeDistance * mZoomRatio; if (eyeDistance > distance) { distance = eyeDistance; rect = faceRectList[i]; } PointF midEyesPoint = new PointF(); face.getMidPoint(midEyesPoint); midEyesPoint.x = midEyesPoint.x * mZoomRatio; midEyesPoint.y = midEyesPoint.y * mZoomRatio; ViseLog.i("eyeDistance:" + eyeDistance + ",midEyesPoint.x:" + midEyesPoint.x + ",midEyesPoint.y:" + midEyesPoint.y); faceRectList[i].set((int) (midEyesPoint.x - eyeDistance), (int) (midEyesPoint.y - eyeDistance), (int) (midEyesPoint.x + eyeDistance), (int) (midEyesPoint.y + eyeDistance)); ViseLog.i("FaceRectList[" + i + "]:" + faceRectList[i]); } } mDetectorData.setLightIntensity(FaceUtil.getYUVLight(mDetectorData.getFaceData(), rect, mCameraWidth)); mDetectorData.setFaceRectList(faceRectList); if (mCameraWidth > 0) { mDetectorData.setDistance(distance * 2 / mCameraWidth); } }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { MagicToast.showInfo(CropImage.this, "Multi face crop help"); } } }); }
@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; }
public CommentaryFragment() { faces = new FaceResult[MAX_FACE_COUNT]; previousFaces = new FaceResult[MAX_FACE_COUNT]; detectedFaces = new FaceDetector.Face[MAX_FACE_COUNT]; for (int i = 0; i < MAX_FACE_COUNT; i++) { faces[i] = new FaceResult(); previousFaces[i] = new FaceResult(); } recyclerViewBitmapList = new ArrayList<>(); facesCountMap = new SparseIntArray(); }
@Override public void onStart() { super.onStart(); mFaces = new FaceResult[MAX_FACE_COUNT]; mPreviousFaces = new FaceResult[MAX_FACE_COUNT]; mDetectedFaces = new FaceDetector.Face[MAX_FACE_COUNT]; for (int i = 0; i < MAX_FACE_COUNT; i++) { mFaces[i] = new FaceResult(); mPreviousFaces[i] = new FaceResult(); } mFacesCountMap = new SparseIntArray(); }
@Override @Nullable public PointF performTask() { // boost this thread's priority a bit Thread.currentThread().setPriority(Thread.MAX_PRIORITY - 1); long millis = System.currentTimeMillis(); // create a new bitmap onto which we'll draw the original bitmap, // because the FaceDetector requires it to be a 565 bitmap, and it // must also be even width. Reduce size of copy for performance. Bitmap testBmp = new565ScaledBitmap(srcBitmap); // initialize the face detector, and look for only one face... FaceDetector fd = new FaceDetector(testBmp.getWidth(), testBmp.getHeight(), 1); FaceDetector.Face[] faces = new FaceDetector.Face[1]; int numFound = fd.findFaces(testBmp, faces); PointF facePos = null; if (numFound > 0) { facePos = new PointF(); faces[0].getMidPoint(facePos); // scale back to proportions of original image facePos.x = (facePos.x * srcBitmap.getWidth() / BITMAP_COPY_WIDTH); facePos.y = (facePos.y * srcBitmap.getHeight() / testBmp.getHeight()); L.d("Found face at " + facePos.x + ", " + facePos.y); } // free our temporary bitmap testBmp.recycle(); L.d("Face detection took " + (System.currentTimeMillis() - millis) + "ms"); return facePos; }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { Crouton.makeText(CropImage.this, "Multi face crop help", Style.INFO).show(); } } }); }
private void handleFace(FaceDetector.Face f) { PointF midPoint = new PointF(); int r = ((int) (f.eyesDistance() * mScale)) * 2; f.getMidPoint(midPoint); midPoint.x *= mScale; midPoint.y *= mScale; int midX = (int) midPoint.x; int midY = (int) midPoint.y; HighlightView hv = new HighlightView(mImageView); int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); Rect imageRect = new Rect(0, 0, width, height); RectF faceRect = new RectF(midX, midY, midX, midY); faceRect.inset(-r, -r); if (faceRect.left < 0) { faceRect.inset(-faceRect.left, -faceRect.left); } if (faceRect.top < 0) { faceRect.inset(-faceRect.top, -faceRect.top); } if (faceRect.right > imageRect.right) { faceRect.inset(faceRect.right - imageRect.right, faceRect.right - imageRect.right); } if (faceRect.bottom > imageRect.bottom) { faceRect.inset(faceRect.bottom - imageRect.bottom, faceRect.bottom - imageRect.bottom); } hv.setup(mImageMatrix, imageRect, faceRect, mCircleCrop, mAspectX != 0 && mAspectY != 0); mImageView.add(hv); }
@Override public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { @Override public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } } }); }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } } }); }
public void setFaces(PreProcessorFactory.PreprocessingMode preprocessingMode) { List<Mat> images = getImages(); PreferencesHelper preferencesHelper = new PreferencesHelper(context); if (preferencesHelper.getDetectionMethod()){ faces = faceDetection.getFaces(images.get(0)); angle = faceDetection.getAngle(); } else { Mat img = images.get(0); FaceDetector faceDetector = new FaceDetector(img.cols(), img.rows(), 1); Bitmap bmp = Bitmap.createBitmap(img.cols(), img.rows(), Bitmap.Config.RGB_565); Utils.matToBitmap(img, bmp); FaceDetector.Face[] facesAndroid = new FaceDetector.Face[1]; if (faceDetector.findFaces(bmp, facesAndroid) > 0){ faces = new Rect[facesAndroid.length]; for (int i=0; i<facesAndroid.length; i++){ PointF pointF = new PointF(); facesAndroid[i].getMidPoint(pointF); int xWidth = (int) (1.34 * facesAndroid[i].eyesDistance()); int yWidth = (int) (1.12 * facesAndroid[i].eyesDistance()); int dist = (int) (2.77 * facesAndroid[i].eyesDistance()); Rect face = new Rect((int) pointF.x - xWidth, (int) pointF.y - yWidth, dist, dist); faces[i] = face; } } } if (preprocessingMode == PreProcessorFactory.PreprocessingMode.RECOGNITION && preferencesHelper.getDetectionMethod()){ // Change the image rotation to the angle where the face was detected images.remove(0); images.add(faceDetection.getImg()); setImages(images); } }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { Toast t = Toast.makeText(CropImage.this, R.string.multiface_crop_help, Toast.LENGTH_SHORT); t.show(); } } }); }
private void handleFace(FaceDetector.Face f) { PointF midPoint = new PointF(); int r = ((int) (f.eyesDistance() * mScale)) * 2; f.getMidPoint(midPoint); midPoint.x *= mScale; midPoint.y *= mScale; int midX = (int) midPoint.x; int midY = (int) midPoint.y; HighlightView hv = new HighlightView(mImageView); int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); Rect imageRect = new Rect(0, 0, width, height); RectF faceRect = new RectF(midX, midY, midX, midY); faceRect.inset(-r, -r); if (faceRect.left < 0) { faceRect.inset(-faceRect.left, -faceRect.left); } if (faceRect.top < 0) { faceRect.inset(-faceRect.top, -faceRect.top); } if (faceRect.right > imageRect.right) { faceRect.inset(faceRect.right - imageRect.right, faceRect.right - imageRect.right); } if (faceRect.bottom > imageRect.bottom) { faceRect.inset(faceRect.bottom - imageRect.bottom, faceRect.bottom - imageRect.bottom); } hv.setup(mImageMatrix, imageRect, faceRect, false, true); mImageView.add(hv); }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; makeDefault(); mImageView.invalidate(); if (mImageView.mHighlightViews.size() > 0) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { } } }); }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { makeDefault(); mImageView.invalidate(); if (mImageView.getHighlightViews().size() == 1) { setCrop(mImageView.getHighlightViews().get(0)); getCrop().setFocus(true); } if (mNumFaces > 1) { Toast t = Toast.makeText(CropImage.this, "Multi face crop help", Toast.LENGTH_SHORT); t.show(); } } }); }
private void updateMeasurement(final FaceDetector.Face currentFace) { if (currentFace == null) { // _facesFoundInMeasurement--; return; } _foundFace = _currentFaceDetectionThread.getCurrentFace(); _points.add(new Point(_foundFace.eyesDistance(), CALIBRATION_DISTANCE_A4_MM * (_distanceAtCalibrationPoint / _foundFace .eyesDistance()))); while (_points.size() > _threashold) { _points.remove(0); } float sum = 0; for (Point p : _points) { sum += p.getEyeDistance(); } _currentAvgEyeDistance = sum / _points.size(); _currentDistanceToFace = CALIBRATION_DISTANCE_A4_MM * (_distanceAtCalibrationPoint / _currentAvgEyeDistance); _currentDistanceToFace = Util.MM_TO_CM(_currentDistanceToFace); MeasurementStepMessage message = new MeasurementStepMessage(); message.setConfidence(currentFace.confidence()); message.setCurrentAvgEyeDistance(_currentAvgEyeDistance); message.setDistToFace(_currentDistanceToFace); message.setEyesDistance(currentFace.eyesDistance()); message.setMeasurementsLeft(_calibrationsLeft); message.setProcessTimeForLastFrame(_processTimeForLastFrame); MessageHUB.get().sendMessage(MessageHUB.MEASUREMENT_STEP, message); }
public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.getHighlightViews().size() == 1) { mCrop = mImageView.getHighlightViews().get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { // CR: no need for the variable t. just do // Toast.makeText(...).show(). Toast t = Toast.makeText(CropImageActivity.this, "Choose One", Toast.LENGTH_SHORT); t.show(); } } }); }
/** * Creates an instance of {@link SkinFaceDetector}. */ public SkinFaceDetector(){ width = 640; height = 480; myFace = new FaceDetector.Face [NUMBER_OF_FACES];//acha ateh 4 faces numa imagem myFaceDetect = new FaceDetector(width, height, NUMBER_OF_FACES); faces = new LinkedList<Rect>(); p = new PointF(); time = 0; }
public void run() { Bitmap bitmap = getBitmap(); float aspect = (float) previewSize.height / (float) previewSize.width; int w = imageWidth; int h = (int) (imageWidth * aspect); float xScale = (float) previewSize.width / (float) w; float yScale = (float) previewSize.height / (float) h; Bitmap bmp = Bitmap.createScaledBitmap(bitmap, w, h, false); int rotate = mDisplayOrientation; if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && mDisplayRotation % 180 == 0) { if (rotate + 180 > 360) { rotate = rotate - 180; } else rotate = rotate + 180; } switch (rotate) { case 90: bmp = ImageUtils.rotate(bmp, 90); xScale = (float) previewSize.height / bmp.getWidth(); yScale = (float) previewSize.width / bmp.getHeight(); break; case 180: bmp = ImageUtils.rotate(bmp, 180); break; case 270: bmp = ImageUtils.rotate(bmp, 270); xScale = (float) previewSize.height / (float) h; yScale = (float) previewSize.width / (float) imageWidth; break; } fdet = new android.media.FaceDetector(bmp.getWidth(), bmp.getHeight(), maxFace); android.media.FaceDetector.Face[] fullResults = new android.media.FaceDetector.Face[maxFace]; int findCount = fdet.findFaces(bmp, fullResults); for (int i = 0; i < maxFace; i++) { processFace(bitmap, xScale, yScale, rotate, fullResults[i], i); } isThreadWorking = false; }
@Override public void run() { mImageMatrix = mImageView.getImageMatrix(); Bitmap faceBitmap = prepareBitmap(); mScale = 1.0F / mScale; if (faceBitmap != null && mDoFaceDetection) { FaceDetector detector = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), mFaces.length); mNumFaces = detector.findFaces(faceBitmap, mFaces); } if (faceBitmap != null && faceBitmap != mBitmap) { faceBitmap.recycle(); } mHandler.post(new Runnable() { @Override public void run() { mWaitingToPick = mNumFaces > 1; if (mNumFaces > 0) { for (int i = 0; i < mNumFaces; i++) { handleFace(mFaces[i]); } } else { makeDefault(); } mImageView.invalidate(); if (mImageView.mHighlightViews.size() == 1) { mCrop = mImageView.mHighlightViews.get(0); mCrop.setFocus(true); } if (mNumFaces > 1) { Toast t = Toast.makeText(CropImageActivity.this, "Multi face crop help", Toast.LENGTH_SHORT); t.show(); } } }); }