如何使用 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/