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

news2025/6/18 18:16:11

记录一下使用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";
	//	通道 默认0
    public static final int DA_HUA_SUB_CHANNEL = 0;
	//	登录状态 默认false 当登录成功后true
    public 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() {
            @Override
            public 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware ESXi 7.0 U3l Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023-03-31,发布 ESXi 7.0U…

C++轻量级Web服务器TinyWebServer源码分析之log篇

文章目录log日志篇简介一、日志类的定义与使用二、单例模式与阻塞队列的定义1、单例模式2、阻塞队列log日志篇简介 使用单例模式创建日志系统,对服务器运行状态、错误信息和访问数据进行记录,该系统可以实现按天分类,超行分类功能。其中异步…

RabbitMq图形界面创建队列操作步骤及控制台使用说明

版本:RabbitMQ 3.9.7 控台台访问路径: http://localhost:15672/#/queues 使用控制台创建队列 登录 创建队列 (1)输入自定义的队列名称 (2)其他输入参数为默认值即可 (3)点击【Add…

雷蛇灵刃18 2023原厂预装出厂Windows11系统

雷蛇系统安装完自带所有机型驱动和软件,并重建隐藏分区,还原功能 文件地址: https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 支持系列: 雷蛇灵刃16 2023 [RZ09-0483]Windows11原厂系统 雷蛇灵刃 Stealth 13 Base Model [RZ09-0310] 201…

【Unity VR开发】结合VRTK4.0:创建一个按钮(Option Button)

语录: 如同天上降魔主,真是人间太岁神。 前言: 选项按钮是一种提供多项选择选项的方法,其中只有一个按钮可以处于激活状态,激活另一个按钮时将确保组中的所有其他按钮都已停用。我们可以使用嵌套在预制件中的预制件来实…

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型,它可以在任何给定的时间,使用自然语言生成技术,生成文本、对话和文章。它不仅可以被用来编写文本,还可以用来编写语言、生成图像和视频。目前, ChatGPT已广泛应用于语言翻译、…

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA,采用先进的封装技术,能让每个元件达到最低成本。此系列采用最新的小型封装&…

RK3399平台开发系列讲解(基础篇)Linux 传统间隔定时器

🚀返回专栏总目录 文章目录 一、设置间隔定时器 setitimer()二、查询定时器状态 getitimer()三、更简单的定时接口 alarm()四、传统定时器的应用4.1、为阻塞操作设置超时4.2、性能剖析五、传统定时器的局限性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将详细…

java 泛型 万字详解(通俗易懂)

目录 一、前言 二、为什么需要泛型? 三、什么是泛型? 1.泛型的定义 : 2.泛型的作用 : 四、怎么用泛型? 1.泛型的语法 : 2. 泛型的使用 : 3.自定义泛型类 : 1 基本语法 : 2 使用细节 : 4.自定义泛型接口 : 1 基本语法 : 2 使用细…

C++-继承

继承继承的基本概念继承的概念继承的定义继承的格式继承的方式继承基类成员访问方式的变化基类与派生类的对象赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承中的静态成员菱形继承菱形虚拟继承继承的总结继承的基本概念 继承的概念 继承机制是面向对象程序设计中…

【Spring源码】 BeanFactory和FactoryBean是什么?

1、前言 面试官:“看过Spring源码吧,简单说说Spring中BeanFactory和FactoryBean的区别是什么?” 大神仙:“BeanFactory是bean工厂,FactoryBean是工厂bean”。 这么回答,等于面试官问你Spring是什么&…

如何免费使用ChatGPT 4?

自从ChatGPT发布以来,它就取得了巨大的成功。无论是常春藤法学考试还是商学院作业,ChatGPT都被用于各种试验。统计数据显示,ChatGPT每月吸引约9600万用户。随着ChatGPT的巨大成功,Open AI最近推出了它的最新版本,名为“…

Learning to Detect Human-Object Interactions 文章解读

Learning to Detect Human-Object Interactions,WACV,2018 论文下载 code:http://www.umich.edu/∼ywchao/hico/ 摘要 主要研究领域:定义了HOI detection任务:在静态图像中检测人-对象交互(HOI&#xff…

Vue路由模式为history的项目部署到Nginx

前言 对于前端工程师而言,多多少少会碰到按需加载的需求。 比如一个系统,需要用户登陆以后才能使用,对于传统的前后端未分离的情况,我们一般的处理方式是,当检测到用户未登录的时候,一般会重定向到登录页面…

JVM运行时数据区的必备知识:Java程序员不容错过

1、JVM运行时数据区概念 JVM运行时数据区是Java虚拟机在执行Java程序时所使用的内存区域。这些区域包括了以下几个部分: 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,它可以看作是当前线程…

测试1号位的自我修养

作者:京东零售 吴聪 引言 目前京东实行BigBoss机制以及积木型组织,同时现阶段再次强调了“经营”理念,以上均是比较大的组织层面的纲领和引导,核心是为了激发大家owner意识可以更好更快为公司产出价值和贡献。落到具体执行层面&…

国内大模型领域进入乱战时代

国内大模型领域进入乱战时代 2023.4.12版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 什么是大模型 大模型,又称为预训练模型、基础模型等,是指模型参数数量很大,需要大量计算资源才能训练的深度学习…

RHCE-Web服务器

请给openlab搭建web网站​ 网站需求:​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 首先创建一个名为openlab的网站: (1)在www目录下创建一个openlab文件夹:mk…

Android UI

什么是 UI 用户界面(User Interface,简称 UI,亦称使用者界面)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。软件设计可分为两个部分:编码设计与UI设计。A…

JavaScript编程实现tab选项卡切换的效果+1

之前在“圳品”信息系统使用了tab选项卡来显示信息&#xff0c;详见&#xff1a; JavaScript编程实现tab选项卡切换的效果 在tab选项卡中使用其它<div>来显示信息就出现了问题&#xff0c;乱套了&#xff0c;比如下面的这段代码&#xff1a; <!DOCTYPE html> &l…