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

下发人脸

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

只贴核心代码

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

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

定义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());

 

有疑问的可以联系我 [email protected],只要我知道的,尽量回答。

 

最后贴一下核心代码:

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());

你可能感兴趣的:(java,海康)