java调用海康人脸识别机5603的sdk的使用总结(三)

本文详细介绍如何使用HCNetSDK库在设备上实现人脸信息的下发,包括核心代码的编写及注意事项,如图片转换为byte[]的方法等。
部署运行你感兴趣的模型镜像

下发人脸

首先,设备中需要有这条数据,卡号已经下发了,但没有人脸信息,现在开始下发人脸信息。

只贴核心代码

步骤:登录  启动远程配置 发送长连接 关闭连接

登录  启动远程配置 关闭连接 前面都讲了,这里重点是发送长连接

定义HCNetSDK.NET_DVR_FACE_PARAM_CFG,这个类的c++版本是:

struct{

  DWORD    dwSize;

  BYTE     byCardNo[ACS_CARD_NO_LEN];

  DWORD    dwFaceLen;

  char     *pFaceBuffer;

  BYTE     byEnableCardReader[MAX_CARD_READER_NUM_512];

  BYTE     byFaceID;

  BYTE     byFaceDataType;

  BYTE     byRes[126];

}NET_DVR_FACE_PARAM_CFG, *LPNET_DVR_FACE_PARAM_CFG;

需要注意的是pFaceBuffer字段,c++中是char  *,这个不能转成String,正确写法如下:

先定义一个类,名字随便取,例如:这个类是存放图片的byte[]信息的

publicstaticclassFACE_INFO extends Structure {

       publicbyte[] byFaceInfo;

    }

 

NET_DVR_FACE_PARAM_CFG的java的定义:

publicstaticclassNET_DVR_FACE_PARAM_CFGextendsStructure {

       publicintdwSize;

       publicbyte[] byCardNo = newbyte[ACS_CARD_NO_LEN];

       publicintdwFaceLen;

       public Pointer pFaceBuffer;

       publicbyte[] byEnableCardReader= newbyte[MAX_CARD_READER_NUM_512];

       publicbytebyFaceID;

       publicbytebyFaceDataType;

       publicbyte[] byRes = newbyte[126];

        }

 

注意:pFaceBuffer被定义成了Pointer而不是String或byte[],其实byte[]我试过,但报错17,就是参数错。

HCNetSDK.FACE_INFO faceInfo = new HCNetSDK.FACE_INFO();

byte[] byteFace = readPic7();

// 将图片转为byte[],java中这里是补码,就是负数,这点和c++,c#不一样,不用管,也不用转成正数。

publicbyte[]readPic7() {

       try {

           FileInputStreaminputStream= newFileInputStream("D:/facetestimg/test2.jpg");

           inti = inputStream.available();

           // byte数组用于存放图片字节数据

           byte[] buff = newbyte[i];

           inputStream.read(buff);

           // 关闭输入流

           inputStream.close();

           returnbuff;

       }catch(Exception e) {

           e.printStackTrace();

       }

       returnnull;

        }

 

faceInfo.byFaceInfo = byteFace;

faceInfo.write(); // 这里很重要,必须写,不然发不下去的。

 

pSendBuf.pFaceBuffer = faceInfo.getPointer(); // 这里就将照片信息赋值进去了

pSendBuf.dwFaceLen = byteFace.length;

pSendBuf.write(); //这个别忘了

// 下发照片

booleanresult= hCNetSDK.NET_DVR_SendRemoteConfig(lHandle, HCNetSDK.ENUM_ACS_INTELLIGENT_IDENTITY_DATA,pSendBuf.getPointer(),pSendBuf.size());

 

有疑问的可以联系我 516658652@qq.com,只要我知道的,尽量回答。

 

最后贴一下核心代码:

HCNetSDK.NET_DVR_FACE_PARAM_COND lpInBuffer = newHCNetSDK.NET_DVR_FACE_PARAM_COND();

           StringcardNo= "1234567";

           for (inti = 0; i < cardNo.length(); i++) {

              lpInBuffer.byCardNo[i] = (byte) cardNo.charAt(i);

           }

           lpInBuffer.dwFaceNum = 1;

           lpInBuffer.byFaceID = (byte) 1;

           lpInBuffer.byEnableCardReader = newbyte[HCNetSDK.MAX_CARD_READER_NUM_512];

           lpInBuffer.byEnableCardReader[0] = 1;

           lpInBuffer.dwSize = lpInBuffer.size();

           FRemoteConfigCallbackfRemoteConfigCallback = newFRemoteConfigCallback();

           lpInBuffer.write();

           // 启动远程配置。

           NativeLonglHandle= hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_FACE_PARAM_CFG,

                  lpInBuffer.getPointer(), lpInBuffer.size(), fRemoteConfigCallback,pLoginInfo.pUser);

           error = hCNetSDK.NET_DVR_GetLastError();

           lpInBuffer.read();

           // 发送长连接数据

           HCNetSDK.NET_DVR_FACE_PARAM_CFGpSendBuf= newHCNetSDK.NET_DVR_FACE_PARAM_CFG();

           for (inti = 0; i < cardNo.length(); i++) {

              pSendBuf.byCardNo[i] = (byte) cardNo.charAt(i);

           }

           // pSendBuf.byCardNo = new byte[] { 1, 2, 4, 6, 7 };

           HCNetSDK.FACE_INFOfaceInfo= newHCNetSDK.FACE_INFO();

           byte[] byteFace = readPic7();

           faceInfo.byFaceInfo = byteFace;

           faceInfo.write();

           pSendBuf.pFaceBuffer = faceInfo.getPointer();

           pSendBuf.dwFaceLen = byteFace.length;         pSendBuf.byEnableCardReader= newbyte[HCNetSDK.MAX_CARD_READER_NUM_512];

           pSendBuf.byEnableCardReader[0]= 1;

           pSendBuf.byFaceID = (byte) 1;

           pSendBuf.byFaceDataType = (byte) 1;

           pSendBuf.dwSize = pSendBuf.size();

           pSendBuf.write();

           booleanresult = hCNetSDK.NET_DVR_SendRemoteConfig(lHandle, HCNetSDK.ENUM_ACS_INTELLIGENT_IDENTITY_DATA,

                  pSendBuf.getPointer(), pSendBuf.size());

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值