实时人流量监测——海康威视sdk初体验
程序员文章站
2022-03-15 08:47:51
本文主要是博主使用海康SDK进行人流量统计的摸索过程,在这里简单记录一下。 查询文档,能实现人流量统计大概有两种方式,报警或者监听, 这边我选择了监听方式,NET_DVR_StartListen_V30 这个接口,启动监听,它可以接收设备主动上传的报警信息并且支持多线程。 我们需要编写一个回调函数来 ......
本文主要是博主使用海康sdk进行人流量统计的摸索过程,在这里简单记录一下。
查询文档,能实现人流量统计大概有两种方式,报警或者监听,
这边我选择了监听方式,net_dvr_startlisten_v30 这个接口,启动监听,它可以接收设备主动上传的报警信息并且支持多线程。
我们需要编写一个回调函数来接受数据(处理业务逻辑),
net_dvr_alarmer 是一个报警信息结构体,这边需要 comm_alarm_pdc 这个类型的数据,其实是一个宏,用来判断接受数据的类型,这里对应的结构体为net_dvr_pdc_alram_info 具体参数可以查阅文档。到这里这里大概对于sdk的调用有个了解。那么开始动手。
首先创建一个人流量demo ,导入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 }
推荐阅读