# 基于OpenCV和Dilb的人脸识别SDK **Repository Path**: lxySuperBoy/Face-recognitionSDK ## Basic Information - **Project Name**: 基于OpenCV和Dilb的人脸识别SDK - **Description**: 基于OpenCV和Dilb的人脸识别SDK,可以对人脸库进行增删改查,使用cmake编译可以实现跨平台(linux & windows) - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-01-28 - **Last Updated**: 2023-02-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 作者:lin-yuyuadd 完成时间:2020.11 开发环境: win10, Visual Studio 2019,opencv3.4.1, dlib19.21 项目编译: 项目采用的是cmake跨平台开发,在windows和linux下均可编译 1. 在win下面编译: 用Visual Studio打开cmake项目方式打开此项目,点击正上方 即可编译生成动态库,若要修改编译请按照cmake语法修改CmakeLists.txt文件 2. 在linux下面编译: 工程根目录下 1.mkdir ./out 2.cd out 3.cmake .. 4.make 产生facelib.so 项目部署: 此项目生成的动态库可以被Java的JNI方式调用,也可以被c/c++写的代码直接调用,部署此项目直接产生动态库跟随其它项目固定一个搜索路径部署即可,此项目主要用来提供人脸识别的接口 接口说明: 接口名称可以在test.h中查看,函数名前面带有DLLEXPORT的为对外提供的接口,其余为内部调用的函数,项目中jni相关接口后面实际没有用到,可以直接被java调用 具体接口 int imgread(): 测试用接口,传入路径,若调用成功则在屏幕上显示所传路径对应图片,错误则返回-1 const char* RecogFacePos(char* picpath,char* facelibpath, int relative_pic_num,const char* ePath =""); 此接口识别传入图片中所有人头的位置,以及从模型库中比对出与之最相近的人脸, relative_pic_num是选择返回与之相近的人数,最后一个参数为图片地址的前缀。返回值是json字符串,所有信息包含与json中 int UpdateModel(const char* picpath,char* facelibpath, const char* figurelabel,const char* ePath = ""); 此接口用于更新人脸模型,前提是图片中只能有一个人否则更新失败, figurelabel是更新后此人在人脸库中的ID,如果过有多个人则使用其他接口 int InitModel(char* facelibname, const char* ePath = ""); 此接口用于初始化一个人脸库模型, facelibname为初始化文件名 int UpdateModelWithlocation(const char* picpath,char* facelibpath, long location[], const char* figurelabel, const char* ePath = ""); 此接口用于多人情况更新人脸库,需要将图片先识别一遍人脸的位置,然后将位置参数传入所以要与RecogFacePos配合使用 void DeleteModel(const char* figurelabel, char* facelibpath); 此接口用于删除模型库中的一个人脸信息(包含相同的一个人对应所有的脸) bool DeletePic(char* facelibpath,char* CSVPath, int Picnumber); 删除一张人脸图片,同一个人的摸一张图片 注:一个相同的人的人物ID是一样的由调用者传入,每一张图片对应一个图片id是自动生成的每次保存模型成功会由接口返回值返回 其他: 训练人物模型的算法是knn,此算法并没有实际更新模型只是在模型中添加了数据,所以随着人物数据的增多识别速度必然会变慢。预计十万量级时仍处于秒级识别速度 模型更新过程 一张有人脸的图片->标记人脸特征位置(68处)->根据特征位置使用深度残差网络计算出128维特征向量->存入模型 模型识别过程 一张有人脸的图片->标记人脸特征位置(68处)->根据特征位置使用深度残差网络计算出128维特征向量->与存储模型计算欧氏距离比对->选出比对值最小的作为识别结果 一些速度优化的思考 1. 更新更好的硬件设备 2. 将cpu计算换成gpu计算 3. 使用多cpu同时计算 4. 将knn算法换成其他深度学习算法,用同一个人的不同图片产生的128维向量来更新这个人的模型