赞
踩
我采用的是 报警布防方式 SDK版本为 CH-HCNetSDKV6.1.9.48_build20230410_win32
如何引用dll 我用的是jna 就不描述了 SDK在官网自行下载 以下代码亲测可用 自行参考~
虚线框的内容是可选的,设备事先安装配置好,能力集和配置接口可不调用,不会影响其他接口功能的使用。
初始化+登录
- private boolean init(String ip, int port, String userName, String password) {
- /**加载日志*/
- if (!NET_DVR_Init()) {
- logger.error("摄像头初始化失败!错误码为" + hCNetSDK.NET_DVR_GetLastError());
- return false;
- }
- hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
- userId = NET_DVR_Login_V30(ip, port, userName, password);
- if (userId > -1) {
- isinitialized = true;
- }
- return isinitialized;
- }
设置回调+布防
- public boolean licensePlateRecognition(CarNumRecognizerConfig carNumRecognizerConfig) {
- logger.debug("*********************licensePlateRecognition**************************");
- String ip = carNumRecognizerConfig.getCarNumRecognizerIP();
- int port = carNumRecognizerConfig.getPort();
- String userName = carNumRecognizerConfig.getUserName();
- String password = carNumRecognizerConfig.getPassword();
- if (StringUtil.isNotBlank(carNumRecognizerConfig.getEncoding())) {
- encode = carNumRecognizerConfig.getEncoding();
- }
- if (StringUtil.isNotBlank(carNumRecognizerConfig.getImageDir())) {
- imageDirPath = carNumRecognizerConfig.getImageDir();
- }
- if (!init(ip, port, userName, password)) {
- logger.error("摄像头初始化失败!");
- return false;
- }
- carNumRecognizerDevices = deviceManager.getCarNumRecognizerDevices();
- //设置连接时间与重连时间
- hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
- hCNetSDK.NET_DVR_SetReconnect(100000, true);
- //设备信息, 输出参数
- //设置报警回调函数
- if (fMSFCallBack_V31 == null) {
- fMSFCallBack_V31 = new FMSGCallBack_V31();
- String UserData = "UserData";
- HCNetSDK.BYTE_ARRAY UserDataByte = new HCNetSDK.BYTE_ARRAY(25);
- UserDataByte.read();
- UserDataByte.byValue = UserData.getBytes();
- UserDataByte.write();
- Pointer pUserDataByte = UserDataByte.getPointer();
-
- if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUserDataByte)) {
- logger.error("设置回调函数失败!+" + hCNetSDK.NET_DVR_GetLastError());
- return false;
- } else {
- logger.info("设置回调函数成功!");
- }
- }
- HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
- struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离
- struNET_DVR_LOCAL_GENERAL_CFG.write();
- Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer();
- hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG);
- //尚未布防,需要布防
- if (lAlarmHandle < 0) {
- //报警布防参数设置
- HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
- m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
- m_strAlarmInfo.byLevel = 0; //布防等级
- m_strAlarmInfo.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
- m_strAlarmInfo.byDeployType = 1; //布防类型:0-客户端布防,1-实时布防
- m_strAlarmInfo.write();
- lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(Integer.valueOf(userId + ""), m_strAlarmInfo);
- logger.info("lAlarmHandle: " + lAlarmHandle);
- if (lAlarmHandle == -1) {
- logger.info("布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
- return false;
- } else {
- logger.info("布防成功");
-
- }
- } else {
- logger.info("设备已经布防,请先撤防!");
- }
- return true;
- }
回调
- public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
- //报警信息回调函数
- public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
- logger.info("报警事件类型: lCommand:" + Integer.toHexString(lCommand));
- //lCommand是传的报警类型
- switch (lCommand) {
- case 3058:
- logger.info("报警事件类型: 0x3058 车辆黑白名单数据需要同步报警上传");
- case HCNetSDK.COMM_UPLOAD_PLATE_RESULT:
- logger.info("报警事件类型: COMM_UPLOAD_PLATE_RESULT");
- case HCNetSDK.COMM_ITS_PLATE_RESULT://交通抓拍结果(新报警信息)
- logger.info("报警事件类型: COMM_ITS_PLATE_RESULT");
- HCNetSDK.NET_ITS_PLATE_RESULT strItsPlateResult = new HCNetSDK.NET_ITS_PLATE_RESULT();
- strItsPlateResult.write();
- Pointer pItsPlateInfo = strItsPlateResult.getPointer();
- pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size());
- strItsPlateResult.read();
- try {
- String sLicense = new String(strItsPlateResult.struPlateInfo.sLicense, encode);
- String carNum = StringUtil.extractTheLicensePlateNumber(sLicense);//这个方法是提取车牌号 因为我接收到的车牌号会带颜色在前面 比如 蓝京A---- 这样子
- logger.info("识别车号:{},提取车号:{}",sLicense,carNum);
- CarNumRecognizerResult carNumRecognizerResult = new CarNumRecognizerResult();
- carNumRecognizerResult.setCarNum(carNum);
- boolean isOK = carNumRecognizerDevices.notifyCarNumResult(carNumRecognizerResult);
- logger.info("isOK:::" + isOK);
- } catch (UnsupportedEncodingException e1) {
- e1.printStackTrace();
- logger.error(e1.getMessage(),e1);
- } catch (IOException e) {
- e.printStackTrace();
- logger.error(e.getMessage(),e);
- }
- /**
- * 报警图片保存,车牌,车辆图片
- */
- if (StringUtil.isNotBlank(imageDirPath)){
- File imageDir = new File(imageDirPath);
- if(!imageDir.exists() || !imageDir.isDirectory()){
- imageDir.mkdirs();
- }
- for (int i = 0; i < strItsPlateResult.dwPicNum; i++) {
- if (strItsPlateResult.struPicInfo[i].dwDataLen > 0) {
- String baseName = DateUtil.getTimeStr((int)(System.currentTimeMillis()/1000), "yyyyMMddHHmmss");
- File imageFile = getImageFilePath(i+"", baseName, imageDir);
- FileOutputStream fout;
- try {
- fout = new FileOutputStream(imageFile);
- //将字节写入文件
- long offset = 0;
- ByteBuffer buffers = strItsPlateResult.struPicInfo[i].pBuffer.getByteBuffer(offset, strItsPlateResult.struPicInfo[i].dwDataLen);
- byte[] bytes = new byte[strItsPlateResult.struPicInfo[i].dwDataLen];
- buffers.rewind();
- buffers.get(bytes);
- fout.write(bytes);
- fout.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- break;
- default:
- logger.info("报警类型:" + Integer.toHexString(lCommand));
- break;
- }
- return true;
- }
- }
重点是这里 我起初选择0 就不起作用 可能是客户端没配置好?不懂
m_strAlarmInfo.byDeployType = 1; //布防类型:0-客户端布防,1-实时布防
总结两点:
1 确认摄像机客户端中可以识别到车号!!!
2 确认使用哪种布防!!!
再提一嘴 我个人认为海康的车牌识别做的不好,因为我开发其他车牌识别产品 例如文通、VM、大华 这些设备的车牌识别都是采用自动识别 主动推送的方式到http接口 更好处理 还不占资源。
海康也有监听方法 但我没研究明白 不会用..
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。