使用百度离线人脸识别uni-app,后端Java

最近刚做了人脸识别,使用的百度离线,跟大家分享一下。

1.先去申请百度的离线SDK,分别离线采集SDK,离线识别SDK。

有没有看到不少于100字,是不是有点崩溃…不过还好写40多字的时候就可以提交了,提交完成后提示4个审核工作日…其实也就24小时内,我申请完两个小时就审核过了。
在这里插入图片描述
授权标识自定义,字符以 - 分隔,结尾android或ios,包名 包名 包名一定要和App打包时的名包名一致填写完毕后
在这里插入图片描述
下载安卓-License…具体操作可以看uni-app插件市场
付费的喔插件中已经将采集做完了,需要做识别自己写请求地址和逻辑就好了。

2.识别
在这里插入图片描述
申请完离线识别后下载java版本的SDK,下载完后找到
在这里插入图片描述
运行LicenseTool.exe,复制设备指纹信息,去百度中激活。激活完之后会有一个激活码。
在这里插入图片描述
在这里插入图片描述
复制激活码进行激活。准备工作就算做完了~~~~接下来导入开发工具中我用的idea,看一下SDK都有哪些方法.

package com.jni.face;

// import org.opencv.core.Core;

public class Face {
    // sdk初始化
    public native void sdkInit(boolean idCard);

    // sdk销毁(资源释放)
    public native void sdkDestroy();

    // 判断是否授权
    public native boolean isAuth();

    // 获取设备指纹 deviceId
    public native String getDeviceId();

    /*
     * 人脸检测(返回检测到的人脸数组) String imgPath 要检测的图片路径 int maxTrackObjNum: 最多要检测的人数,例如设置为1则只检测一个人,如果设置为3则最多tracking 3个人。
     */
    public static native TrackFaceInfo[] track(String imgPath, int maxTrackObjNum);

    /*
     * 人脸检测(返回检测到的人脸数组) byte[] bufs 要检测的图片二进制buf int len 要检测的图片二进制buf长度 int maxTrackObjNum:
     * 最多要检测的人数,例如设置为1则只检测一个人,如果设置为3则最多tracking 3个人。
     */
    public static native TrackFaceInfo[] trackByBuf(byte[] bufs, int len, int maxTrackObjNum);

    public static native TrackFaceInfo[] trackByMat(long matAddr, int maxTrackObjNum);

    /*
     * 人脸检测(返回检测到的最大人脸) String imgPath 要检测的图片路径 。
     */
    public static native TrackFaceInfo trackMax(String imgPath);

    // 人脸检测(返回检测到的最大人脸)buf为人脸二进制图片 len为图片大小
    public static native TrackFaceInfo trackMaxByBuf(byte[] bufs, int len);

    // 人脸检测(返回检测到的最大人脸)matAddr为opencv的视频帧地址
    public static native TrackFaceInfo trackMaxByMat(long matAddr);

    // 获取人脸属性(传入图片路径)
    public static native String faceAttr(String filePath);

    // 获取人脸属性(传入二进制图片buffer)
    public static native String faceAttrByBuf(byte[] bufs, int len);

    // 获取人脸属性(传入opencv视频帧)
    public static native String faceAttrByMat(long matAddr);

    // 获取人脸属性(传入opencv视频帧和前期检测到的人脸信息,适应于多人脸)
    public static native String faceAttrByFace(long matAddr, TrackFaceInfo info);

    // 传入图片获取人脸质量
    public static native String faceQuality(String filePath);

    // 传入二进制图片buffer获取人脸质量
    public static native String faceQualityByBuf(byte[] bufs, int len);

    // 传入opencv视频帧获取人脸质量
    public static native String faceQualityByMat(long matAddr);

    // 传入opencv视频帧及检测到人脸信息,适应于多人脸
    public static native String faceQualityByFace(long matAddr, TrackFaceInfo info);

    // 人脸注册(传图片地址)
    public static native String userAdd(String userId, String groupId, String fileName, String userInfo);

    // 人脸注册(传二进制图片buf)
    public static native String userAddByBuf(String userId, String groupId, byte[] bufs, int bufLen, String userInfo);

    // 人脸注册(传特征值)
    public static native String userAddByFeature(String userId, String groupId, byte[] feas, int feaLen,
            String userInfo);

    // 人脸更新
    public static native String userUpdate(String userId, String groupId, String fileName, String userInfo);

    // 人脸更新(传二进制图片buf)
    public static native String userUpdateByBuf(String userId, String groupId, byte[] bufs, int bufLen,
            String userInfo);

    // 人脸删除
    public static native String userFaceDelete(String userId, String groupId, String faceToken);

    // 用户删除
    public static native String userDelete(String userId, String groupId);

    // 组添加
    public static native String groupAdd(String groupId);

    // 组删除
    public static native String groupDelete(String groupId);

    // 查询用户信息
    public static native String getUserInfo(String userId, String groupId);

    // 用户组列表查询
    public static native String getUserList(String groupId, int start, int length);

    // 组列表查询
    public static native String getGroupList(int start, int length);

    // 1:1人脸对比(传图片路径)
    public static native String match(String image1, String image2);

    // 人脸对比(传入opencv视频帧)
    public static native String matchByMat(long matAddr1, long matAddr2);

    // 1:N人脸识别
    public static native String identify(String image, String groupIdList, String userId, int userTopNum);

    // 1:N人脸识别(和整个库比较,需要提前调loadDbFace())
    public static native String identifyDB(String image, int userTopNum);

    // 1:N人脸识别(传入opencv视频帧)
    public static native String identifyByMat(long matAddr, String groupIdList, String userId, int userTopNum);

    // 1:N人脸识别(传入opencv视频帧)(和整个库比较,需要提前调loadDbFace())
    public static native String identifyByMatDB(long matAddr, int userTopNum);

    // 1:N人脸识别(传入二进制图片buf)
    public static native String identifyByBuf(byte[] bufs, int bufLen, String groupIdList, String userId,
            int userTopNum);

    // 1:N人脸识别(传入二进制图片buf)(和整个库比较,需要提前调loadDbFace())
    public static native String identifyByBufDB(byte[] bufs, int bufLen, int userTopNum);

    // 1:N人脸识别(传入特征值feature)
    public static native String identifyByFeature(byte[] features, int feaLen, String groupIdList, String userId,
            int userTopNum);

    // 1:N人脸识别(传入特征值feature)(和整个库比较,需要提前调loadDbFace())
    public static native String identifyByFeatureDB(byte[] features, int feaLen, int userTopNum);

    // 加载数据库人脸库到内存(数据库数据通过userAdd等注册入库)
    public static native boolean loadDbFace();

    // 以下为人脸参数设置
    // 非人脸的置信度阈值,取值范围0~1,取0则认为所有检测出来的结果都是人脸,默认0.5
    public static native void setNotFaceThr(float thr);

    // 最小人脸尺寸:需要检测到的最小人脸尺寸,比如需要检测到30*30的人脸则设置为30,
    // 该尺寸占图像比例越小则检测速度越慢,具体请参考性能指标章节。默认值30
    public static native void setMinFaceSize(int size);

    // 跟踪到目标后执行检测的时间间隔,单位毫秒,默认300,值越小越会更快发现新目标,但是cpu占用率会提高、处理速度变慢
    public static native void setTrackByDetectionInterval(int intervalInMs);

    // 未跟踪到目标时的检测间隔,单位毫秒,默认300,值越小越快发现新目标,但是cpu占用率会提高、处理速度变慢
    public static native void setDetectInVideoInterval(int intervalInMs);

    // 清除跟踪到的人脸信息
    public static native void clearTrackedFaces();

    // 获取特征值(通过传入图片地址,返回2048个byte)
    public static native byte[] getFaceFeature(String image);

    // 获取特征值(通过传入opencv视频帧,返回2048个byte)
    public static native byte[] getFaceFeatureByMat(long mat);

    // 获取特征值(传入二进制图片buf,返回2048个byte)
    public static native byte[] getFaceFeatureByBuf(byte[] bufs, int bufLen);

    // 获取特征值(传入opencv视频帧和需要获取特征值的人脸信息,适应于多人脸)
    public static native byte[] getFaceFeatureByFace(long mat, TrackFaceInfo info);

    // 特征值比较
    public static native float compareFeature(byte[] f1, int f1Len, byte[] f2, int f2Len);

    // 活体
    // rgb+ir(可见光+红外双目活体)(传入图片二进制buf)
    public static native RgbIrInfo rgbAndIrLivenessCheckByBuf(byte[] rgbBufs, int rgbLen, byte[] irBufs, int irLen);

    // rgb+ir(可见光+红外双目活体)(传入opencv视频帧)
    public static native RgbIrInfo rgbAndIrLivenessCheckByMat(long rgbAddr, long irAddr);

    // rgb+depth(可见光+深度双目活体)(传入图片二进制buf)
    public static native RgbDepthInfo rgbAndDepthLivenessCheckByBuf(byte[] rgbBufs, int rgbLen, byte[] depthBufs,
            int depthLen);

    // rgb+depth(可见光+深度双目活体)(传入opencv视频帧)
    public static native RgbDepthInfo rgbAndDepthLivenessCheckByMat(long rgbAddr, long depthAddr);

    // 初始化奥比mini摄像头
    public static native long newOrbeMini();

    // 打开奥比mini摄像头
    public static native int openOrbeMini(long camera, long rgbAddr, long depthAddr);

    // 释放奥比mini摄像头
    public static native void deleteOrbeMini(long addr);

    // 初始化奥比deeyea或atlas摄像头(同时适应于deeyea镜头或atlas镜头)
    public static native long newOrbeDeeyea();

    // 打开奥比deeyea或atlas摄像头(同时适应于deeyea镜头或atlas镜头)
    public static native int openOrbeDeeyea(long camera, long rgbAddr, long depthAddr);

    // 释放奥比deeyea或atlas摄像头(同时适应于deeyea镜头或atlas镜头)
    public static native void deleteOrbeDeeyea(long addr);

    // 初始化华杰艾米摄像头
    public static native long newHjimi();

    // 打开华杰艾米摄像头
    public static native boolean openHjimi(long camera, long rgbAddr, long depthAddr);

    // 释放华杰艾米摄像头
    public static native void deleteHjimi(long addr);

    static {
        // 加载dll
        System.loadLibrary("BaiduFaceApi");
        System.loadLibrary("opencv_java320");
    }

    public static void main(String[] args) {
        // sdk初始化
        Face api = new Face();
        // 初始化sdk
        // 若采用证件照模式,请把id_card设为true,否则为false,证件照模式和非证件照模式提取的人脸特征值不同,
        // 不能混用
        boolean idCard = false;
        api.sdkInit(idCard);
        // 获取设备指纹
        String deviceId = api.getDeviceId();
        System.out.println("device id is:" + deviceId);
        // 人脸设置
        FaceSetting faceSet = new FaceSetting();
        faceSet.testFaceSetting();
        // 加载数据库到内存(前提是通过了user_add等添加数据到数据库后数据库有数据)
//        api.loadDbFace();
        // 人脸属性
        FaceAttr faceAttr = new FaceAttr();
        //faceAttr.testFaceAttr();
        // 人脸质量
       // FaceQuality faceQual = new FaceQuality();
        // faceQual.testFaceQuality();
        // 人脸检测
        //FaceTrack track = new FaceTrack();
       // track.testFaceTrack();
        // track.testFaceTrackMax();

        // 人脸管理
        //FaceManager faceMag = new FaceManager();
       // faceMag.testFaceManager();
        // 人脸比较
        FaceCompare faceCom = new FaceCompare();
        faceCom.testFaceCompare();
        // 双目活体(rgb+ir和rgb+depth)
        //FaceLiveness faceLiveness = new FaceLiveness();
        //faceLiveness.testFaceLiveness();
        System.out.println("end face");
    }
}

里边的方法很齐全啊~~~~

把SDK融合到我们自己的项目,很多坑…
在这里插入图片描述
将baiduDaceApi.dll放进项目根目录,
在这里插入图片描述
是不是很奇怪,为什么不和Controller放在同一层的…因为百度不让我放…这个这个问题,我纠结了一下午啊,Face中,你用哪个方法就把那个方法copy过来就行。我们是直接使用人脸图片做的识别,没有取特征。
以下代码是将人脸图片,添加人脸库
userAdd参数为(用户id,分组,人脸图片地址,(需是本地),用户信息)

      //初始化
        Face.discern();
        //将识别人脸图片添加到人脸库
        //TODO
        //是否需要根据userid反查人脸库
        String register = Face.userAdd(jobnumber, "0", filePath2 + '\\' + fileRealName, "");
        Face.clearTrackedFaces();
        //将返回结果转为JSON判断采集是否成功
        JSONObject json = JSONObject.fromObject(register);
        int errno = (Integer) json.get("errno");
        if (errno != 0) {
            resultMsg.setCode("0");
            resultMsg.setMsg("失败");
            return resultMsg;
        }

以下代码是识别

             //初始化
            Face.discern();
            //识别图片地址本地路径,分组,userid为空则全库扫描,识别结果数量
            String res = Face.identify(filePath2 + "\\" + fileRealName, "0", "", 1);
            //返回结果转JSON
            JSONObject json = JSONObject.fromObject(res);
            //识别是否成功
            int errno = (Integer) json.get("errno");
            //0识别成功
            if(errno == 0){
                //识别度,大于70成功
                double score = Double.parseDouble((json.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("score")));
                if(score >= 70){
                    String jobnumber = json.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("user_id");
                    SysUser sysUser = faceInfoService.getUserInfo(jobnumber);

以下是识别完成后的group_id分组id,score就是人脸对比的百分比,user_id,用户id
在这里插入图片描述
就写到这吧继续码代码去了,有问题可以联系我,android端的采集还在看,后续还会更新…

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
集成百度离线人脸识别SDK 8.3 可以通过以下步骤进行: 1. 下载百度离线人脸识别SDK 8.3,并解压到项目目录中。 2. 在Qt项目中创建一个新的类,用于封装人脸识别相关的功能。 3. 在该类的头文件中,包含百度离线人脸识别SDK的头文件,并声明人脸识别相关的函数和变量。 ```cpp #include <QObject> #include <QString> #include "baidu_face_sdk.h" class FaceRecognition : public QObject { Q_OBJECT public: explicit FaceRecognition(QObject *parent = nullptr); bool init(); // 初始化人脸识别SDK bool detectFace(const QString &imagePath); // 人脸检测 bool compareFace(const QString &image1, const QString &image2); // 人脸比对 private: // 声明百度离线人脸识别SDK相关的变量和函数 // ... }; ``` 4. 在源文件中实现人脸识别相关的函数。 ```cpp #include "facerecognition.h" FaceRecognition::FaceRecognition(QObject *parent) : QObject(parent) { // 初始化人脸识别SDK } bool FaceRecognition::init() { // 初始化百度离线人脸识别SDK // ... } bool FaceRecognition::detectFace(const QString &imagePath) { // 执行人脸检测操作 // ... } bool FaceRecognition::compareFace(const QString &image1, const QString &image2) { // 执行人脸比对操作 // ... } ``` 5. 在主程序中使用该类进行人脸识别。 ```cpp #include <QCoreApplication> #include "facerecognition.h" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); FaceRecognition faceRecognition; faceRecognition.init(); // 调用人脸检测函数 faceRecognition.detectFace("image.jpg"); // 调用人脸比对函数 faceRecognition.compareFace("image1.jpg", "image2.jpg"); return app.exec(); } ``` 在以上步骤中,你需要根据百度离线人脸识别SDK 8.3 的文档,了解其具体的调用方式和参数设置。根据具体的需求,实现相应的功能函数,并在主程序中调用。同时,记得将百度离线人脸识别SDK相关的文件和库链接到你的Qt项目中。 请注意,根据百度离线人脸识别SDK的许可和使用条款,确保你的项目遵守相关规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值