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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Android提供了FaceDetector类用于人脸检测,但是它并不支持圆形检测。如果需要实现圆形检测,可以通过以下步骤实现: 1. 使用FaceDetector检测人脸并获取人脸矩形的位置信息。 2. 根据人脸矩形的位置信息计算出圆心坐标和半径大小。 3. 使用Canvas绘制一个圆形,并设置画笔的颜色和宽度。 4. 在圆形上绘制一个透明的矩形,使得圆形间部分变成透明。 5. 最后绘制人脸矩形,使得圆形人脸。 以下是一个示例代码: ```java // 创建FaceDetector对象 FaceDetector detector = new FaceDetector.Builder(context) .setTrackingEnabled(false) .setLandmarkType(FaceDetector.ALL_LANDMARKS) .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) .build(); // 获取Bitmap对象 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face); // 创建Canvas对象 Canvas canvas = new Canvas(bitmap); // 检测人脸 Frame frame = new Frame.Builder().setBitmap(bitmap).build(); SparseArray<Face> faces = detector.detect(frame); // 绘制圆形 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); for (int i = 0; i < faces.size(); i++) { Face face = faces.valueAt(i); // 计算圆心坐标和半径大小 PointF center = new PointF(face.getPosition().x + face.getWidth() / 2, face.getPosition().y + face.getHeight() / 2); float radius = Math.min(face.getWidth(), face.getHeight()) / 2; // 绘制圆形 canvas.drawCircle(center.x, center.y, radius, paint); // 绘制透明矩形 paint.setStyle(Paint.Style.FILL); paint.setColor(Color.TRANSPARENT); canvas.drawRect(center.x - radius, center.y - radius, center.x + radius, center.y + radius, paint); // 绘制人脸矩形 paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(3); canvas.drawRect(face.getPosition().x, face.getPosition().y, face.getPosition().x + face.getWidth(), face.getPosition().y + face.getHeight(), paint); } // 显示Bitmap图像 imageView.setImageBitmap(bitmap); ``` 这样就可以实现一个圆形人脸检测了。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值