---
panlei
2019-11-13 c4f4abbd7d40e75fef0eb1e1dadb78309c059d73
algorithm/static/static.go
@@ -12,7 +12,7 @@
func Entrance(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult {
   if rule.PolygonId == am.AreaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上
      logger.Debug("---------走了人员异常算法", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId)
      logger.Debug("---------走了个体静止算法", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId)
      if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
         return filterRule(rule, am)
      } else if rule.SdkArgAlias == "duration" {
@@ -95,8 +95,8 @@
}
// 判断一个区域内有没有静止的目标
func CompareAndSave(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult {
   initN := 60
   if rule.SdkId == "个体静止" && rule.SdkArgAlias == "duration" {
   initN := 5
   if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a977" && rule.SdkArgAlias == "duration" {
      if init,err := strconv.Atoi(rule.SdkArgValue); err != nil {
         logger.Debug("个体静止算法读取持续时间失败",err)
      } else {
@@ -113,12 +113,19 @@
      return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort}
   } else {
      flag := "false"
      // 以之前静止的对象为主判断是否静止
      tars := []*structure.Arg{}
      for _, tar := range structure.StaticMap[am.AreaId].Targets {
         singleResult := SingleStatic(tar,am,lable,90)
         singleResult,arg := SingleStatic(tar,am,lable,90)
         if singleResult {
            flag = "true"
            tars = append(tars,arg)
            logger.Info("静止的目标:",arg.Id,arg.Location,arg.Score)
         }
      }
      // 把满足条件的目标放进areaMap中
      am.AlarmObj = tars
      // 更新数据,把新来的数据写入缓存
      objs := []*structure.Obj{}
      for _, tar := range am.FilterData {
@@ -153,11 +160,13 @@
}
// 判断一个目标是否静止了指定时间
func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) bool{
func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) (bool,*structure.Arg){
   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)
         o = obj
         if coincidenceDegree >= argValue {
            flag = true
         }
@@ -166,13 +175,13 @@
   if flag { // 有一个对象保持静止(id相等并且重合度高于阈值)
      flagTime := TimerAlarm(lable,person,flag,am.AreaId)
      if flagTime == "10" || flagTime == "11" {
         return flag
         return flag,o
      } else {
         return false
         return false,o
      }
   } else {
      TimerAlarm(lable,person,flag,am.AreaId)
      return flag
      return flag,o
   }
}
var rw sync.RWMutex