Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MLKit Firebase android-如何将FirebaseVisionFace转换为图像对象(如位图)?_Android_Firebase_Android Camera_Firebase Mlkit - Fatal编程技术网

MLKit Firebase android-如何将FirebaseVisionFace转换为图像对象(如位图)?

MLKit Firebase android-如何将FirebaseVisionFace转换为图像对象(如位图)?,android,firebase,android-camera,firebase-mlkit,Android,Firebase,Android Camera,Firebase Mlkit,我已经将MLkit FaceDetection集成到我的android应用程序中。我已经参考了下面的网址 人脸检测处理器类的代码为 import java.io.IOException; import java.util.List; /** Face Detector Demo. */ public class FaceDetectionProcessor extends VisionProcessorBase<List<FirebaseVisionFace>> {

我已经将MLkit FaceDetection集成到我的android应用程序中。我已经参考了下面的网址

人脸检测处理器类的代码为

import java.io.IOException;
import java.util.List;

/** Face Detector Demo. */
public class FaceDetectionProcessor extends VisionProcessorBase<List<FirebaseVisionFace>> {

  private static final String TAG = "FaceDetectionProcessor";

  private final FirebaseVisionFaceDetector detector;

  public FaceDetectionProcessor() {

    FirebaseVisionFaceDetectorOptions options =
        new FirebaseVisionFaceDetectorOptions.Builder()
            .setClassificationType(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
            .setLandmarkType(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
            .setTrackingEnabled(true)
            .build();

    detector = FirebaseVision.getInstance().getVisionFaceDetector(options);
  }

  @Override
  public void stop() {
    try {
      detector.close();
    } catch (IOException e) {
      Log.e(TAG, "Exception thrown while trying to close Face Detector: " + e);
    }
  }

  @Override
  protected Task<List<FirebaseVisionFace>> detectInImage(FirebaseVisionImage image) {
    return detector.detectInImage(image);
  }

  @Override
  protected void onSuccess(
      @NonNull List<FirebaseVisionFace> faces,
      @NonNull FrameMetadata frameMetadata,
      @NonNull GraphicOverlay graphicOverlay) {
      graphicOverlay.clear();

    for (int i = 0; i < faces.size(); ++i) {
      FirebaseVisionFace face = faces.get(i);
      FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay);
      graphicOverlay.add(faceGraphic);
      faceGraphic.updateFace(face, frameMetadata.getCameraFacing());
    }




  }

  @Override
  protected void onFailure(@NonNull Exception e) {
    Log.e(TAG, "Face detection failed " + e);
  }
}
import java.io.IOException;
导入java.util.List;
/**人脸检测器演示*/
公共类FaceDetectionProcessor扩展了VisionProcessorBase{
私有静态最终字符串标记=“FaceDetectionProcessor”;
专用最终FirebaseVisionFaceDetector探测器;
PublicFaceDetectionProcessor(){
FireBaseVisionFaceDetector选项=
新的FirebaseVisionFaceDetectorOptions.Builder()
.setClassificationType(FirebaseVisionFaceDetectorOptions.ALL_分类)
.setLandmarkType(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
.SetTrackinEnabled(真)
.build();
检测器=FirebaseVision.getInstance().getVisionFaceDetector(选项);
}
@凌驾
公共停车场(){
试一试{
检测器。关闭();
}捕获(IOE异常){
Log.e(标记,“尝试关闭人脸检测器时引发异常:”+e);
}
}
@凌驾
受保护的任务检测图像(FirebaseVisionImage图像){
返回检测器。检测图像(图像);
}
@凌驾
成功时受保护的无效(
@非空列表面,
@非空FrameMetadata FrameMetadata,
@非空GraphicOverlay(图形叠加){
graphicsoverlay.clear();
对于(int i=0;i
在“onSuccess”侦听器中,我们将获得“FirebaseVisionFace”类对象的数组,这些对象将具有面的“边界框”

@覆盖
成功时受保护的无效(
@非空列表面,
@非空FrameMetadata FrameMetadata,
@非空GraphicOverlay(图形叠加){
graphicsoverlay.clear();
对于(int i=0;i
我想知道如何将此FirebaseVisionFace对象转换为位图。 我想提取人脸图像并在ImageView中显示它。谁能帮帮我吗。提前谢谢

注意:我已经从下面的URL下载了MLKit android的示例源代码


您从位图创建了
FirebaseVisionImage
。检测返回后,每个
FirebaseVisionFace
将边界框描述为
Rect
,可用于从原始位图提取检测到的人脸,例如,使用。

实际上,您只需读取
字节缓冲
,然后就可以使用
OutputStream
获取要写入对象文件的数组。当然,您也可以从
getBoundingBox()
获取它。

如果您试图使用ML工具包检测人脸,并使用OpenCV对检测到的人脸执行图像处理,这可能会对您有所帮助。注意:在这个特定的示例中,您需要在成功的
onSuccess
中使用原始摄影机位图

我还没有找到一种方法来做到这一点,没有位图和诚实地仍然在搜索

@覆盖
成功时受保护的空(@NonNull List faces、@NonNull FrameMetadata FrameMetadata、@NonNull graphicovery){
graphicsoverlay.clear();
对于(int i=0;i
由于接受的答案不够具体,我将尝试解释我做了什么

1.-在LivePreviewActivity上创建ImageView,如下所示:

private ImageView imageViewTest;
2.-在活动xml上创建它并将其链接到java文件。我把它放在示例代码之前,这样它就可以在摄影机提要的顶部看到

3.-当他们创建FaceDetectionProce时
private ImageView imageViewTest;
FaceDetectionProcessor processor = new FaceDetectionProcessor(imageViewTest);
public FaceDetectionProcessor(ImageView imageView) {
    FirebaseVisionFaceDetectorOptions options =
            new FirebaseVisionFaceDetectorOptions.Builder()
                    .setClassificationType(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
                    .setTrackingEnabled(true)
                    .build();

    detector = FirebaseVision.getInstance().getVisionFaceDetector(options);
    this.imageView  = imageView;
}
    public static Bitmap cropBitmap(Bitmap bitmap, Rect rect) {
    int w = rect.right - rect.left;
    int h = rect.bottom - rect.top;
    Bitmap ret = Bitmap.createBitmap(w, h, bitmap.getConfig());
    Canvas canvas = new Canvas(ret);
    canvas.drawBitmap(bitmap, -rect.left, -rect.top, null);
    return ret;
}
    @Override
protected Task<List<FirebaseVisionFace>> detectInImage(FirebaseVisionImage image) {
    imageBitmap = image.getBitmapForDebugging();
    return detector.detectInImage(image);
}
    @Override
protected void onSuccess(
        @NonNull List<FirebaseVisionFace> faces,
        @NonNull FrameMetadata frameMetadata,
        @NonNull GraphicOverlay graphicOverlay) {
    graphicOverlay.clear();
    for (int i = 0; i < faces.size(); ++i) {
        FirebaseVisionFace face = faces.get(i);
        FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay);
        graphicOverlay.add(faceGraphic);
        faceGraphic.updateFace(face, frameMetadata.getCameraFacing());
        croppedImage = cropBitmap(imageBitmap, face.getBoundingBox());
    }
    imageView.setImageBitmap(croppedImage);
}