海康威视DS-K56A0人证设备集成(1)

1.需求

集成海康威视DS-K560人证对比终端设备,实现人脸+身份证识别,识别出身份证信息,抓拍人脸照片以及身份证照片

2.代码实现

1.首先我们需要把海康威视的的部分库文件导入到我们的项目中,没有库文件可以去海康威视的官网下载最新的SDK,压缩包里面会有库文件,链接我会放在最下面。
需要导入的文件有:HCNetSDKCom文件夹、AudioRender.dll、HCCore.dll、HCNetSDK.dll、hlog.dll、hpr.dll、libeay32.dll、ssleay32.dll。
以下是我的库文件存放路径大家可以参考一下
在这里插入图片描述
2.

设备登录

	/**
	 * 登录
	 * */
	public static void login(){
		//注册之前判断有没有已注册用户,有就删除
		if(lUserID>-1){
			//注销
			hCNetSDK.NET_DVR_Logout(lUserID);
			lUserID = -1;
		}

		//注册	
		//设备IP地址
		m_sDeviceIP = "192.168.1.64";
		m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
		System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());

		//设备账户	如果没有,一般默认为admin
		m_sUsername = "admin";
		m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
		System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());

		//设备密码	购买时会提供
		m_sPassword ="1232132";
		m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
		System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());

		//设备端口
		m_strLoginInfo.wPort =8000;
		
		//海康威视登录登录方法
		lUserID =hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);
		//判断注册是否成功
		if(lUserID==-1){
			JOptionPane.showMessageDialog(null, "false,错误号:" +  hCNetSDK.NET_DVR_GetLastError());
		} else {
			JOptionPane.showMessageDialog(null, "success");
		}
	}

报警布防监听

//布防
	public static void initMemberFlowUpload(){
		//设置报警回调函数
		boolean callflag = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(new Haikangimpl(),null);
		if(callflag){
			System.out.println("callback----success+设置回调函数成功");
		}
		//启用布防-其他报警布防参数不需要设置,不支持
		HCNetSDK.NET_DVR_SETUPALARM_PARAM lpSetupParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
		lpSetupParam.dwSize=lpSetupParam.size();
		lpSetupParam.byLevel=1;//智能交通布防优先级:0- 一等级(高),1- 二等级(中),2- 三等级(低)
		lpSetupParam.byAlarmInfoType=1;//智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
		lpSetupParam.byDeployType =1; //布防类型(仅针对门禁主机、人证设备):0-客户端布防(会断网续传),1-实时布防(只上传实时数据)
		lpSetupParam.write();
		final   int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID,lpSetupParam);
		if (lAlarmHandle==-1)
		{
			System.out.println("NET_DVR_SetupAlarmChan_V41 error, %d\n"+hCNetSDK.NET_DVR_GetLastError());
			hCNetSDK.NET_DVR_Logout(lUserID);
			hCNetSDK.NET_DVR_Cleanup();
			System.out.println("布防失败");
		}
		else {
			System.out.println("bufangsuccess++布防成功");
		}
		//等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息
		Timer timer =new Timer();// 实例化Timer类
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				//撤销布防上传通道
				if (! hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle))
				{
					System.out.println("! hCNetSDK.NET_DVR_CloseAlarmChan_V31(lAlarmHandle)\n"+ hCNetSDK.NET_DVR_GetLastError() +"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null) );
					hCNetSDK.NET_DVR_Logout(lUserID);
					hCNetSDK. NET_DVR_Cleanup();
					return;
				}
				//注销用户
				hCNetSDK.NET_DVR_Logout(lUserID);
				//释放SDK资源
				hCNetSDK.NET_DVR_Cleanup();
				this.cancel();
				System.gc();//主动回收垃圾
			}
		}, 100 * 60 * 1000 );// 这里毫秒
	}

回调函数

public class Haikangimpl implements HCNetSDK.FMSGCallBack_V31{
    @Override
    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
        String sAlarmType = new String();
        Date today = new Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String[] sIP = new String[2];
//        sAlarmType = new String("lCommand=0x") +  Integer.toHexString(lCommand);
        switch (lCommand){
            case HCNetSDK.COMM_ID_INFO_ALARM: ///身份证信息*/
                HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM strIDCardInfo = new HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM();
                strIDCardInfo.write();
                Pointer pIDCardInfo = strIDCardInfo.getPointer();
                pIDCardInfo.write(0, pAlarmInfo.getByteArray(0, strIDCardInfo.size()), 0, strIDCardInfo.size());
                strIDCardInfo.read();
                sAlarmType = sAlarmType + ":门禁身份证刷卡信息,身份证号码:" + new String(strIDCardInfo.struIDCardCfg.byIDNum).trim() + ",姓名:" +
                        new String(strIDCardInfo.struIDCardCfg.byName).trim() + ",报警主类型:" + strIDCardInfo.dwMajor + ",报警次类型:" + strIDCardInfo.dwMinor;
//                String s =new String(strIDCardInfo.struIDCardCfg.byName).trim();
//                /*System.out.println(sAlarmType);*/
//                String name=new String(strIDCardInfo.struIDCardCfg.byName).trim();//姓名
//                String cardnum=new String(strIDCardInfo.struIDCardCfg.byIDNum).trim();//身份证号码
//                String address=new String(strIDCardInfo.struIDCardCfg.byAddr).trim();//地址
//                String struBirth=new String(String.valueOf(strIDCardInfo.struIDCardCfg.struBirth)).trim();//出生日期
//                System.out.println("name:"+name+"\ncardnum:"+cardnum+"\naddress:"+address);
//                System.out.println(sAlarmType);
                //身份证图片
                if (strIDCardInfo.dwPicDataLen > 0) {
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String newName = sf.format(new Date());
                    FileOutputStream fout;
                    try {
                        String filename ="F:\\硬件集成\\人证合一\\CH-HCNetSDKV6.1.4.42_build20200527_win64\\CH-HCNetSDKV6.1.4.42_build20200527_win64\\Demo示例\\4- Java 开发示例\\3-明眸门禁优化接口\\Test1\\lib\\pic" +

                                newName + "_IDInfoPic.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = strIDCardInfo.pPicData.getByteBuffer(offset, strIDCardInfo.dwPicDataLen);
                        byte[] bytes = new byte[strIDCardInfo.dwPicDataLen];
                        buffers.rewind();
                        buffers.get(bytes);
                        fout.write(bytes);
                        fout.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                //抓拍图片
                if (strIDCardInfo.dwCapturePicDataLen > 0) {
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String newName = sf.format(new Date());
                    FileOutputStream fout;
                    try {
                        String filename = "F:\\硬件集成\\人证合一\\CH-HCNetSDKV6.1.4.42_build20200527_win64\\CH-HCNetSDKV6.1.4.42_build20200527_win64\\Demo示例\\4- Java 开发示例\\3-明眸门禁优化接口\\Test1\\lib\\pic"  +
                                newName + "_IDInfoCapturePic.jpg";
                        tFamilyinfo.setYhzp(filename);
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = strIDCardInfo.pCapturePicData.getByteBuffer(offset, strIDCardInfo.dwCapturePicDataLen);
                        byte[] bytes = new byte[strIDCardInfo.dwCapturePicDataLen];
                        buffers.rewind();
                        buffers.get(bytes);
                        fout.write(bytes);
                        fout.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            case HCNetSDK.COMM_ALARM_ACS: //门禁主机报警信息sout
                HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();
                strACSInfo.write();
                Pointer pACSInfo = strACSInfo.getPointer();
                pACSInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size());
                strACSInfo.read();
                sAlarmType = sAlarmType + ":门禁主机报警信息,卡号:"+  new String(strACSInfo.struAcsEventInfo.byCardNo).trim() + ",卡类型:" +
                        strACSInfo.struAcsEventInfo.byCardType + ",报警主类型:" + strACSInfo.dwMajor + ",报警次类型:" + strACSInfo.dwMinor;
                System.out.println(sAlarmType);
                System.out.println(strACSInfo.pPicData);
                System.out.println("上传类型:"+strACSInfo.byPicTransType);
                if(strACSInfo.dwPicDataLen>0)
                {
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String newName = sf.format(new Date());
                    FileOutputStream fout;
                    try {
                        String filename = ".\\pic\\"+ new String(pAlarmer.sDeviceIP).trim() +
                                "_byCardNo["+ new String(strACSInfo.struAcsEventInfo.byCardNo).trim() +
                                "_"+ newName + "_Acs.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = strACSInfo.pPicData.getByteBuffer(offset, strACSInfo.dwPicDataLen);
                        byte [] bytes = new byte[strACSInfo.dwPicDataLen];
                        buffers.rewind();
                        buffers.get(bytes);
                        fout.write(bytes);
                        fout.close();
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
                //实时人脸抓拍上传
                HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
                strFaceSnapInfo.write();
                Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
                pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
                strFaceSnapInfo.read();
                sAlarmType = sAlarmType + ":人脸抓拍上传,人脸评分:" + strFaceSnapInfo.dwFaceScore + ",年龄段:" + strFaceSnapInfo.struFeature.byAgeGroup + ",性别:" + strFaceSnapInfo.struFeature.bySex;
                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); //设置日期格式
                String time = df.format(new Date()); // new Date()为获取当前系统时间
                //人脸图片写文件
                try {
                    FileOutputStream small = new FileOutputStream(System.getProperty("user.dir") + "\\pic\\" + time + "small.jpg");
                    FileOutputStream big = new FileOutputStream(System.getProperty("user.dir") + "\\pic\\" + time + "big.jpg");

                    if(strFaceSnapInfo.dwFacePicLen > 0)
                    {
                        try {
                            small.write(strFaceSnapInfo.pBuffer1.getByteArray(0, strFaceSnapInfo.dwFacePicLen), 0, strFaceSnapInfo.dwFacePicLen);
                            small.close();
                        } catch (IOException ignored) {

                        }

                    }
                    if(strFaceSnapInfo.dwFacePicLen > 0)
                    {
                        try {
                            big.write(strFaceSnapInfo.pBuffer2.getByteArray(0, strFaceSnapInfo.dwBackgroundPicLen), 0, strFaceSnapInfo.dwBackgroundPicLen);
                            big.close();
                        } catch (IOException ignored) {
                        }
                    }
                } catch (FileNotFoundException ignored) {
                }
                break;
//            case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
//                    HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM
//                break;
            default:
               //throw new IllegalStateException("Unexpected value: " + lCommand);
                System.out.println("Unexpected value: " + lCommand);
        }
        return true;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发发起飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值