精华内容
下载资源
问答
  • 中控考勤机 指纹、人脸 SDK_Ver 6.2.5.51 c# vb demo64位32位、开发文档,iFace系列脱机通讯开发包开发手册、TFT系列脱机通讯开发包开发手册、B&W系列脱机通讯开发包开发手册等
  • 基于百度人脸识别SDK实现人脸照片对比demo,申请权限使用demo即可实现
  • 与参考的资料相比,不同的是:参考资料是百度人脸SDK离线版本V1.0版本的; 而本DEMO是百度人脸SDK离线版本V1.1版本的; 本demo是x64的,封装成可供c#调用的dll是BaiduFaceDll.dll 使用步骤: 1.到百度AI开放平台 ...
  • 中控人脸/指纹机DEMO(delphi),支持目前市面绝大多数的ZK设备. 结合SDK开发包能让你快速掌握。D7环境。EXE可执行。已投入实际使用中。分享在此希望可以帮到有需要的你。
  • 网络不稳定 登录时灵时不灵 一直ping 建立连接 ping [ip] -t --------win环境下,基础的增删人脸直接复制官网demo即可(修改demo代码时,需要增加读取远程图片、压缩图片(符合海康人脸要求)转成输入流等细节功能,...

    尼玛的坑:

    按Demo运行:
    java.lang.UnsatisfiedLinkError: Unable to load library ‘HCNetSDK’: ÕҲ»µ½ָ¶¨
    原因:
    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(".\lib\HCNetSDK",
    HCNetSDK.class);
    复制文件有问题,把库文件放到lib下就行,不用新建HCNetSDK文件夹(被CSDN上的教程误导了,尼玛),".\\lib\\HCNetSDK"这里的HCNetSDK是指HCNetSDK.dll(有教程这么提的:引的是HCNetSDK.dll,但不要加后缀)不是HCNetSDK文件夹,所以建了的话会路径找不到。

    2.尼玛,报登录错误9 (原因:以为是密码错误,实际上是硬件ip变化)

    3.IDEA面对文件较大时(比如SDK有几百行),建议手动保存Ctrl+s,否则可能自动保存有点失效,导致运行又报登录错误。
    公司网ip有毒。多试几次。

    4.网络不稳定 登录时灵时不灵
    一直ping 建立连接
    ping [ip] -t

    --------win环境下,基础的增删人脸直接复制官网demo即可(修改demo代码时,需要增加读取远程图片、压缩图片(符合海康人脸要求)转成输入流等细节功能,均可百度黏贴代码解决)----

    -------这两天要求换到Linux服务器上-----------

    海康SDK在Linux与Win, java代码区别:

    本来以为很简单,把dll换成so,改改代码里so文件路径。但是,海康换了Linux后问题一堆。。。。
    0.长ping 面板机ip (防网络坑):ping [ip] -t
    1.首先是上传so,然后配置java里SDK文件路径

       //Win  示例 ".\\lib\\HCNetSDK" 直接放在项目里了
        //public static final String loadLibrary=".\\lib\\HCNetSDK";
       //Linux   示例 "/usr/lib/libhcnetsdk.so"
        public static final String loadLibrary="/home/deployproject/oa/libs/lib/libhcnetsdk.so";
    

    百度了各种配置方法,最后还是绝对路径+带so后缀起效了。其他各种方法启动报错(比如通过环境变量什么的),坑。
    当然,如此做法也埋下了一个坑,就是登陆注册可以了,但是下发卡号时的长连接失败,解决方法下面说。
    2.
    so文件和HCNETSDK.java都换最新的Linux demo里的(海康技术支持发的)(官网下的有点旧)【找海康技术支持问问题,直接丢个demo回来了。。。】
    挑选着复制黏贴完事
    但是,Linux里缺了删除卡号示例代码。看了HCNETSDK.java里有个删除卡的属性,自己模仿着SetCardInfo()方法改:

    删除卡号与下发卡号是一样的,只是将卡类型设定为无效即可;
    修改NET_DVR_CARD_CFG_V50结构体中
    dwModifyParamType
    0x00000001
    卡是否有效参数
    byCardValid  卡是否有效:0- 无效
    修改完成后,发送数据对应接口NET_DVR_SendRemoteConfig即可删除
    

    替换测试类/或自己写的service里的下发卡和脸的方法(win和Linux除了登陆方法没啥区别,其他HCNETSDK.java里得接口名字都有所变动,实现步骤也有些变动但思路差不多【大概是因为win和linux的demo是不同的人写的吧】)

    在这里插入图片描述

    4.调用接口时,response实体类异常,晕了。看日志是java.awt.HeadlessException null。。莫名其妙的。百度了,说VM配 -Djava什么,配了服务器启动脚本加了这个后,下一个错—,否则报错时让人摸不着头脑无法初始化swing等等一个坑百度解决带来下一个坑,无底洞,这就是菜鸟改bug时的常见无间地狱。
    看到swing这种画画的东西,并且百度错误原因说是没有键盘,jre缺少安装amd64什么的各种原因(千万别去解决)。想起来swing不是java基础GUI里用来画画的东西吗,demo 说明书里是图形化界面写设备ip port的,而我根本不需要这玩意。搜了下service哪里有用了swing包,换!

     // JOptionPane.showMessageDialog(null, "NET_DVR_DEL_FACE_PARAM_CFG删除人脸图片失败,错误号:" + iErr);
        log.info("NET_DVR_DEL_FACE_PARAM_CFG删除人脸图片失败,错误号:" + iErr);
    

    总之:海康linux的demo里提醒信息用了java swing图形的东西,记得去除。
    5.然后再测,还没成,吐了,真实一个坑接着一个坑,一个bug接着一个bug的解决啊,还要其他事呢,哪有时间详细整海康人脸,都想不用Linux,换win的服务器了(人脸代码迁移过程中多次想要放弃就win凑合着用,md,让我初级码农整这玩意。。),搞微服务,远程调用接口。算了,还得沟通其他组给台服务器,作为保底的解决办法吧,现在先再看看报错吧(手边没有电脑是Linux系统,只能每次解决一点,打包上传服务器,再调,痛苦哇(想设置IDEA远程debug调试,活没整成,弃)),调用后(System.out.print在服务器上不会打日志哦,要用log(slf4j))看了下报错日志,登陆成功,但,下发卡时候的长连接失败。
    解决:
    指定绝对地址

    【路径设置的Java示例代码】
    
    //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
    
     
    
    HCNetSDK.java头文件里添加下这个接口
    
    boolean  NET_DVR_SetSDKInitCfg(int enumType, Pointer lpInBuff);
    
    public static final int  NET_SDK_MAX_FILE_PATH = 256;     //文件路径长度
    
    public static class NET_DVR_LOCAL_SDK_PATH extends Structure {
    
          public byte[] sPath = new byte[NET_SDK_MAX_FILE_PATH];//组件库地址
    
             public byte[] byRes = new byte[128];
    
    }
    
     
    
    //设置HCNetSDKCom组件库所在路径         
    
    String strPathCom = "/home/hik/Desktop/JavaDemoLinux64/lib/";
    
    HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
    
    System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
    
    struComPath.write();
    
    hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
    
     
    
    //设置libcrypto.so所在路径     
    
    HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
    
    String strPathCrypto = "/home/hik/Desktop/JavaDemoLinux64/lib/libcrypto.so";            
    
    System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
    
    ptrByteArrayCrypto.write();
    
    hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
    
     
    
    //设置libssl.so所在路径    
    
    HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256); 
    
    String strPathSsl = "/home/hik/Desktop/JavaDemoLinux64/lib/libssl.so";   
    
    System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
    
    ptrByteArraySsl.write();
    
    hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
    

    至此,简单的华康人脸Demo win→linux迁移终于成了。(亲测,还有Thread sleep时间太长,使得下发有点慢。下发人脸有失败可能,也许是因为面板机被我玩弄到了管理界面,反正重复一次又成了。)


    问题:

    
    @Autowired
        public VisitorUserService visitorUserService;
    
        @Autowired
        public RedisUtil redisUtil;
    
        @Autowired
        public RedisTemplate redisTemplate;
    
        public static final String REDIS_FACE_KEY = "visitor.hcface.threadlocal";
    
    
        public static List<VisitorUserEntity> oldVisitor;
    
        static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
        String m_sDeviceIP;//已登录设备的IP地址
    
        NativeLong lUserID = new NativeLong(-1);//用户句柄
        FRemoteCfgCallBackCardSet fRemoteCfgCallBackCardSet;
        FRemoteCfgCallBackCardGet fRemoteCfgCallBackCardGet;
        //FRemoteCfgCallBackFaceGet fRemoteCfgCallBackFaceGet;
        FRemoteCfgCallBackFaceSet fRemoteCfgCallBackFaceSet;
    
        public Logger log = LoggerFactory.getLogger(HcFaceServiceImpl.class);
    
    public String sendKSFace(String strCardNo, String name, String photoUrl, Integer hcjobNum, String startTime, String endTime, int ksMachineCode) {
            log.info("[hc-face]调用【下发人脸】方法sendKSFace(),参数CardNo[{}],name[{}],photoUrl[{}],hcjobNum[{}],startTime[{}],endTime[{}],ksMachineCode[{}]", strCardNo, name, photoUrl, hcjobNum, startTime, endTime, ksMachineCode);
            log.info("[hc-face-redis]1/5 NET_DVR_Init前:调【下】方,此v.h.t:{}", redisUtil.getHcFaceResult() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            String normalST = startTime + ":00";
            String normalET = endTime + ":00";
    
            //其中,Structure 类的write()方法会把结构体的所有字段固定住,使原生函数可以访问
            hCNetSDK.NET_DVR_Init();
            log.info("[hc-face-redis]2/5 NET_DVR_Init后_login前:调【下】方,此v.h.t:{}", redisUtil.getHcFaceResult() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            int x = 0;
            int y = 0;
            int z = 0;
            //登录/注册。  建立连接
            x = loginKS(ksMachineCode);
            log.info("[hc-face-redis]3/5 login后_setOneCard前:调【下】方,此v.h.t:{}", redisUtil.getHcFaceResult() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            try {
                y = setOneCard(name, strCardNo, hcjobNum, normalST, normalET);    //下发1张卡号
                Thread.sleep(1000);
                //下发1张人脸
                z = setOneFace(strCardNo, photoUrl);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            //hcface中途是否发生错误
            Integer cw = redisUtil.getHcFaceResult();
            log.info("[hc-face-redis]4/5下发完人脸_重置key前:校验redis key状态:" + validateRedisKey() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            log.info("[hc-face-redis]中途,visitor.hcface.threadlocal:", redisUtil.getHcFaceResult() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            //中途发生错误
            if (cw == 1) {
                z = 1;
            }
            //置回0,不影响下一个下发人脸
            // threadLocal.set(0);
            redisUtil.refreshHcFaceResult(0);
            log.info("[hc-face-redis]5/5重置key后:校验redis key状态:" + validateRedisKey() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            log.info("[hc-face-redis]结束时,visitor.hcface.threadlocal:", redisUtil.getHcFaceResult() + "。相关卡号:" + strCardNo + "。时间:" + System.currentTimeMillis());
            if (x + y + z > 0) {
                return "error";
            } else {
                return "ok";
            }
    
        }
    

    发【人脸】存在为threadLocal空的-07-31-10log
    在这里插入图片描述
    在这里插入图片描述

    threadLocal/redis取不到值:
    不是海康锁住,不是redis事务(可能),又可能是java回调函数(并没有,完全能获得外部变量)||那是方法里取不到,不该啊,第一行就取到了。只可能是redis逻辑有点问题了。不是,好像是因为不在同一个线程,取可能比它存快.
    有卡。发卡和脸,会绑。再发呢?如果能自动替换的话,那下发就可以解耦了。那可以拿卡号去遍历。少几步,岂不是性能可以大大提高!(或者加一个接口去补。不针对地点,让设备编码唯一值!解耦,性能大大的提高。) 【能不能提一个删除方法出来,遍历有卡,就删,无卡则捕捉异常,[并且是线程同步的],总之,只返回0、1】

    [把发卡和发脸,看看能不能好起来]
    最终放弃。也不知道什么原因。规避:既然通过获取下发每一步的状态,但在中间无法获取,也就是自动实现重试无法实现。那只好:手动重试下发:手动“修改人脸”,根据用户状态(已签到,或是劳务),直接重新下发人脸(尝试删除+下发)

    最后:
    什么优化都动不了,海康的回调还是说调他原生方法,影响状态的可见。妄想性能优化什么的,不存在的。不如:长ping解千愁

    -----------2020年8月4日

    启发:间接再间接取到回调函数状态
    在这里插入图片描述

    所有方法同步(华康设备不允许并发)+中间异常状态(回调函数)里的状态能拿到然后可以进行重试机制,如此,应该下发人脸正确率能大大提高(2020年8月5日10:23:32)

    -----docker环境下不同操作系统的海康sdk不同路径兼容

    FROM adoptopenjdk/openjdk8:jdk8u265-b01-ubuntu-slim
    
    ENV TZ Asia/Shanghai
    
    EXPOSE 8086
    
    ADD ./target/*.jar /app.jar
    # ADD SDK 绝对文件夹挪到当前项目相对文件夹
    ADD ./docs/sdk docs/sdk
    
    #entrypoint
    ENTRYPOINT java -jar /app.jar
    

    ps.用绝对路径方式是没用的、不能这么写:win可以,但在测试环境会找不到文件:maven工程打jar包,部署到服务器上以后,获取resource下文件的[绝对路径]是找不到该文件的

    //2021年11月8日09:46:07
    //0.win自娱自乐
    File file = new File("src/main/resources/static/CensorWords4Cowain.txt");
    if (file.isFile() && file.exists()) {}
    //1.linux+jar 
    //(通过方法去找文件this.getClass().getClassLoader().getResourceAsStream,而不是绝对路径) 
        InputStream inputStream  = this.getClass().getClassLoader().getResourceAsStream("static/a.txt");  
                if (inputStream.available()>0) {}
    //2.linux+jar +docker 
    //(配置Dockerfile,把镜像文件弄出来)
    //3.linux+jar +docker+k8s
    //(挂载)
    
    
    WIN_HC_LIB_PATH = "\\docs\\sdk\\HCNetSDK_32\\HCNetSDK.dll";
    
    
    LINUX_SDK_DEFAULT = "/docs/sdk/sdk-hik-lib/libhcnetsdk.so";
    
    
    HcNetSdk INSTANCE = (HcNetSdk) Native.loadLibrary(System.getProperty("user.dir")
            + (Platform.isWindows() ? IParkingConfig.WIN_HC_LIB_PATH : IParkingConfig.LINUX_SDK_DEFAULT), HcNetSdk.class);
    

    一次乌龙2021-02:

    k8s挂载正常
    如上操作系统环境配置正常
    启动还报VisitorHcImpxx错误,以为还是海康的锅
    是特么工号配置改到yml了,在VisitorHcImpxx取,但prod.yml没配,导致VisitorHcImpxx没取到在那初始化报错呢。。。这次真是VisitorHcImpxx的错。。。```
    
    展开全文
  • 比如说FACE++(旷世)、阿里云、百度云、科大讯飞、云从科技等等,基本上都是通过API调用返回相应的数据,经过资料查询以及体验部分第三方的API,最后我选择了Android 自带的人脸识别的SDK,亲测有效,话不多说,...
  • 易语言基于海康SDK人脸识别应用,自己的算法,海康的原生SDK获取摄像头画面
  • c#调用百度人脸识别离线SDK的dll文件,可直接加到项目里调用。
  • 下载后请在**地方替换自己的api_key ; 图片地址替换成自己的
  • 本人已将人脸识别的代码写成PHP的Demo,适合快速上手,有说明书,有实例,有表情包,有注释。简单易懂。下载后直接解压到www,通过本地服务器访问就行了
  • 汉王人脸识别SDK及例子

    热门讨论 2013-06-23 20:07:40
    汉王人脸识别,包括sdk,C# dephi,BVB,VB和java的例子
  • 海康人脸识别.rar

    2020-05-20 16:33:30
    已经实现功能包括:登录、布防、撤防、远程采集人脸、下发人员信息、下发人脸信息,人脸识别记录抓取等等,本人使用DS-K5603-Z型号人脸机,绝对可用
  • 微信人脸SDK集成踩坑

    2021-09-11 09:40:36
    前一段跟收银系统打了一波交道,因为用到了微信人脸支付,在对接的过程中也踩了一波小 坑,现在项目搞完运行了,特地写个博客记录一下。 先说开发文档链接的事情,微信这个文档链接容易让人混淆,先贴出目前正确的...

           前一段跟收银系统打了一波交道,因为用到了微信人脸支付,在对接的过程中也踩了一波小

    坑,现在项目搞完运行了,特地写个博客记录一下。

           先说开发文档链接的事情,微信这个文档链接容易让人混淆,先贴出目前正确的文档地址 

    SDK模式 | 微信刷脸支付,建议直接看这个跑demo,然后跟后台统一,我这对接的时候跟后台看的

    地址就不一样,略坑.

           接下来就是对接了,新的文档简单明了,看设备是走SDK模式,还是青蛙定制的设备,一般来

    说都是SDK模式,开放程度高。下面来说一下我们的SDK模式。

           微信的文档写的很是清晰,按照步骤一步一步来就OK了,我们来看一下步骤

          1.程序启动时初始化这个建议在application中做,在activity中搞的话我测试过,有

    点拉胯

    private void initWeChatFace() {
    
            WxPayFace.getInstance().initWxpayface(instance, new IWxPayfaceCallback() {
                @Override
                public void response(Map info) throws RemoteException {
    
                    if (!isSuccessInfo(info)) {
                        return;
                    }
                    Logger.d("微信人脸服务","初始化完成");
                }
    
            });
        }

       2.获取数据getWxpayfaceRawdata

          这个是获取本地数据,目的是为了后面进行调用接口,加密等使用,前提是本地正确按照微信

    的apk哈,因为这种模式,就是调用微信自己apk完成人脸支付操作的,安装包就在首页下载。

    WxPayFace.getInstance().getWxpayfaceRawdata(new IWxPayfaceCallback() {
                @Override
                public void response(final Map info) throws RemoteException {
                    if (!isSuccessInfo(info)) {
                        return;
                    }
    
                    final String rawdata = info.get("rawdata") + "";
    
                    Logger.d("rawdata", rawdata);
    
                    String returnCode = (String) info.get(RETURN_CODE);
                    String returnMsg = (String) info.get(RETURN_MSG);
    
                    Logger.d("人脸数据", returnCode + "-----" + returnMsg);
    
                    try {
    //                    HashMap<String, Object> map = new HashMap<>();
    //
    //                    map.put("rawdata", rawdata);
    //                            map.put("mch_id", "1900007251");
    //                            map.put("mch_id", "1900007231");
    
                        getAuthInfo(rawdata);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

     3.获取调用凭证

           这一步比较重要,需要后台配合,安装微信文档上的参数配置,一个都不能少,因为这个是涉

    及到企业信息,这个关键点在后台,请提醒后台认证看文档配置参数毕竟都是机密信息

     

     4.进行人脸识别

           第三步调用凭证如果正常通过的话,客户端就会拿到文档上一些机密的参数,通过这些参数,

    去拉起人脸识别,请注意,到这一步是识别,也就是说到这一步可以调起摄像头了,

    WxPayFace.getInstance().getWxpayfaceCode(params, new IWxPayfaceCallback() {
                @Override
                public void response(final Map info) throws RemoteException {
    
                    if (info == null) {
    
                		  showToast("调用返回为空, 请查看日志");
                		  new RuntimeException("调用返回为空").printStackTrace();
                		  return false;
    
                      }
    
                    String code = (String) info.get("return_code");
            		String msg = (String) info.get("return_msg");
                    String facecode = (String) info.get("face_code");
                    String openid = (String) info.get("openid");
                    String subOpenid = (String) info.get("sub_openid");
                      ....
    
                }
             }, new IWxPayfaceCallback() {
                @Override
                public void response(Map info) throws RemoteException {
                    if (info == null) {
                        new RuntimeException("调用返回为空").printStackTrace();
                        return;
                    }
                    String code = (String) info.get("return_code"); // 错误码
                    String msg = (String) info.get("return_msg"); // 错误码描述
                    if (code == null || !code.equals("SUCCESS")) {
                        new RuntimeException("调用返回非成功信息,return_msg:" + msg + "   ").printStackTrace();
                        return ;
                    }
                    /*
                    在这里处理您自己的业务逻辑:
                    执行到这里说明用户已经确认支付结果且成功了,此时刷脸支付界面关闭,您可以在这里选择跳转到其它界面
                     */
                }
            });

         如果 成功的话,就会拉起微信人脸,点亮摄像头。这一步容易出现的问题就是

         1.传参一定要注意,要注意,要注意(大部分都是因为这个)


         2.摄像头白屏或者调用失败,可以用出厂工具去测试摄像头,也有可能是设备本身的问题

           (设备没有经过微信认证,大概率会出现白屏)

    5.发起订单支付

           这个也是后台接口,客户端将上一步识别成功的人脸信息facecode和其它一些后台所需要的信

    息,通过接口交给后台,后台向微信下单,发起扣款,然后跟咱们就没得关系了,是不是有点小舒

    服,哈哈,因为微信的apk页面逻辑帮我们搞完了,咱们只要传给后台就OK了,

    我们只传了face_code和订单号,做个参照哈哈,我们后台还是非常给力的。

     6.支付结果处理

          微信新版的文档取消了接口回调的,所以又给我们省了一步操作,我们只要跟后台异步拿结

    果 就OK了,然后跟根据自己的项目逻辑去做下面的逻辑处理,另外新版的SDK版本里面,还增加

    了语音和打断支付的环节,但是没有更新,不知道为啥日志写的那么新,堪称迷之操作。如果哪位

    小伙伴对接了,能用最新的就用最新的,因为旧版的安装包实在是太大了。

    7.总结

          总的来说,对接流程还是比较清晰明了,只是记得要认真看文档,因为参数比较多,客户端或

    者后台任意一个地方出错,就会导致流程出错,因为一些涉密信息所以不太方便贴的太多,有对接

    的小伙伴可以加Q940917911交流一下,目前为止我们的设备运行还比较流畅。

    展开全文
  • 百度人脸SDK安卓平板USB红外(IR)/RGB摄像头图像混淆问题 最近在做一个法院文件柜项目,涉及人脸识别。我们用的是百度的人脸识别SDK,使用安卓工控板通过USB口连接两个摄像头进行人脸识别。一个红外、一个RGB。红外...

    百度人脸SDK安卓平板USB红外(IR)/RGB摄像头图像混淆问题

    最近在做一个法院文件柜项目,涉及人脸识别。我们用的是百度的人脸识别SDK,使用安卓工控板通过USB口连接两个摄像头进行人脸识别。一个红外、一个RGB。红外数据用于活体检测,RGB数据用于匹配用户。

    开发过程中会出现一个奇怪的现象,在图像预览界面,有时候RGB的图像会被当初红外图像处理,红外图像则被当初RGB图像,导致SDK无法正确识别。

    如下图

    一开始我怀疑是摄像头问题,换了新的摄像头还是如此,最后排查发现是安卓工控板的问题。在百度官方给的SDK demo中,使用的是老的Camera类来调用相机,即通过cameraId来获取相机。在 Camera源码中,cameraId是被写死的。

            /**
             * The facing of the camera is opposite to that of the screen.
             */
            public static final int CAMERA_FACING_BACK = 0;
    
            /**
             * The facing of the camera is the same as that of the screen.
             */
            public static final int CAMERA_FACING_FRONT = 1;
    
            /**
             * The direction that the camera faces. It should be
             * CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
             */
    

    然而安卓工控板好像不怎么认USB设备(也有可能是我学艺不精),在开机状态下,如果出现摄像头IR/RGB数据混淆的情况,来回拔插切换摄像头的USB口,有时候能修正这个问题,有时候不能,修复后保持USB插口不变的情况下,断电重启有时又会出现同样的问题。个人感觉这已经脱离代码的范围了,属于玄学问题。

    仔细看百度官方的Demo可以发现,在FaceRGBIROpenDebugSearchActivity中预留了两个方法:rgbOrIr(int index, byte[] data)choiceRgbOrIrType(int index, byte[] data)没有用到,实际上所有用到双目的Activity中都预留了这两个方法,我们可以直接拿来使用。

    先看rgbOrIr(int index, byte[] data)方法

    private synchronized void rgbOrIr(int index, byte[] data) {
            byte[] tmp = new byte[PREFER_WIDTH * PERFER_HEIGH];
            try {
                System.arraycopy(data, 0, tmp, 0, PREFER_WIDTH * PERFER_HEIGH);
            } catch (NullPointerException e) {
                Log.e(TAG, String.valueOf(e.getStackTrace()));
            }
            int count = 0;
            int total = 0;
            for (int i = 0; i < PREFER_WIDTH * PERFER_HEIGH; i = i + 10) {
                total += byteToInt(tmp[i]);
                count++;
            }
            if (index == 0) {
                camemra1DataMean = total / count;
            } else {
                camemra2DataMean = total / count;
            }
            if (camemra1DataMean != 0 && camemra2DataMean != 0) {
                if (camemra1DataMean > camemra2DataMean) {
                    camemra1IsRgb = true; //惊了,居然是把两个摄像头一帧数据的所有byte值加起来比大小
                } else {
                    camemra1IsRgb = false;
                }
                rgbOrIrConfirm = true;
            }
        }
    

    这个方法能标记出摄像头1(cameraId:0)是不是RGB摄像头。而第二个方法就简单了,就是判断一下用不同的方法处理不同的摄像头而已。

    choiceRgbOrIrType(int index, byte[] data)

    private void choiceRgbOrIrType(int index, byte[] data) {
            // camera1如果为rgb数据,调用dealRgb,否则为Ir数据,调用Ir
            if (index == 0) {
                if (camemra1IsRgb) {
                    dealRgb(data);
                } else {
                    dealIr(data);
                }
            } else {
                if (camemra1IsRgb) {
                    dealIr(data);
                } else {
                    dealRgb(data);
                }
            }
        }
    

    事已至此,已经可以解决这个BUG了。在官方demo的FaceRGBIROpenDebugSearchActivity的两个摄像头回调处做如下修改。

     mCamera[0].setPreviewCallback(new Camera.PreviewCallback() {
                        @Override
                        public void onPreviewFrame(byte[] data, Camera camera) {
                            rgbOrIr(0,data);
                            if (rgbOrIrConfirm){
                                //要等两个摄像头都返回一帧数据,rgbOrIrConfirm才会被赋值,此时才能判断到底哪个是RGB摄像头
                                choiceRgbOrIrType(0,data);
                            }
    //                            dealRgb(data);
                        }
                    });
    
                    mCamera[1].setPreviewCallback(new Camera.PreviewCallback() {
                        @Override
                        public void onPreviewFrame(byte[] data, Camera camera) {
                            rgbOrIr(1,data);
                            if (rgbOrIrConfirm){
                                //要等两个摄像头都返回一帧数据,rgbOrIrConfirm才会被赋值,此时才能判断到底哪个是RGB摄像头
                                choiceRgbOrIrType(1,data);
                            }
    //                        dealIr(data);
                        }
                    });
    

    这样修改即使摄像头预览的RGB/IR数据是反的,对识别人脸也没有问题。如果需要让预览正常,建议在APP初始化阶段写一个Activity,调用一下两个摄像头,使用这个方法判断一下,写个APP全局变量,如果摄像头反了,在人脸识别界面反着打开摄像头就行了。

    //demo开启摄像头的代码,在这用初始化阶段赋值的全局变量做个判断,来决定open(0)和open(1)是否反过来
                    mCamera[0] = Camera.open(0);
                    mCamera[1] = Camera.open(1);
                    mPreview[0].setCamera(mCamera[0], PREFER_WIDTH, PERFER_HEIGH);
                    mPreview[1].setCamera(mCamera[1], PREFER_WIDTH, PERFER_HEIGH);
    

    注意:百度SDK4.0版本已经修改此处代码,开启RGB摄像头的方法已变更为startTestCloseDebugRegisterFunction();

    实测过程中,发现在完全遮挡摄像头的情况下,该方法可能会判断失误。在摄像头面前有物体晃动的情况下,也会出现几帧误判,因此建议多取几帧数据进行判断。


    这个问题虽然暂时解决了,但是感觉判断方法也太神奇了叭,凭什么RGB图像的byte值和比IR图像要大?
    两个相机回调函数如下:

    CameraPreviewManager.getInstance().startPreview(this, mAutoCameraPreviewView,
                    PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() {
                        @Override
                        public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
                            // 摄像头预览数据进行人脸检测
                            ......
                        }
                    });
    

    两个相机参数data[]的长度是一致的,图像长宽也是一致的,说明RGB返回的date[]并不是真彩图,而是256色图,将8位即一个字节的数据映射到色表中,一个字节最多可以表示256种颜色。

    256色表

    IR摄像头返回的是8位灰度数据,灰度图的R、G、B值相同。

    至于为什么RGB图像的byte值和比IR图像要大,我至今未搞清楚,可能和图像处理这方面知识有关,好想把写这个方法的大神抓出来问一下

    展开全文
  • Windows人脸识别离线SDK

    2018-08-17 00:38:40
    人脸检测: 0 ms; 年龄检测: 46 ms; 性别检测: 16 ms; 特征提取: 125 ms; 人脸属性: 男, 23岁; 图片face2.jpg检测耗时情况如下: 人脸检测: 187 ms; 年龄检测: 172 ms; 性别检测: 125 ms; 特征提取: 63 ms; 人脸属性:...
  • 本demo调用百度人脸识别离线SDK, 实现的基本功能: 1)检测图片中是否有人脸; 2)从图片中取特征值; 3)两个特征值对比(1:1), 可在此基础上做1:N(测试单线程2W的人脸库500ms出结果); 这里只是调用SDK的代码,没有SDK包...
  • 腾讯的离线人脸识别sdk是C++写的,本人只会C# ,有会转换C#的?我原因付报酬。
  • SDK可以在本地进行人脸识别、人脸检测、人脸追踪以及年龄判断,内含SDK的文档说明以及例程说明,可在NV21视频流中识别出已注册的人脸,响应速度快,基于java/android平台,属于虹软公司开发。
  • 人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像...
  • 其中运用到了虹软的SDK,只要去官网免费注册一个账户,填入相应的APPID 、FD_SDKKEY或FR_SDKKEY即可。详细配置及操作说明请参考文件中的readme.txt文档。另外还提供其它语言demo,详情请进本人资源主页进行相关下载...
  • 百度离线人脸识别SDK及实例,支持离线识别,android平台
  • 汉王人脸SDK二次开发包付费的啊,2014年11月18日发布的4.0版本. 该SDK主要包含以下三个部分: 1) 动态链接库:FaceId.dll。 请添加到引用项目。c# 4.0 该demo 有怎样接受互联网机型 228的方法,无开发手册 该SDK涉及...
  • 阿里云人脸识别sdk

    千次阅读 2019-07-01 11:26:08
    https://help.aliyun.com/document_detail/64074.html?spm=a2c4g.11186623.6.566.107a1619AfifHp
    展开全文
  • 海康一套SDK和源码内容。 {///宏定义 } const MAX_NAMELEN = 16; {//DVR本地登陆名} const MAX_RIGHT = 32; {//设备支持的权限(1-21表示本地权限,13-32表示远程权限)} const NAME_LEN = 32; {//用户名长度} ...
  • 1.1 人脸识别技术 Face.com:被 facebook 收购后,暂时没有更新; orbe:麻省理工科学家开发,官网目前暂停使用; Face++:国内开发,获联想投资; OpenCV:英特尔公司开发的项目,是计算机视觉和机器学习库,主要...
  • 首先申请百度离线人脸识别SDK以及验证码,申请好以后就可以集成环境了。 集成步骤还是比较详细的,看着文档基本就可以搞定,建议新手可将facelibrary和face-sdk-library以项目的新式集成在你的项目中,然后以外部库...
  • 这个一个springboot集成华为人脸识别的demo案例,里面就是写了一个简单的控制器,调用了华为云的sdk,实现人脸识别、对比和检验
  • C#(VS2017)百度人脸识别之注册自已的人脸库,并比对已有人脸库识别人员,需要自行到百度注册并申请相关的APP KEY
  • 虹软人脸比对SDK,windows_x64,java版本
  • Windows人脸识别SDK

    2020-05-23 18:01:03
    1、支持人脸检测、人脸质量检测、人脸追踪、活体检测、人脸比对、性别年龄检测; 2、离线永久授权(注意需要授权码),附带人证比对、门禁、属性分析场景开发的C/C++和C#语言demo,开发简单快捷; 3、精度高达99.9%...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,828
精华内容 4,731
关键字:

人脸sdk