本文主要是博主使用海康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 }