虹软人脸识别 - 采用数据库存取人脸特征数据

本文介绍如何使用数据库(原生SQLite和Room框架)存储虹软人脸识别的特征数据。包括建表、新增、加载和清空数据的步骤,以及在ArcFaceDemo中的接口封装和实际应用。提供了两种数据库操作方式的详细示例。
摘要由CSDN通过智能技术生成

虹软人脸识别 - 采用数据库存取人脸特征数据

前几天有个朋友遇到了个问题,他在使用虹软的人脸识别引擎时,想更换一下人脸识别的存储方式,原本demo中使用的是文件的方式进行存储,而他想要通过数据库的方式进行存储。由于他刚接触Android不久,对数据库这块不甚了解,再加之听上去要存特征数据,听上去就很难的样子,可愁坏了他。其实虹软的人脸特征数据就是一个byte[],存储起来还是相当方便的。我为他写了一个demo,顺便与大家分享一下,希望能帮到有需要的人,本文将分为以下几点讲述。

  • 两种数据库存储方式
  • 封装数据库操作接口
  • ArcFaceDemo接入

一、两种数据库操作方式

方案一:使用原生数据库存储人脸特征数据

1. 建表

首先我们需要建一张表来存储特征数据,但是光存储特征数据还是不够的,不足以满足人脸识别的需要,因此我们还需要人脸姓名、人脸图片等数据。下面我创建了一个User表,以id为主键,并自增长,faceName用TEXT类型存储,把人脸图片与特征都用Blob存储。

注意:对于人脸库中人脸较多的场景,请将注册图存储至本地,数据库中仅保留文件路径,否则会占用很多内存。

public class FaceDatabaseHelper extends SQLiteOpenHelper {
   

    private static final String TAG = "FaceDatabaseHelper";

    public FaceDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
   
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
   
        //创建Face表 ID 名字 照片 特征
        db.execSQL("CREATE TABLE IF NOT EXISTS Face" +
                "(id INTEGER PRIMARY KEY AUTOINCREMENT, faceName TEXT, facePic Blob , faceFeature Blob)");
        //建库成功后给出提示
        Log.i(TAG, "dataBase Create Success");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   
    }
}
2. 新增人脸数据

表已经建好了,接下来就是往表中插入数据,需要注意的是,这里的最后一个参数需要传入jpeg格式的数据。

    public long addFace(String faceName, byte[] faceFeature, byte[] facePic) {
   
        //存人脸
        ContentValues values = new ContentValues();
        long index = -1;
        //写入表
        try {
   
            values.put("faceName", faceName);
            values.put("faceFeature", faceFeature);
            values.put("facePic", facePic);
            index = db.insert("Face", null, values);
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        return index;
    }
3. 加载人脸数据

人脸数据已经成功的插入到了表中,接下来我们就需要将表内所有的数据加载到内存。

    public ArrayList<FaceEntity> selectAllFaces() {
   
        ArrayList<FaceEntity> dataList = new ArrayList<>();
        Cursor cursor = db.query("Face", null, null, null, null, null, null);
        while (cursor.moveToNext()) {
   
            FaceEntity data = new FaceEntity();
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String faceName = cursor.getString(cursor.getColumnIndex("faceName"));
            byte[] facePic = cursor.getBlob(cursor.getColumnIndex("facePic"));
            byt
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值