海康威视多维客流统计摄像机isapi开发踩坑

433 阅读6分钟

前期莫名报错

官方至今未给出正确答案 1.png

官方最终答复

您好~

  1. 流程可以参考文档中的8.5.1章节,先通过GET /ISAPI/System/Video/inputs/channels/1/counting/search/capabilities获取输入参数的能力集。
    之后调用POST /ISAPI/System/Video/inputs/channels/1/counting/search查询。

接口返回参数,能力集参考文档里19.4.1.33章节,
POST查询接口,文档中没有搜索到,我附件形式提供给你。

  1. POSTMAN工具测试,报错deviceError设备错误,这个信息无法判断错误原因。
    建议:
  2. 通过上述能力集先获取下输入参数的能力集范围,结合你实际设备测试下。
  3. 设备WEB页面,应用展示,里面点进去之后找下有没有客流量报表相关的查询,可以WEB页面查询的时候,F12看下底层请求,WEB页面也是用的ISAPI协议,可以参考WEB页面查询的报文。
请求地址
POST /ISAPI/System/Video/inputs/channels/1/counting/search

输入报文:
<?xml version="1.0" encoding="UTF-8"?>

<CountingStatisticsDescription xmlns="http://www.isapi.org/ver20/XMLSchema" version="2.0">
  <!--opt, object, 查询客流量数据报表统计, attr:version{opt, string, 版本}-->
  <statisticType>
    <!--req, enum, 统计类型, subType:string, [enternum#进入人数,exitnum#离开人数,peoplePassing#经过人数,all#全部(全部是指进入人数和离开人数),enterExitDuplicate#进入离开重复人数,faceAttribute#人脸属性,humanBodyAttribute#人体属性,enterRate#进入率,enterExitPeoplePassingNum#进入/离开/经过人数,enterDuplicate#进入重复人数,exitDuplicate#离开重复人数,passDuplicate#经过重复人数], desc:进入率=(进入人数-重复人数)/(进入人数-重复人数+通过人数)-->enternum
  </statisticType>
  <reportType>
    <!--req, enum, 报表类型, subType:string, [daily#日报表,weekly#周报表,monthly#月报表,yearly#年报表]-->daily
  </reportType>
  <timeSpanList>
    <!--opt, array, 时间跨度列表, subType:object-->
    <timeSpan>
      <!--opt, object, 时间跨度-->
      <startTime>
        <!--req, datetime, 开始时间-->1970-01-01T00:00:00+08:00
      </startTime>
      <endTime>
        <!--req, datetime, 结束时间-->1970-01-01T00:00:00+08:00
      </endTime>
    </timeSpan>
  </timeSpanList>
  <triggerPeopleCountingData>
    <!--opt, bool, 触发客流统计数据-->true
  </triggerPeopleCountingData>
  <PagingSearchCond>
    <!--opt, object, 分页查询条件-->
    <searchID>
      <!--req, string, 搜索记录唯一标识, desc:用来确认上层客户端是否为同一个(倘若是同一个,则设备记录内存,下次搜索加快速度)-->test
    </searchID>
    <searchResultPosition>
      <!--req, int, 搜索结果位置-->1
    </searchResultPosition>
    <maxResults>
      <!--req, int, 最大结果-->1
    </maxResults>
  </PagingSearchCond>
  <MinTimeInterval>
    <!--opt, enum, 最小时间间隔, subType:string, [oneMinute#1分钟,quarter#15分钟,half#30分钟,hour#一小时,day#天,week#周,month#月]-->quarter
  </MinTimeInterval>
  <child>
    <!--opt, bool, 是否只检测儿童, desc:该节点为false时表示统计成人和小孩-->true
  </child>
  <FaceAttribute>
    <!--opt, object, 人脸属性, desc:搜索人脸属性时,statisticType=faceAttribute;后续若有进入+人脸属性搜索,statisticType=enternum;若搜索人体属性statisticType=humanBodyAttribute时,可输入人脸属性查询条件-->
    <faceExpression>
      <!--opt, enum, 人脸表情, subType:string, [unknown#未知,poker-faced#中性,happy#高兴,surprised#惊讶,disgusted#厌恶,sad#难过,angry#愤怒,contemptuous#轻蔑,panic#害怕,all#全部]-->unknown
    </faceExpression>
    <gender>
      <!--opt, enum, 性别, subType:string, [unknown#未知,female#女人,male#男人,all#全部]-->unknown
    </gender>
    <mask>
      <!--opt, enum, 口罩, subType:string, [unknown#未知,yes#戴口罩,no#不戴口罩,all#全部]-->unknown
    </mask>
    <ageGroup>
      <!--opt, enum, 年龄段, subType:string, [unknown#未知,child#少年,young#青年,middle#中年,old#老年,infant#婴幼儿,kid#儿童,teenager#青少年,prime#壮年,middleAged#中老年,all#全部]-->unknown
    </ageGroup>
    <glass>
      <!--opt, enum, 眼镜, subType:string, [unknown#未知,yes#戴眼镜,no#不戴眼镜,sunglasses#戴墨镜,all#全部]-->yes
    </glass>
  </FaceAttribute>
  <regionID>
    <!--opt, string, 区域ID, desc:区域ID,复选时,逗号隔开,支持多区域,/ISAPI/System/Video/inputs/channels/<ID>/counting/search/capabilities的regionsID一致-->1
  </regionID>
  <HumanBodyAttribute>
    <!--opt, object, 人体属性, desc:搜索人体属性时,statisticType=humanBodyAttribute-->
    <things>
      <!--opt, enum, 拎东西, subType:string, [unknown#未知,yes#是,no#否,all#全部]-->unknown
    </things>
  </HumanBodyAttribute>
</CountingStatisticsDescription>


输出报文:
<?xml version="1.0" encoding="UTF-8"?>
<CountingStatisticsResult xmlns="http://www.isapi.org/ver20/XMLSchema" version="2.0">
  <!--ro, opt, object, 查询客流量数据报表统计, attr:version{opt, string, 版本}-->
  <responseStatus>
    <!--ro, req, bool, 应答状态-->true
  </responseStatus>
  <responseStatusStrg>
    <!--ro, req, string, 应答状态字-->test
  </responseStatusStrg>
  <numOfMatches>
    <!--ro, req, int, 匹配数目-->1
  </numOfMatches>
  <matchList>
    <!--ro, opt, array, 匹配列表, subType:object-->
    <matchElement>
      <!--ro, opt, object, 匹配元素-->
      <timeSpan>
        <!--ro, opt, object, 时间段-->
        <startTime>
          <!--ro, req, datetime, 起始时间-->1970-01-01T00:00:00+08:00
        </startTime>
        <endTime>
          <!--ro, req, datetime, 结束时间-->1970-01-01T00:00:00+08:00
        </endTime>
      </timeSpan>
      <enterCount>
        <!--ro, opt, int, 进入人数总数-->1
      </enterCount>
      <exitCount>
        <!--ro, opt, int, 离开人数总数-->1
      </exitCount>
      <peoplePassingCount>
        <!--ro, opt, int, 经过人数总数-->1
      </peoplePassingCount>
      <duplicatePeopleCount>
        <!--ro, opt, int, 重复人数总数-->1
      </duplicatePeopleCount>
      <duplicateEnter>
        <!--ro, opt, int, 进入重复人数-->1
      </duplicateEnter>
      <duplicateExit>
        <!--ro, opt, int, 离开重复人数-->1
      </duplicateExit>
      <duplicatePass>
        <!--ro, opt, int, 经过重复人数-->1
      </duplicatePass>
      <FaceExpressionList>
        <!--ro, opt, array, 人脸表情统计总数, subType:object-->
        <FaceExpression>
          <!--ro, opt, object, 人脸表情-->
          <value>
            <!--ro, req, enum, 具体人脸属性对应的可选项, subType:string, [unknown#未知,poker-faced#中性,happy#高兴,surprised#惊讶,disgusted#厌恶,sad#难过,angry#愤怒,contemptuous#轻蔑,panic#害怕,all#全部]-->unknown
          </value>
          <count>
            <!--ro, req, int, 人脸表情对应的人数-->1
          </count>
        </FaceExpression>
      </FaceExpressionList>
      <GenderList>
        <!--ro, opt, array, 性别统计, subType:object-->
        <Gender>
          <!--ro, opt, object, 性别-->
          <value>
            <!--ro, req, enum, 具体性别属性对应的可选项, subType:string, [unknown#未知,female#女人,male#男人,all#全部]-->unknown
          </value>
          <count>
            <!--ro, req, int, 性别对应的人数-->1
          </count>
        </Gender>
      </GenderList>
      <MaskList>
        <!--ro, opt, array, 口罩统计, subType:object-->
        <Mask>
          <!--ro, opt, object, 口罩-->
          <value>
            <!--ro, req, enum, 具体口罩属性对应的可选项, subType:string, [unknown#未知,yes#戴口罩,no#不戴口罩,all#全部]-->unknown
          </value>
          <count>
            <!--ro, req, int, 口罩对应的人数-->1
          </count>
        </Mask>
      </MaskList>
      <AgeGroupList>
        <!--ro, opt, array, 年龄段统计, subType:object-->
        <AgeGroup>
          <!--ro, opt, object, 年龄段-->
          <value>
            <!--ro, req, enum, 具体年龄段属性对应的可选项, subType:string, [unknown#未知,child#少年,young#青年,middle#中年,old#老年,infant#婴幼儿,kid#儿童,teenager#青少年,prime#壮年,middleAged#中老年,all#全部]-->unknown
          </value>
          <count>
            <!--ro, req, int, 年龄段对应的人数-->1
          </count>
        </AgeGroup>
      </AgeGroupList>
      <GlassList>
        <!--ro, opt, array, 眼镜统计, subType:object-->
        <Glass>
          <!--ro, opt, object, 眼镜-->
          <value>
            <!--ro, req, enum, 具体眼镜属性对应的可选项, subType:string, [unknown#未知,yes#戴眼镜,no#不戴眼镜,sunglasses#戴墨镜,all#全部]-->unknown
          </value>
          <count>
            <!--ro, req, int, 眼镜对应的人数-->1
          </count>
        </Glass>
      </GlassList>
      <RegionList>
        <!--ro, opt, array, 区域统计信息, subType:object-->
        <Region>
          <!--ro, opt, object, 区域-->
          <id>
            <!--ro, req, int, 检测区域id-->1
          </id>
          <enterCount>
            <!--ro, opt, int, 进入人数-->1
          </enterCount>
          <exitCount>
            <!--ro, opt, int, 离开人数-->1
          </exitCount>
          <passingCount>
            <!--ro, opt, int, 经过人数-->1
          </passingCount>
          <duplicateEnter>
            <!--ro, opt, int, 进入重复人数-->1
          </duplicateEnter>
          <duplicateExit>
            <!--ro, opt, int, 离开重复人数-->1
          </duplicateExit>
        </Region>
      </RegionList>
      <ThingsList>
        <!--ro, opt, array, 拎东西统计, subType:object-->
        <Things>
          <!--ro, opt, object, 拎东西-->
          <value>
            <!--ro, req, enum, 具体拎东西属性对应的可选项, subType:string, [unknown#未知,yes#是,no#否]-->unknown
          </value>
          <count>
            <!--ro, req, int, 拎东西对应的人数-->1
          </count>
        </Things>
      </ThingsList>
      <enterRate>
        <!--ro, opt, float, 进入率, range:[0.00,100.00], step:0.01, desc:进入率=(进入人数-重复人数)/(进入人数-重复人数+通过人数)-->1
      </enterRate>
    </matchElement>
  </matchList>
</CountingStatisticsResult>

成果 (取得正确数据)

2.png

最终总结

官方给的管理页面也是isapi请求页面,F12看下底层请求,获得正确的请求方法。这样快速又高效,事半功倍。折腾了几天,搜索百度这方面信息很少。估计是开发的人不多。海康的确是很不错的设备,统计很全面,如男女、年龄,戴眼镜、拎东西等。