Android 系统FaceDetector人脸识别检测,圆形相机预览框,截取图片中的人脸图片(宽高自定义),圆形图片显示。

本内容主要实现了以下功能:

  • 圆形相机预览框
  • FaceDetector人脸识别检测
  • 截取图片中的人脸图片(宽高自定义)
  • 圆形图片显示

效果图:

以下只说了大致的实现思路和核心入口代码,详情见demo(文末奉上)

1、圆形相机预览

自定义CircleCameraLayout类,自定义一个轮廓提供者裁剪一个圆形,在定义一个相机预览CameraPreview,然后把CameraPreview到CircleCameraLayout中。

2、FaceDetector人脸识别检测

通过实现Camera.PreviewCallback的方法拿到bytes数组,转为RGB_565的bitmap,然后对bitmap进行检测,代码如下
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
    Log.d(TAG, "onPreviewFrame:" + camera);
    if (System.currentTimeMillis() - lastModirTime <= 200 || bytes == null || bytes.length == 0) {
        return;
    }
    face(bytes, camera);
    lastModirTime = System.currentTimeMillis();
}
private void face(byte[] bytes, Camera camera) {
    Camera.Size size = camera.getParameters().getPreviewSize();
    YuvImage image = new YuvImage(bytes, ImageFormat.NV21, size.width, size.height, null);
    if (image != null) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
        Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
        Matrix matrix = new Matrix();
        matrix.reset();
        matrix.setRotate(-90);
        bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
        Bitmap bitmap = bmp.copy(Bitmap.Config.RGB_565, true);
      //开始检测 当faces 说明检测到人脸了。
        FaceDetector faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 1);
        FaceDetector.Face[] face = new FaceDetector.Face[1];
        int faces = faceDetector.findFaces(bitmap, face);
        if (faces > 0) {
            Log.d(TAG, "onPreviewFrame检测到人脸");
        }
        try {
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3、截取图片中的人脸图片

我们可以通过FaceHelper类对检测到有人脸的bitmap进行人脸截取就能拿到位于人脸区域的图片。

Bitmap faceBitmap = FaceHelper.genFaceBitmap(bitmap);//得到截取后的bitmap

在FaceHelper类中的genFaceBitmap方法中的最后几行中的下面这行的代码进行宽高截取,我这里写的是宽为480,高自适应。

final Bitmap result = Bitmap.createBitmap(cacheBitmap, startX, startY, 480, height);

4、圆形图片显示

主要是通过自定义CircleImageView得到了一个圆形的imageview。

最后记得添加相机聚焦等相关权限。

本文demo:

https://download.csdn.net/download/m13984458297/11351147

发布了21 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m13984458297/article/details/95945534
今日推荐