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

标签 java bitmap firebase-mlkit rect

如何使用 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 包含矩形参数中包含的仅面部位图数据。

希望这有帮助......

关于java - 人脸检测并使用边界框提取人脸并创建新的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62138987/

相关文章:

android - 访问被拒绝查找属性 "vendor.camera.aux.packagelist"

machine-learning - 有没有办法在网络浏览器中获取 ML Kit 的功能?

android - 使用前置摄像头录制视频时分别获取视频和音频缓冲区

java - 从 springBoot 应用程序中的子模块扫描包

java - java中封装的清晰性

python - 如何在 Python 中使用位图 header ?

android - 在 Android 上保存自定义 View 的屏幕截图

ios - 如何将 UIImage 与位图 int 数组 (rgb565) 相互转换

java - 如何让 Appium 和应用程序在每次测试之前自动启动 iOS 的 Java 和高跟鞋类?

Java ArrayBlockingQueue 取源码