Android 人脸识别开源框架 Fotoapparat —— FaceDetector的总结

本文详细介绍了Android人脸识别框架Fotoapparat的使用,从如何创建和配置FaceDetector,到FaceDetectorProcessor的工作原理,展示了如何通过FaceDetectorProcessor自定义人脸识别逻辑,并结合业务需求调用自己的算法库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        简单的集成可以参照:https://github.com/RedApparat/FaceDetector,基本的使用和介绍已经很易懂了。下面是整理的更为全面一些的学习总结。

    下载github的源码之后,要到Example文件夹中去运行Demo项目,而不是-master那个层级的项目,如下图所示:

                                    

          

         打开项目之后可以看到demo很简单,只有两个类:MainActivity和PermissionsDelegate这个运行时权限委托类,MainActivity的源码如下,由如下的代码可见,要启用人脸检测功能仅仅是调用了createFotoapparat()这一个自定义函数:

package io.fotoapparat.facedetector.example;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import java.util.List;

import io.fotoapparat.Fotoapparat;
import io.fotoapparat.FotoapparatSwitcher;
import io.fotoapparat.facedetector.Rectangle;
import io.fotoapparat.facedetector.processor.FaceDetectorProcessor;
import io.fotoapparat.facedetector.view.RectanglesView;
import io.fotoapparat.parameter.LensPosition;
import io.fotoapparat.view.CameraView;

import static io.fotoapparat.log.Loggers.fileLogger;
import static io.fotoapparat.log.Loggers.logcat;
import static io.fotoapparat.log.Loggers.loggers;
import static io.fotoapparat.parameter.selector.LensPositionSelectors.lensPosition;

public class MainActivity extends AppCompatActivity {

    private final PermissionsDelegate permissionsDelegate = new PermissionsDelegate(this);
    private boolean hasCameraPermission;
    private CameraView cameraView;
    private RectanglesView rectanglesView;

    private FotoapparatSwitcher fotoapparatSwitcher;
    private Fotoapparat frontFotoapparat;
    private Fotoapparat backFotoapparat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cameraView = (CameraView) findViewById(R.id.camera_view);
        rectanglesView = (RectanglesView) findViewById(R.id.rectanglesView);
        hasCameraPermission = permissionsDelegate.hasCameraPermission();

        if (hasCameraPermission) {
            cameraView.setVisibility(View.VISIBLE);
        } else {
            permissionsDelegate.requestCameraPermission();
        }

        frontFotoapparat = createFotoapparat(LensPosition.FRONT);
        backFotoapparat = createFotoapparat(LensPosition.BACK);
        fotoapparatSwitcher = FotoapparatSwitcher.withDefault(backFotoapparat);

        View switchCameraButton = findViewById(R.id.switchCamera);
        switchCameraButton.setVisibility(
                canSwitchCameras()
                        ? View.VISIBLE
                        : View.GONE
        );
        switchCameraButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchCamera();
            }
        });
    }

    private boolean canSwitchCameras() {
        return frontFotoapparat.isAvailable() == backFotoapparat.isAvailable();
    }

    private Fotoapparat createFotoapparat(LensPosition position) {
        return Fotoapparat
                .with(this)
                .into(cameraView)
                .lensPosition(lensPosition(position))
                .frameProcessor(
                        FaceDetectorProcessor.with(this)
                                .listener(new FaceDetectorProcessor.OnFacesDetectedListener() {
                                    @Override
                                    public void onFacesDetected(List<Rectangle> faces) {
                                        Log.d("&&&", "Detected faces: " + faces.size());

                                        rectanglesView.setRectangles(faces);
                                    }
                                })
                                .build()
                )
                .logger(loggers(
                        logcat(),
                        fileLogger(this)
                ))
                .build();
    }

    private void switchCamera() {
        if (fotoapparatSwitcher.getCurrentFotoapparat() == frontFotoapparat) {
            fotoapparatSwitcher.switchTo(backFotoapparat);
        } else {
            fotoapparatSwitcher.switchTo(frontFotoapparat);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (hasCameraPermission) {
            fotoapparatSwitcher.start();
        }
    }

    @
代码是调用开源SDk的FaceCore关键代码。附件中有详细的接口调用说明 FaceCore人脸识别开放平台 (SERVICE INTERFACE PLATFORM)是基于人脸检测、比对核心业务技术的服务平台。平台可为外部合作伙伴提供基于高精度人脸识别技术为基础的相关服务,例如Api、人脸识别、数据安全等。作为人脸识别的重要开发途径,FaceCore平台将推动各行各业定制、创新、进化,并终促成新商业文明生态圈的建立。我们的使命是把人脸识别技术、规范等一系列核心技术基础服务,像水、电、煤一样输送给所有需要的合作伙伴、开发者、社区媒体、安全机构和各行各业。帮助社会各界通过使用此平台获得更丰厚的商业价值。 服务器测试接口: /api/hello/ 服务器测试接口,返回服务器当前时间。 人脸比对、识别接口: /api/facecompare/ 根据参数FaceFeature1,FaceFeature2获取两个人脸的相似度。 /api/facedetectcount/ 根据参数FaceImage,获取图像中的人脸数量。 /api/facedetect/ 根据参数FaceImage,获取图像中的人脸、眼睛位置和特征。 /api/urlfacedetect/ 根据参数Url,获取图像中的人脸、眼睛位置和特征。 人脸存储管理接口: /api/personface/similar/ Method:POST;根据参数Feature人脸特征,返回appkey存储的全部人脸相似度。 /api/personface/getall/ Method:GET;返回appkey存储的全部人脸。 /api/personface/{id} Method:GET;返回指定id人脸详细信息。 /api/personface/ Method:POST;添加一个人脸信息。 /api/personface/ Method:PUT;修改一个人脸信息。 /api/personface/{id} Method:DELETE;删除一个人脸信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值