欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

实时人流量监测——海康威视sdk初体验

程序员文章站 2024-01-06 20:25:53
本文主要是博主使用海康SDK进行人流量统计的摸索过程,在这里简单记录一下。 查询文档,能实现人流量统计大概有两种方式,报警或者监听, 这边我选择了监听方式,NET_DVR_StartListen_V30 这个接口,启动监听,它可以接收设备主动上传的报警信息并且支持多线程。 我们需要编写一个回调函数来 ......

 

本文主要是博主使用海康sdk进行人流量统计的摸索过程,在这里简单记录一下。

查询文档,能实现人流量统计大概有两种方式,报警或者监听,

实时人流量监测——海康威视sdk初体验

这边我选择了监听方式,net_dvr_startlisten_v30 这个接口,启动监听,它可以接收设备主动上传的报警信息并且支持多线程。

 实时人流量监测——海康威视sdk初体验

我们需要编写一个回调函数来接受数据(处理业务逻辑),

 实时人流量监测——海康威视sdk初体验

net_dvr_alarmer 是一个报警信息结构体,这边需要 comm_alarm_pdc 这个类型的数据,其实是一个宏,用来判断接受数据的类型,这里对应的结构体为net_dvr_pdc_alram_info 具体参数可以查阅文档。到这里这里大概对于sdk的调用有个了解。那么开始动手。

首先创建一个人流量demo ,导入sdk必要头文件以及相应的资源文件。

 实时人流量监测——海康威视sdk初体验

(ps:这里很多dll并不需要)

 

直接上代码:

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include "hcnetsdk.h"
 4 using namespace std;
 5 
 6 void callback messagecallback(long lcommand, net_dvr_alarmer* palarmer, char* palarminfo, dword dwbuflen, void*puser)
 7 {    
 8 
 9     cout << "进入回调" << endl;//判断一下没有进入回调  记得在设备那边设置回调的地址和端口不然会无法进入回调
10     net_dvr_pdc_alram_info strupdcalraminfo;//数据结构体
11     memcpy(&strupdcalraminfo, palarminfo, sizeof(net_dvr_pdc_alram_info));
12     switch (lcommand)//消息类型 
13     {
14         cout << lcommand << endl;
15         case comm_alarm_pdc:
16         {    
17             if (strupdcalraminfo.bymode == 0)
18             {
19                 //测试显示数据 
20                 cout << "当前时间:" << strupdcalraminfo.ustatmodeparam.strustatframe.dwrelativetime << endl;
21                 cout << "进来人数:" << strupdcalraminfo.dwenternum << endl;
22                 cout << "离开人数" << strupdcalraminfo.dwleavenum << endl;
23                 break;
24             }
25             
26         }    
27         default:break;        
28     }
29 }
30 void main() {
31     
32     net_dvr_init();// 初始化    
33     net_dvr_setconnecttime(2000, 1);//设置连接时间与重连时间        
34     net_dvr_setreconnect(10000, true);
35     long luserid;// 注册设备
36     net_dvr_deviceinfo_v30 strudeviceinfo;
37     char ip[32] = "192.168.x.64";//设备的ip地址 需要和电脑端ip在同一个网段
38     char user[32] = "xxx";//登录名
39     char userpass[32] = "xxx";//密码 不需要多说了吧 
40 
41     luserid = net_dvr_login_v30(ip, 8000, user, userpass, &strudeviceinfo);//这里端口号为8000
42     if (luserid < 0)
43     {
44         printf("login error, %d\n", net_dvr_getlasterror());//如果登录失败,这里会有原因的,可查看文档对症下药
45         net_dvr_cleanup();
46         return;
47     }
48     else
49     {
50         cout<<"login success luserid:"<< luserid <<endl;
51     }
52 
53     char localip[16] = "192.168.x.60";//本地的ip 设置回调用的 
54     
55     net_dvr_netcfg_v30 mynetcfg;//配置报警主机和端口
56     memcpy(&(mynetcfg.strualarmhostipaddr.sipv4), localip, sizeof(mynetcfg.strualarmhostipaddr.sipv4));//内存拷贝
57     cout << mynetcfg.strualarmhostipaddr.sipv4 << endl;//可以忽略
58     mynetcfg.walarmhostipport =8000;
59     bool issuccess = net_dvr_setdvrmessagecallback_v30(messagecallback, &mynetcfg);//设置报警回调函数
60     if (issuccess)
61     {
62         cout << "设置回调成功" << endl;
63     }    
64     long lhandle;//启用监听
65     lhandle = net_dvr_startlisten_v30(null, 8000, messagecallback, null);
66     if (lhandle < 0)
67     {
68         printf("net_dvr_startlisten_v30 error, %d\n", net_dvr_getlasterror());
69         net_dvr_logout(luserid);
70         net_dvr_cleanup();
71         return;
72     }
73     sleep(5000);//这里是为了测试所以写了个休眠卡主线程也可以理解为监听时长
74     if (!net_dvr_stoplisten_v30(lhandle))//结束监听
75     {
76         printf("net_dvr_stoplisten_v30 error, %d\n", net_dvr_getlasterror());
77         net_dvr_logout(luserid);
78         net_dvr_cleanup();
79         return;
80     }
81     net_dvr_logout(luserid);//注销用户
82     net_dvr_cleanup();    //释放 sdk 资源
83     return;
84 }

 

 

 实时人流量监测——海康威视sdk初体验

 

 

 

 

 

上一篇:

下一篇: