MLKit Firebase android-如何将FirebaseVisionFace转换为图像对象(如位图)?
我已经将MLkit FaceDetection集成到我的android应用程序中。我已经参考了下面的网址 人脸检测处理器类的代码为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>> {
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);
}