当前位置: 首页 > news >正文

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot+大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

首先根据说明书登录摄像头,一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345),有IP的(可能是192.168.1.108),在同一个网段内浏览器访问摄像头的IP就可以访问web页面

使用windows系统自带的浏览器Microsoft Edge 谷歌浏览器也可以,主要是要安装插件
myw
myw
下载安装插件(如果电脑之前安装过就可以不用安装)
myw
myw
myw
安装完成之后 重启浏览器登录(更保险)
可能有提示要加载,那就允许
myw
myw
myw
设置人流量统计的相关参数
首先在设置 智能方案里把图标点亮
myw
在设置-人数统计里选择人数统计
myw
绘制区域和绘制方向线 绘制区域表示人流统计的区域,只有这个区域内的才统计的,绘制方向线,这个默认是入的方向线
参数设置进入和离开人数需要打钩,灵敏度这个的配置需要根据实际来确认 人数统计报警的进入人数和离开人数需要设置成1,滞留人数不需要设置(这样用程序去监听的时候就能被动获取报警数据)
myw
myw
布撤防配置
myw

标定配置 安装高度和安装角度
myw
自动维护配置 这个很关键,必须要配置,不然这个摄像头运行时间过长会被卡死的,可能是数据满了
myw
网络设置 根据实际需求设置IP地址
myw

首先去官网拿到开发需要的SDK

https://support.dahuatech.com/tools/sdkExploit

myw
新建一个SpringBoot项目后调用sdk,在这里使用的是win10 64位的,sdk需要重新封装,去除gui方面的那部分代码
SpringBoot调用sdk的核心代码

DaHuaConstantConfig .java


public class DaHuaConstantConfig {//	摄像头的IP地址public static final String DA_HUA_IP= "192.168.1.108";//	摄像头的获取人流数据的端口是37777 不是80端口 这里有坑public static final int DA_HUA_PORT = 37777;//	登录的账号public static final String DA_HUA_ADMIN = "admin";//	登录的密码public static final String DA_HUA_PASSWORD = "admin";//	通道 默认0public static final int DA_HUA_SUB_CHANNEL = 0;//	登录状态 默认false 当登录成功后truepublic static boolean DA_HUA_LOGIN_STATE = false;//	自定义状态public static boolean DA_HUA_SUB_STATE = false;
}

DaHuaDisConnectCallBack.java


import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;//  设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数public class DaHuaDisConnectCallBack implements NetSDKLib.fDisConnect {private final Logger log =  LoggerFactory.getLogger(this.getClass());public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {log.error("Device:"+pchDVRIP+"Port:"+nDVRPort+"-DisConnectCallBack");DaHuaConstantConfig.DA_HUA_LOGIN_STATE = false;DaHuaConstantConfig.DA_HUA_SUB_STATE = false;// 断线提示}}

DaHuaHaveReConnectCallBack.java


import com.netsdk.demo.module.VideoStateSummaryModule;
import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;// 网络连接恢复,设备重连成功回调
// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数public class DaHuaHaveReConnectCallBack implements NetSDKLib.fHaveReConnect {private final Logger log =  LoggerFactory.getLogger(this.getClass());public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {log.error("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);DaHuaConstantConfig.DA_HUA_LOGIN_STATE = true;// 断线后需要重新订阅ExecutorService service = Executors.newSingleThreadExecutor();service.execute(new Runnable() {@Overridepublic void run() {log.warn("Reconnect Device ReAttache next");if (VideoStateSummaryModule.getM_hAttachMap().size() > 0) {   // 如果断前正在订阅// 重订阅事件log.warn("Reconnect Device ReAttache need");VideoStateSummaryModule.reAttachAllVideoStatSummary(DaHuaNetSdkManCountThread.humanNumberStatisticCB);DaHuaConstantConfig.DA_HUA_SUB_STATE = true;}}});service.shutdown();}
}

DaHuaHumanNumberStatisticCallBack .java


import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;// 人流统计数据回调
public class DaHuaHumanNumberStatisticCallBack implements NetSDKLib.fVideoStatSumCallBack {private final Logger log =  LoggerFactory.getLogger(this.getClass());public void invoke(NetSDKLib.LLong lAttachHandle, NetSDKLib.NET_VIDEOSTAT_SUMMARY stVideoState, int dwBufLen, Pointer dwUser) throws ParseException {try {//	 自定义接收的类CsRecordHumanNumber csRecordHumanNumber = new CsRecordHumanNumber();csRecordHumanNumber.setEnteredToday(stVideoState.stuEnteredSubtotal.nToday); // 当日进入的人数csRecordHumanNumber.setEnteredHour(stVideoState.stuEnteredSubtotal.nHour);// 单位小时内进入的人数csRecordHumanNumber.setEnteredTotal(stVideoState.stuEnteredSubtotal.nTotal);// 设备运行后进入的总人数csRecordHumanNumber.setExitedToday(stVideoState.stuExitedSubtotal.nToday);// 当日出去的人数csRecordHumanNumber.setExitedHour(stVideoState.stuExitedSubtotal.nHour);// 单位小时内出去的人数csRecordHumanNumber.setExitedTotal(stVideoState.stuExitedSubtotal.nTotal);//	设备运行后出去的总人数log.info(csRecordHumanNumber.toString());// to do 把数据传给Spring去插入数据库或者其他处理} catch (IOException e) {e.printStackTrace();}}}

DaHuaNetSdkManCountThread.java 创建连接的线程类


import com.netsdk.demo.module.LoginModule;
import com.netsdk.demo.module.VideoStateSummaryModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class DaHuaNetSdkManCountThread extends Thread {private static final Logger log =  LoggerFactory.getLogger(DaHuaNetSdkManCountThread.class);// 设备断线通知回调private static final DaHuaDisConnectCallBack disConnectCB = new DaHuaDisConnectCallBack();// 网络连接恢复private static final DaHuaHaveReConnectCallBack haveReConnectCB = new DaHuaHaveReConnectCallBack();// 人数统计回调事件public static DaHuaHumanNumberStatisticCallBack humanNumberStatisticCB = new DaHuaHumanNumberStatisticCallBack();public void run(){System.out.println(Thread.currentThread().getName()+" NetSdk");if(LoginModule.init(disConnectCB, haveReConnectCB)){login();}}// 登录public static boolean login() {if (LoginModule.login(DaHuaConstantConfig.DA_HUA_IP, DaHuaConstantConfig.DA_HUA_PORT, DaHuaConstantConfig.DA_HUA_ADMIN, DaHuaConstantConfig.DA_HUA_PASSWORD)) {int chanNum = LoginModule.m_stDeviceInfo.byChanNum;log.info("da-hua-sdk-login success:"+chanNum);DaHuaConstantConfig.DA_HUA_LOGIN_STATE = true;if (!VideoStateSummaryModule.channelAttached(DaHuaConstantConfig.DA_HUA_SUB_CHANNEL)) {if (VideoStateSummaryModule.attachVideoStatSummary(DaHuaConstantConfig.DA_HUA_SUB_CHANNEL, humanNumberStatisticCB)) {log.info("da-hua-sdk human number open:");DaHuaConstantConfig.DA_HUA_SUB_STATE = true;} else {DaHuaConstantConfig.DA_HUA_SUB_STATE = false;}}return true;}return false;}
}

放在SpringBoot启动页面内启动

DaHuaNetSdkManCountThread daHuaNetSdkManCountThread = new DaHuaNetSdkManCountThread();
daHuaNetSdkManCountThread.start();

启动后控制台输出

08:41:39.142 spring-boot-logging [main] INFO  o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
08:41:39.166 spring-boot-logging [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8780"]
08:41:39.188 spring-boot-logging [main] INFO  o.a.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
08:41:39.217 spring-boot-logging [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8780 (http) with context path ''
08:41:39.223 spring-boot-logging [main] INFO  com.lavatory.CloudRoomApplication - Started CloudRoomApplication in 6.143 seconds (JVM running for 7.822)
Thread-4 NetSdk
load library: C:\Users\18380\AppData\Local\Temp\dhnetsdk.dll
C:/DevelopSpace/ZexinSpaces/smart-lavatory-system/lavatory-client/lavatory-client-terminal/libs/win64/
load library: C:\Users\18380\AppData\Local\Temp\dhnetsdk.dll
dhnetsdk----C:\Users\18380\AppData\Local\Temp\dhnetsdk.dll
load library: C:\Users\18380\AppData\Local\Temp\dhconfigsdk.dll
dhconfigsdk----C:\Users\18380\AppData\Local\Temp\dhconfigsdk.dll
arch-amd64--name-Windows 10
arch-amd64--name-Windows 10
load library: C:\Users\18380\AppData\Local\Temp\dhconfigsdk.dll
Login Success [ 192.168.1.108 ]
08:41:44.239 spring-boot-logging [Thread-4] INFO  c.l.d.n.DaHuaNetSdkManCountThread - da-hua-sdk-login success:1
Attach Succeed at Channel 0 ! AttachHandle: 681853824. Wait Device Notify Information
08:41:44.847 spring-boot-logging [Thread-4] INFO  c.l.d.n.DaHuaNetSdkManCountThread - da-hua-sdk human number open:
08:43:30.676 spring-boot-logging [Thread-6] INFO  c.l.d.n.DaHuaHumanNumberStatisticCallBack - CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=63, exitedHour=17, exitedTotal=2268)
CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=63, exitedHour=17, exitedTotal=2268)
08:43:37.655 spring-boot-logging [Thread-8] INFO  c.l.d.n.DaHuaHumanNumberStatisticCallBack - CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=64, exitedHour=18, exitedTotal=2269)
CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=64, exitedHour=18, exitedTotal=2269)

这个就是从摄像头设备里取到的客流统计值

CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=63, exitedHour=17, exitedTotal=2268)
CsRecordHumanNumber(enteredToday=68, enteredHour=18, enteredTotal=2278, exitedToday=64, exitedHour=18, exitedTotal=2269)

相关文章:

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头,一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345),…...

DC插装式流量阀压力阀

Cartridge Valves 电磁阀 止回阀 运动控制阀 流量控制阀 溢流阀 压力控制阀 顺序阀 梭阀 方向阀 配件 Zero Profile Valves 止回阀 运动控制阀 流量控制阀 溢流阀 梭阀 In-Line Valves 止回阀和梭阀 方向阀 配件 微型系列 AB20S APIDC-30S C10B C10S C10S…...

NumPy 数组学习手册:6~7

原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 译者:飞龙 六、性能分析,调试和测试 分析,调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…...

【笔试强训选择题】Day6.习题(错题)解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、Day6习题(错题)解析 二、Day6习题(原题)练习 总结 前言 一、Day6习题(错题)解析…...

磁盘分区-LINUX

1、主分区(primary) 磁盘在Linux当中的命名: IDE /dev/hda hdb SCSI sda sdb 分区数字表示:sda1 、sda2、sda3 磁盘分区相当于给磁盘打隔断 ① 系统中必须要存在的分区,系统盘选择主分区安装 ② 数字编号只能是1-4&am…...

SpringAOP入门基础银行转账实例(进阶版)------------事务处理

SpringAOP入门基础银行转账实例**(进阶版)**------------事务处理 由上一节讲述的通过Connection和QueryRunner对事务进行的处理(详情可以去我之前写的博客文章:https://blog.csdn.net/m0_56245143/article/details/130069160?spm1001.2014…...

【python学习】基础篇-常用函数-format函数 格式化操作

format()可以对数据进行格式化处理操作,语法如下: format(value,format_spec) value 为要转换的数据,fommat spec 为格式化解释, 当参数 format spec 为空时,等同于函数 str(value)的方式。 format spec 可以设置非常复…...

团团面试经验

1、Redis同时访问大量不存在的key会发生什么? 如果是缓存和数据库中都不存在,那么就会发生缓存穿透。 举个例子:某个黑客故意制造一些非法的 key 发起大量请求,导致大量请求落到数据库,结果数据库上也没有查到对应的数…...

今天面了个京东拿 38K 出来的,让我见识到了基础的天花板

今年的春招已经开始了,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的软件测试面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好&#xff0…...

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库) 一、项目场景 在日常的项目中,我们经常会遇到调用别人的数学库、线程库、图形库等操作。这些库通常就被称为SDK,SDK全称是Software Development Kit(软件开发工具包),…...

400以内的蓝牙耳机哪款好?400以内蓝牙耳机排行榜

谈起TWS,无论是传统的音频厂商还是手机厂商,都是其不可或缺的重要产品线,现在很多许多蓝牙耳机都不是千篇一律得形状,市场也鲜有商家在外观上下功夫,下面分享几款400元以内,内外兼具的耳机品牌。 一、南卡…...

基于飞桨实现的特定领域知识图谱融合方案:ERNIE-Gram文本匹配算法

文本匹配任务在自然语言处理领域中是非常重要的基础任务,一般用于研究两段文本之间的关系。文本匹配任务存在很多应用场景,如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重、文本相似度计算、自然语言推理、问答系统、信息检索等&…...

前端基础复习

1.什么叫HTML5&#xff1f;和原本的所说的HTML有什么区别&#xff1f; 本质上html和html5是一样的的。区别有&#xff1a; 1. 在文档类型声明上 HTML4.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loos…...

Vue2 API-源码解析

目录 Vue.extend(option) delimiters functional Vue.component(id, Function | Object) Vue.directive( id, [definition] ) Vue.filter( id, function) Vue.nextTick() Vue.set() Vue.delete(target, index/key) Vue.compile(template) Vue.observable(object) …...

FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization

FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization 论文地址&#xff1a;https://arxiv.org/pdf/2303.14189.pdf 概述 本文提出了一种通用的 CNN 和 Transformer 混合的视觉基础模型 移动设备和 ImageNet 数据集上的精度相同的前提下&#xf…...

C/C++文档阅读笔记-A Simple Makefile Tutorial解析

Makefile文件可以使得程序编译变得简单。本博文并不是很系统的讲解makefile&#xff0c;本博文的目标是让读者快速编写自己的makefile文件并能应用到中小项目中。 简单实例 举个例子有下面3个文件&#xff0c;分别是hellomake.c&#xff0c;hellofunc.c&#xff0c;hellomake.…...

GraphSAGE的基础理论

文章目录GraphSAGE原理&#xff08;理解用&#xff09;GraphSAGE工作流程GraphSAGE的实用基础理论&#xff08;编代码用&#xff09;1. GraphSAGE的底层实现&#xff08;pytorch&#xff09;PyG中NeighorSampler实现节点维度的mini-batch GraphSAGE样例PyG中的SAGEConv实现2. …...

Windows 安装 GDAL C++库

Windows 安装 GDAL C库1. 方法1&#xff1a;下载配置网友编译的GDAL版本1.1 下载1.2 配置1.3 测试1.4 缺点2. 方法2&#xff1a;自己编译3. 参考1. 方法1&#xff1a;下载配置网友编译的GDAL版本 1.1 下载 CSDN: GDAL&#xff0c;geos联合编译的库&#xff0c;版本为1.8.0&am…...

二叉树基础概念

1.二叉树种类 1.1 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为 0 0 0 的结点和度为 2 2 2 的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为 k k k&…...

【MySQL】(1)数据库基础,库与表的增删查改,数据库的备份与还原

文章目录服务器&#xff0c;数据库&#xff0c;表关系MySQL 数据存储逻辑SQL 分类存储引擎库的操作查看数据库创建数据库查看创建语句删除数据库选择&#xff08;切换&#xff09;数据库查看当前选择的数据库修改数据库字符集和排序规则表的操作创建表查询表查询表结构插入数据…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...