海康威视SDKjava二次开发身份证人脸识别
前言
本来一个很简单的SDK接口对接,折腾了好久;总结下原因有:
海康的SDK底层使用C++写的,我不熟悉C++;
海康Java源码示例写的是一个Swing桌面应用,我需要的是嵌入到web项目;
海康《设备网络SDK使用手册》中的示例是用C++写的;并且会出现使用手册和Java源码示例版本不匹配的情况(用手册版本高于Java源码示例版)
我的需求
使用海康认证对面设备在刷身份证和人脸识别通过后,取到身份证信息和人脸照片并且传到页面上。
代码处理
1.将SDK开发包【库文件】里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夹、ssleay32.dll、libeay32.dll文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下(我的事springboot项目,放在resources目录下),且HCNetSDKCom文件夹名不能修改。
2.HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(“E:\project\renliantext\src\main\resources\lib\HCNetSDK”, HCNetSDK.class);修改HCnetSDK的引入路径。
3.将路径:将Demo示例\4- Java 开发示例\2-报警布防监听\AlarmJavaDemo\src\alarmjavademo的demo包移植过来并且解决报错信息,就是导入包的问题 手动引入jar包或者从MAVEN再导入就好
4,写Service类,调用接口进行注册,布防。布防成功后设置报警回调函数
5,写serviceimp类,就是报警回调函数的实现在里面取到想要的数据。
下面是代码
Service类源码 里面有main方法 可以先进行测试看时候可以注册成功已经设置回到函数成功
package com.jeeplus.modules.xwhj.haikang.service;import com.jeeplus.modules.xwhj.haikang.HCNetSDK;
import com.jeeplus.modules.xwhj.haikang.Haikangimp;
import org.springframework.stereotype.Service;import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;@Service
public class Haikang {static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
static HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
static HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
static String m_sDeviceIP="192.168.19.249";//已登录设备的IP地址
static String m_sUsername="admin";//设备用户名
static String m_sPassword="xwkj0713";//设备密码static int lUserID;//用户句柄
static int lAlarmHandle;//报警布防句柄
static int lListenHandle;//报警监听句柄/* FMSGCallBack fMSFCallBack;//报警回调函数实现
AlarmJavaDemoView.FMSGCallBack_V31 fMSFCallBack_V31;*///报警回调函数实现public void logintext() {//GEN-FIRST:event_jButtonLoginActionPerformedhCNetSDK.NET_DVR_Init();//注册之前先注销已注册的用户,预览情况下不可注销if (lUserID > -1) {//先注销hCNetSDK.NET_DVR_Logout(lUserID);lUserID = -1;}//注册m_sDeviceIP = "192.168.19.249";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());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 ="xwkj0713";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 main(String[] args){*//* while (1>0){System.out.println("~");}*//*
};*/public void initMemberFlowUpload(){// 初始化hCNetSDK.NET_DVR_Init();//设置连接时间与重连时间hCNetSDK.NET_DVR_SetConnectTime(2000, 1);hCNetSDK.NET_DVR_SetReconnect(10000, true);// 注册设备-登录参数,包括设备地址、登录用户、密码等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());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_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;m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是//设备信息, 输出参数final int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);System.out.println("lUserID.size-->" + lUserID);if(lUserID< 0){System.out.println("hCNetSDK.NET_DVR_Login_V30()"+"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null));hCNetSDK.NET_DVR_Cleanup();System.out.println("注册失败");return;}//设置报警回调函数boolean callflag = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(new Haikangimp(),null );if(callflag){System.out.println("callback----success+设置回调函数成功");}//启用布防-其他报警布防参数不需要设置,不支持HCNetSDK.NET_DVR_SETUPALARM_PARAM lpSetupParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();lpSetupParam.byLevel=0;lpSetupParam.write();final int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID,lpSetupParam);if (lAlarmHandle< 0){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() {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 );// 这里毫秒}}
源码2报警回调函数实现
package com.jeeplus.modules.xwhj.haikang;
import com.jeeplus.common.utils.CacheUtils;
import com.jeeplus.modules.xwhj.familyinfo.entity.TFamilyinfo;
import com.sun.jna.Pointer;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;public class Haikangimp implements HCNetSDK.FMSGCallBack_V31 {@Override
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser ) {TFamilyinfo tFamilyinfo=new TFamilyinfo();String sAlarmType = new String();String[] newRow = new String[3];Date today = new Date();DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String[] sIP = new String[2];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);*/newRow[0] = dateFormat.format(today);String name=new String(strIDCardInfo.struIDCardCfg.byName).trim();String cardnum=new String(strIDCardInfo.struIDCardCfg.byIDNum).trim();String address=new String(strIDCardInfo.struIDCardCfg.byAddr).trim();tFamilyinfo.setHjyhm(name);tFamilyinfo.setZjhm(cardnum);tFamilyinfo.setJtmx(address);//报警类型newRow[1] = sAlarmType;//报警设备IP地址sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);newRow[2] = sIP[0];//身份证图片if (strIDCardInfo.dwPicDataLen > 0) {SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");String newName = sf.format(new Date());FileOutputStream fout;try {String filename ="D:\\Program Files\\TortoiseSVN\\bin\\xbhj\\userfiles\\1\\xwhj\\" +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 (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (strIDCardInfo.dwCapturePicDataLen > 0) {SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");String newName = sf.format(new Date());FileOutputStream fout;try {String filename = "D:\\Program Files\\TortoiseSVN\\bin\\xbhj\\userfiles\\1\\xwhj\\" +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 (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}CacheUtils.put("hkidcard",tFamilyinfo);}break;}return true;}}
以上就是全部的代码里 里面有我的项目里的一些实体类可以忽略不计。改成你自己的就好了 遇到问题的小伙伴可以看下 提供一个思路 ,毕竟对接的时候我也是一脸懵逼 研究了一段时间看到别人写的一些东西才调通设备,希望能给其他人一些帮助~~就这吧 加油了嘿嘿 = =
海康威视SDKjava二次开发身份证人脸识别相关推荐
- 项目总结25:海康威视SDK-Java二次开发-客流量分析
项目总结25:海康威视SDK-Java二次开发-客流量分析 前言 本来一个很简单的SDK接口对接,折腾了好久:总结下原因有: 海康的SDK底层使用C++写的,我不熟悉C++: 海康Java源码示例写的 ...
- 1、华为hilens二次开发_人脸识别技能实现
华为hilens二次开发_人脸识别 华为hilens二次开发_人脸识别 1.找到技能文件所在位置 2.hilens管理控制台创建技能 3.配置路径说明: 华为hilens二次开发_人脸识别 通过技能中 ...
- 微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别——基于腾讯云开发者实验项目
微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别--基于腾讯云开发者实验项目 开通腾讯云相关权限(AI人脸识别,文字识别-身份证识别) 查看API密钥 部署微信小程序 成功演示 代码包 开通腾 ...
- 论文阅读笔记(二)——牛的人脸识别,能做到吗?
论文阅读笔记(二)--牛的人脸识别,能做到吗? 论文简介 论文中文翻译:<牛的人脸识别,能做到吗?> 论文名称:<Face Recognition of Cattle: Can it ...
- 自动售卖系统开发系列——人脸识别自动售卖机三代BrotherSharp
大纲: 售卖机三代BrotherSharp的简介 售卖机三代BrotherSharp的方案介绍 #系统整体组成 #软件平台 #硬件平台 售卖机三代BrotherSharp的实现过程 ...
- 程序员用「美貌」突破二维图像的人脸识别
GitChat 作者:于航 原文: 如何利用"女装术"突破基于二维图像的人脸识别 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 首先声明,这 ...
- 海康威视SDK二次开发通过云台参数设置控制摄像机的位置
海康威视SDK二次开发通过云台参数设置控制摄像机的位置 由于最近在开发海康威视摄像头,特此记录一下通过云台参数控制摄像机的位置,我这里是通过properties配置文件输入的参数,也可以不用配置文件, ...
- 强!一个Java开发的人脸识别系统,获取人脸68个关键点(附源码)
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:多套SpringCloud/SpringBoot实 ...
- android 动态人脸识别码,Android开发中人脸识别(静态)
知道没有妹纸,你们是不会看的.先放效果图 最近,项目中需要用到人脸识别,苦于无奈,各种百度,google有关Android开发中人脸识别的内容,最终发现Android官方自带的FaceDetector ...
- 自动售卖系统开发系列——人脸识别自动售卖机二代ChingTom
大纲: 售卖机二代ChingTom的简介 售卖机二代ChingTom的方案介绍 #系统整体组成 #软件平台 #硬件平台 售卖机二代ChingTom的实现过程 #业务逻辑介绍 ...
最新文章
- 这可能是史上最全的Python算法集!
- 2013年阿里巴巴暑期实习招聘笔试题目(转)
- 热点推荐:秒杀系统架构分析与实战--转载
- 设计模式-创建型-抽象工厂
- 1026 Table Tennis (30 分) 未完成【难度: 难 / 知识点: 模拟】
- CTR深度学习模型之 DIEN(Deep Interest Evolution Network) 的理解与示例
- 微型计算机选用要点,微型计算机原理以及应用考试_new要点分析.doc
- 基于 java springboot+mybatis二手物品网站系统设计和实现
- JavaScript中对象的比较
- [转载]【深入Java虚拟机】之四:类加载机制
- 神经网络不胜语__M-P模型似可寻
- 我对秒杀在技术性上的一些看法
- PBOOT网站后太登录显示验证码错误的解决经验分享
- hfs explorer java_HFSExplorer0.23.1下载_HFS格式磁盘文件查看工具 含使用教程
- n阶方阵求逆c语言报告,n阶方阵求逆
- 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践
- zcmu1064: 计算旅途时间
- word中套用表格样式在哪里_在Word2010中,关于“套用内置表格样式”的用法,下列说法正确的是_学小易找答案...
- Swift对象存储服务
- 如果一直都没钱,还要不要感谢贫穷?