经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
实时人流量监测——海康威视sdk初体验
来源:cnblogs  作者:平凡键客  时间:2019/11/14 8:43:15  对本文有异议

 

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

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

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

 

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

 

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

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

 

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

 

直接上代码:

  1. 1 #include <stdio.h>
  2. 2 #include <iostream>
  3. 3 #include "HCNetSDK.h"
  4. 4 using namespace std;
  5. 5
  6. 6 void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER* pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void*pUser)
  7. 7 {
  8. 8
  9. 9 cout << "进入回调" << endl;//判断一下没有进入回调 记得在设备那边设置回调的地址和端口不然会无法进入回调
  10. 10 NET_DVR_PDC_ALRAM_INFO struPdcALramInfo;//数据结构体
  11. 11 memcpy(&struPdcALramInfo, pAlarmInfo, sizeof(NET_DVR_PDC_ALRAM_INFO));
  12. 12 switch (lCommand)//消息类型
  13. 13 {
  14. 14 cout << lCommand << endl;
  15. 15 case COMM_ALARM_PDC:
  16. 16 {
  17. 17 if (struPdcALramInfo.byMode == 0)
  18. 18 {
  19. 19 //测试显示数据
  20. 20 cout << "当前时间:" << struPdcALramInfo.uStatModeParam.struStatFrame.dwRelativeTime << endl;
  21. 21 cout << "进来人数:" << struPdcALramInfo.dwEnterNum << endl;
  22. 22 cout << "离开人数" << struPdcALramInfo.dwLeaveNum << endl;
  23. 23 break;
  24. 24 }
  25. 25
  26. 26 }
  27. 27 default:break;
  28. 28 }
  29. 29 }
  30. 30 void main() {
  31. 31
  32. 32 NET_DVR_Init();// 初始化
  33. 33 NET_DVR_SetConnectTime(2000, 1);//设置连接时间与重连时间
  34. 34 NET_DVR_SetReconnect(10000, true);
  35. 35 LONG lUserID;// 注册设备
  36. 36 NET_DVR_DEVICEINFO_V30 struDeviceInfo;
  37. 37 char ip[32] = "192.168.x.64";//设备的IP地址 需要和电脑端ip在同一个网段
  38. 38 char user[32] = "xxx";//登录名
  39. 39 char userPass[32] = "xxx";//密码 不需要多说了吧
  40. 40
  41. 41 lUserID = NET_DVR_Login_V30(ip, 8000, user, userPass, &struDeviceInfo);//这里端口号为8000
  42. 42 if (lUserID < 0)
  43. 43 {
  44. 44 printf("Login error, %d\n", NET_DVR_GetLastError());//如果登录失败,这里会有原因的,可查看文档对症下药
  45. 45 NET_DVR_Cleanup();
  46. 46 return;
  47. 47 }
  48. 48 else
  49. 49 {
  50. 50 cout<<"Login success lUserID:"<< lUserID <<endl;
  51. 51 }
  52. 52
  53. 53 char localIP[16] = "192.168.x.60";//本地的Ip 设置回调用的
  54. 54
  55. 55 NET_DVR_NETCFG_V30 myNETCFG;//配置报警主机和端口
  56. 56 memcpy(&(myNETCFG.struAlarmHostIpAddr.sIpV4), localIP, sizeof(myNETCFG.struAlarmHostIpAddr.sIpV4));//内存拷贝
  57. 57 cout << myNETCFG.struAlarmHostIpAddr.sIpV4 << endl;//可以忽略
  58. 58 myNETCFG.wAlarmHostIpPort =8000;
  59. 59 BOOL isSuccess = NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, &myNETCFG);//设置报警回调函数
  60. 60 if (isSuccess)
  61. 61 {
  62. 62 cout << "设置回调成功" << endl;
  63. 63 }
  64. 64 LONG lHandle;//启用监听
  65. 65 lHandle = NET_DVR_StartListen_V30(NULL, 8000, MessageCallback, NULL);
  66. 66 if (lHandle < 0)
  67. 67 {
  68. 68 printf("NET_DVR_StartListen_V30 error, %d\n", NET_DVR_GetLastError());
  69. 69 NET_DVR_Logout(lUserID);
  70. 70 NET_DVR_Cleanup();
  71. 71 return;
  72. 72 }
  73. 73 Sleep(5000);//这里是为了测试所以写了个休眠卡主线程也可以理解为监听时长
  74. 74 if (!NET_DVR_StopListen_V30(lHandle))//结束监听
  75. 75 {
  76. 76 printf("NET_DVR_StopListen_V30 error, %d\n", NET_DVR_GetLastError());
  77. 77 NET_DVR_Logout(lUserID);
  78. 78 NET_DVR_Cleanup();
  79. 79 return;
  80. 80 }
  81. 81 NET_DVR_Logout(lUserID);//注销用户
  82. 82 NET_DVR_Cleanup(); //释放 SDK 资源
  83. 83 return;
  84. 84 }

 

 

 

 

 

 

 

 

原文链接:http://www.cnblogs.com/arvinhuang/p/11854423.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号