panlei
2019-11-14 ad7cf53c446a71e65a3a914743f24ff041c8ac13
algorithm/static/static.go
@@ -16,7 +16,10 @@
      if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
         return filterRule(rule, am)
      } else if rule.SdkArgAlias == "duration" {
         return CompareAndSave(rule,am,lable,args,message)
         lr := CompareAndSave(rule,am,lable,args,message)
         logger.Info("个体静止规则结果:",lr)
         return lr
      } else {
         return structure.LittleRuleResult{}
      }
@@ -95,6 +98,12 @@
}
// 判断一个区域内有没有静止的目标
func CompareAndSave(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult {
   defer func() {
      if err := recover(); err != nil {
         logger.Error("个体静止规则有误", err)
      }
   }()
   logger.Info("走了个体静止核心算法")
   initN := 5
   if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a977" && rule.SdkArgAlias == "duration" {
      if init,err := strconv.Atoi(rule.SdkArgValue); err != nil {
@@ -103,7 +112,8 @@
         initN = init
      }
   }
   if len(structure.StaticMap[am.AreaId].Targets) == 0 { // 即第一帧数据(也不一定),还没有缓存
   if structure.StaticMap[am.AreaId] == nil || len(structure.StaticMap[am.AreaId].Targets) == 0 { // 即第一帧数据(也不一定),还没有缓存
      logger.Info("之前无缓存")
      objs := []*structure.Obj{}
      for _, tar := range am.FilterData {
         obj := &structure.Obj{Id: tar.Id, Location: tar.Location, N: initN,InitN:initN}
@@ -112,9 +122,14 @@
      structure.StaticMap[am.AreaId] = &structure.CameraArea{objs}
      return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort}
   } else {
      logger.Info("之前有缓存")
      flag := "false"
      // 以之前静止的对象为主判断是否静止
      tars := []*structure.Arg{}
      logger.Info("看一下静止区域内的目标:",am.AreaId)
      for _, tar := range structure.StaticMap[am.AreaId].Targets {
         logger.Info("具体目标:",tar.Location)
      }
      for _, tar := range structure.StaticMap[am.AreaId].Targets {
         singleResult,arg := SingleStatic(tar,am,lable,90)
         if singleResult {
@@ -161,18 +176,20 @@
// 判断一个目标是否静止了指定时间
func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) (bool,*structure.Arg){
   logger.Info("单个目标的判断:")
   flag := false
   var o *structure.Arg = nil
   for _, obj := range am.FilterData {
      if person.Id == obj.Id {
         coincidenceDegree := PgsInterPercent(Rect2Point(person.Location), obj.Location, 1, 1)
         logger.Info("判断目标的重合度",coincidenceDegree)
         o = obj
         if coincidenceDegree >= argValue {
            flag = true
         }
      }
   }
   if flag { // 有一个对象保持静止(id相等并且重合度高于阈值)
   if flag { // 当前检测对象保持静止(id相等并且重合度高于阈值)
      flagTime := TimerAlarm(lable,person,flag,am.AreaId)
      if flagTime == "10" || flagTime == "11" {
         return flag,o
@@ -188,7 +205,7 @@
// 判断是否符合定时器条件
func TimerAlarm(oth *structure.Others,person *structure.Obj, result bool,areaId string) (string) {
   var flagTime string //
   logger.Info("目标的定时器:")
   rw.Lock()
      if result { // 结果为真