虹软人脸识别 - 采用数据库存取人脸特征数据
前几天有个朋友遇到了个问题,他在使用虹软的人脸识别引擎时,想更换一下人脸识别的存储方式,原本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