人脸检测并使用边界框提取人脸并创建新的位图

Face Detection and extracting the faces using Bounding Box and creating a new Bitmap

如何使用 Rect rect = face.getBoundingBox() 数据从位图中裁剪出检测到的人脸并将其另存为新位图。我尝试使用 rect.left 等构建位图,并在 imageview 中简单地显示提取的人脸。但它似乎不起作用。

另外,是否可以直接访问人脸? 如果我理解正确,检测器会创建一个 FirebaseVisionFace 列表,这些列表是什么? 它如何列出一张脸? 是否可以访问它们?

private void processFaceDetection(final Bitmap bitmap) {
        FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromBitmap(bitmap);  //firebaseVisionImage is an object created from bitmap firebase uses to detect faces

        FirebaseVisionFaceDetectorOptions firebaseVisionFaceDetectorOptions  = new FirebaseVisionFaceDetectorOptions.Builder().build();

        FirebaseVisionFaceDetector firebaseVisionFaceDetector = FirebaseVision.getInstance().getVisionFaceDetector(firebaseVisionFaceDetectorOptions);

        firebaseVisionFaceDetector.detectInImage(firebaseVisionImage).addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionFace>>() {
            @Override
            public void onSuccess(List<FirebaseVisionFace> firebaseVisionFaces) {
                int counter = 0;

                for (FirebaseVisionFace face : firebaseVisionFaces) {
                    Rect rect = face.getBoundingBox();
                    RectOverlay rectOverlay = new RectOverlay(graphicOverlay, rect);
                    graphicOverlay.add(rectOverlay);
                    Bitmap faceSaved = Bitmap.createBitmap(Math.round(Math.abs(rect.left - rect.right)), Math.round(Math.abs(rect.top - rect.bottom)), Bitmap.Config.ALPHA_8);
                    imageview.setImageBitmap(facesaved);
                    imageview.setVisibility(View.VISIBLE);
                    counter++;

                }

答案: 要使用可以使用 rect.toShortString() 收集的矩形数据,会为左、上、右、下生成 4 个值。即 [280,495][796,1011]。这些由 FirebaseVisionFaceDetector 创建,并存储在每个检测到的人脸的列表 (List) 中。

保存不同矩形(面)中包含的位图数据

for (FirebaseVisionFace face : firebaseVisionFaces) {
Rect rect = face.getBoundingBox();

Bitmap original = Bitmap.createScaledBitmap(capturedImage, cameraView.getWidth(), cameraView.getHeight(), false); //scaled bitmap created from captured image

Bitmap faceCrop = Bitmap.createBitmap(original, rect.left, rect.top, rect.width(), rect.height()); //face cropped using rect values

faceCrop 包含矩形参数中包含的仅面部位图数据。

希望这对您有所帮助....