﻿

{"id":15628,"date":"2023-10-07T11:26:40","date_gmt":"2023-10-07T02:26:40","guid":{"rendered":"https:\/\/www.bitstrong.com\/jp\/?p=15628"},"modified":"2023-12-13T10:20:12","modified_gmt":"2023-12-13T01:20:12","slug":"people-counting-enabling-people-counting","status":"publish","type":"post","link":"https:\/\/www.bitstrong.com\/jp\/people-counting-enabling-people-counting\/","title":{"rendered":"\u3010People Counting\u3011Enabling People Counting"},"content":{"rendered":"<p><strong><span style=\"font-size: 18pt;\">\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0<\/span><\/strong><\/p>\n<div>\/\/<\/div>\n<div>\/\/ Device Network SDK (People Counting)<\/div>\n<div>\/\/ Enable People Counting<\/div>\n<div>\/\/ Sample Code for Enabling People Counting<\/div>\n<div>\/\/<\/div>\n<div>\/\/<\/div>\n<div>#include &lt;iostream&gt;<\/div>\n<div>#include &#8220;Windows.h&#8221;<\/div>\n<div>#include &#8220;HCNetSDK.h&#8221;<\/div>\n<p>using namespace std;<\/p>\n<div>\/\/Time macro definition<\/div>\n<div>#define GET_YEAR(_time_)\u00a0 \u00a0 \u00a0 (((_time_)&gt;&gt;26) + 2000)<\/div>\n<div>#define GET_MONTH(_time_)\u00a0 \u00a0 \u00a0(((_time_)&gt;&gt;22) &amp; 15)<\/div>\n<div>#define GET_DAY(_time_)\u00a0 \u00a0 \u00a0 \u00a0(((_time_)&gt;&gt;17) &amp; 31)<\/div>\n<div>#define GET_HOUR(_time_)\u00a0 \u00a0 \u00a0 (((_time_)&gt;&gt;12) &amp; 31)<\/div>\n<div>#define GET_MINUTE(_time_)\u00a0 \u00a0 (((_time_)&gt;&gt;6)\u00a0 &amp; 63)<\/div>\n<p>#define GET_SECOND(_time_)\u00a0 \u00a0 (((_time_)&gt;&gt;0)\u00a0 &amp; 63)<\/p>\n<div>BOOL CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)<\/div>\n<div>{<\/div>\n<div>\u00a0 \u00a0 \/\/The following code is for reference only. Actually, directly processing data and saving file in this callback function is not suggested.<\/div>\n<p>\/\/For example, process the data in the message response API in message mode (PostMessage).<\/p>\n<div>\u00a0 \u00a0 switch(lCommand)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 case COMM_ALARM_PDC: \/\/People counting alarm information.<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_PDC_ALRAM_INFO struPDCAlarmInfo = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 memcpy(&amp;struPDCAlarmInfo, pAlarmInfo, sizeof(struPDCAlarmInfo));<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (struPDCAlarmInfo.byMode == 0) \/\/0-Real-time statistics, real-time quantity is calculated after the latest clearing (including device reboot, manual clearing or auto clearing at 00:00 of every day).<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_TIME\u00a0 struAbsTime = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwYear = GET_YEAR(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwMonth = GET_MONTH(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwDay = GET_DAY(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwHour = GET_HOUR(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwMinute = GET_MINUTE(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/div>\n<p>struAbsTime.dwSecond = GET_SECOND(struPDCAlarmInfo.uStatModeParam.struStatFrame.dwAbsTime);<\/p>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/Device IP address, port, channel, people exited, people entered, VCA alarm or not, absolute time<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;DevIP:[%s]Port[%d]Channel[%d]single frame:Channel[%d]LeaveNum[%d]EnterNum[%d]Smart[%d]\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 AbsTime[%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d]\\n&#8221;, struPDCAlarmInfo.struDevInfo.struDevIP.sIpV4, \\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.struDevInfo.wPort, struPDCAlarmInfo.struDevInfo.byChannel, \\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.byChannel, struPDCAlarmInfo.dwLeaveNum, struPDCAlarmInfo.dwEnterNum,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.bySmart, struAbsTime.dwYear, struAbsTime.dwMonth, struAbsTime.dwDay,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwHour, struAbsTime.dwMinute, struAbsTime.dwSecond);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (struPDCAlarmInfo.byMode == 1) \/\/1-Periodic statistics, increased quantity within specific statistics period, update once per specified statistics period (default: 15 minutes, minimum: 1 minute and maximum: 60 minutes)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_TIME\u00a0 struStartTime = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_TIME\u00a0 struEndTime = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struStartTime = struPDCAlarmInfo.uStatModeParam.struStatTime.tmStart;<\/div>\n<p>struEndTime = struPDCAlarmInfo.uStatModeParam.struStatTime.tmEnd;<\/p>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/Device IP address, port, channel, people exited, people entered, people passed, VCA alarm or not, start time, end time<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;DevIP:[%s]Port[%d]Channel[%d]single frame:Channel[%d]LeaveNum[%d]EnterNum[%d]PassingNum[%d]Smart[%d]\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 StartTime[%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d]EndTime[%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d]\\n&#8221;,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.struDevInfo.struDevIP.sIpV4, struPDCAlarmInfo.struDevInfo.wPort,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.struDevInfo.byChannel, struPDCAlarmInfo.byChannel, struPDCAlarmInfo.dwLeaveNum,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struPDCAlarmInfo.dwEnterNum, struPDCAlarmInfo.dwPassingNum, struPDCAlarmInfo.bySmart, struStartTime.dwYear,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struStartTime.dwMonth, struStartTime.dwDay, struStartTime.dwHour, struStartTime.dwMinute,\\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struStartTime.dwSecond, struEndTime.dwYear, struEndTime.dwMonth, struEndTime.dwDay, struEndTime.dwHour, \\<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struEndTime.dwMinute, struEndTime.dwSecond);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/Process other information<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;<\/div>\n<div>}<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 default:<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;Other alarms, alarm type: 0x%x\\n&#8221;, lCommand);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>}<\/div>\n<div>\u00a0 \u00a0 return TRUE;<\/div>\n<p>}<\/p>\n<div>void main() {<\/div>\n<div>\u00a0 \u00a0 \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\u00a0 \u00a0 \/\/ Initialize<\/div>\n<div>\u00a0 \u00a0 NET_DVR_Init();<\/div>\n<div>\u00a0 \u00a0 \/\/Set connected time and reconnected time<\/div>\n<div>\u00a0 \u00a0 NET_DVR_SetConnectTime(2000, 1);<\/div>\n<p>NET_DVR_SetReconnect(10000, true);<\/p>\n<div>\u00a0 \u00a0 \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\u00a0 \u00a0 \/\/ Log in to device<\/div>\n<p>LONG lUserID;<\/p>\n<div>\u00a0 \u00a0 \/\/Login parameters, including device IP address, user name, password, and so on.<\/div>\n<div>\u00a0 \u00a0 NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};<\/div>\n<div>\u00a0 \u00a0 struLoginInfo.bUseAsynLogin = 0; \/\/Synchronous login mode<\/div>\n<div>\u00a0 \u00a0 strcpy(struLoginInfo.sDeviceAddress, &#8220;192.0.0.64&#8221;); \/\/IP address<\/div>\n<div>\u00a0 \u00a0 struLoginInfo.wPort = 8000; \/\/Service port<\/div>\n<div>\u00a0 \u00a0 strcpy(struLoginInfo.sUserName, &#8220;admin&#8221;); \/\/User name<\/div>\n<p>strcpy(struLoginInfo.sPassword, &#8220;abcd1234&#8221;); \/\/Password<\/p>\n<div>\u00a0 \u00a0 \/\/Device information, output parameter<\/div>\n<div>\u00a0 \u00a0 NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};<\/div>\n<p>lUserID = NET_DVR_Login_V40(&amp;struLoginInfo, &amp;struDeviceInfoV40);<\/p>\n<div>\u00a0 \u00a0 if (lUserID &lt; 0)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;Login failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Cleanup();<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 return;<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Set alarm callback function<\/div>\n<p>NET_DVR_SetDVRMessageCallBack_V31(MessageCallback, NULL);<\/p>\n<div>\u00a0 \u00a0 \/\/Enable arming<\/div>\n<div>\u00a0 \u00a0 LONG lHandle;<\/div>\n<div>\u00a0 \u00a0 NET_DVR_SETUPALARM_PARAM\u00a0 struAlarmParam={0};<\/div>\n<div>\u00a0 \u00a0 struAlarmParam.dwSize=sizeof(struAlarmParam);<\/div>\n<p>\/\/Setting other arming parameters is not supported.<\/p>\n<div>\u00a0 \u00a0 lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, &amp; struAlarmParam);<\/div>\n<div>\u00a0 \u00a0 if (lHandle &lt; 0)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_SetupAlarmChan_V41 error, %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Logout(lUserID);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Cleanup();<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 return;<\/div>\n<p>}<\/p>\n<div>Sleep(50000);<\/div>\n<p>\/\/During waiting, if the device uploaded alarm information, receive and handle the alarm information in the alarm callback function.<\/p>\n<div>\u00a0 \u00a0 \/\/Close uploading channel to disarm.<\/div>\n<div>\u00a0 \u00a0 if (!NET_DVR_CloseAlarmChan_V30(lHandle))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_CloseAlarmChan_V30 error, %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Logout(lUserID);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Cleanup();<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 return;<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Log out<\/div>\n<div>\u00a0 \u00a0 NET_DVR_Logout(lUserID);<\/div>\n<div>\u00a0 \u00a0 \/\/Release SDK resource<\/div>\n<div>\u00a0 \u00a0 NET_DVR_Cleanup();<\/div>\n<div>\u00a0 \u00a0 return;<\/div>\n<div>}<\/div>\n","protected":false},"excerpt":{"rendered":"\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0 \/\/ \/\/ Device Network SDK (People Counting) \/\/ Enable People Counting \/\/ Sample Code for Enabling People Counting \/\/ \/\/ #include &lt;iostream&gt;...","protected":false},"author":2,"featured_media":15936,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[107],"tags":[],"class_list":["post-15628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-camera-connection"],"_links":{"self":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/comments?post=15628"}],"version-history":[{"count":3,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15628\/revisions"}],"predecessor-version":[{"id":15773,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15628\/revisions\/15773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media\/15936"}],"wp:attachment":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media?parent=15628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/categories?post=15628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/tags?post=15628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}