panlei
2019-07-02 1ccfcd8575bf706f5c4086a945c7429889317da2
ruleserver/ruleToformula.go
@@ -253,11 +253,10 @@
   for _, sdkData := range args.Sdkdata {
      for _, areaMap := range sdkData.AreaMapList {
         for j := 0; j < len(groupRule.Rules); j++ {
            putFaceToResult(groupRule.Rules[j], &areaMap, faces)
            args.RuleResult["face"] = putFaceToResult(groupRule.Rules[j], &areaMap, faces)
         }
      }
   }
   args.RuleResult["face"] = faces
   // 再过其他数据 这步直接得到结果(真或假) 过目标数量
   for j := 0; j < len(groupRule.Rules); j++ {
      for _, sdkData := range args.Sdkdata {
@@ -331,14 +330,16 @@
            for j := 0; j < len(groupRule.Rules); j++ {
               for _, sdkData := range args.Sdkdata {
                  if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo && !strings.Contains(sdkName,sdkData.SdkName) { // 只记录yolo符合规则的sdk 同时要避免重复拼接
                     sdkName = sdkName + "," + sdkData.SdkName
                     sdkName = sdkData.SdkName + " "
                  }
               }
            }
            args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
            log.Println("-------------------yolo结果标签",args.RuleResult["yolo"].([]Result))
            if args.RuleResult["faces"] != nil {
               log.Println("-------------------face结果标签",args.RuleResult["faces"].([]Arg))
            if sdkName != "" {
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
               log.Println("-------------------yolo结果标签",args.RuleResult["yolo"].([]Result))
            }
            if args.RuleResult["face"] != nil {
               log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg))
               os.Exit(1)
            }
            return true
@@ -351,14 +352,16 @@
   }
}
func putFaceToResult(rule *protomsg.Rule, am *AreaMap, faces []Arg) {
func putFaceToResult(rule *protomsg.Rule, am *AreaMap, faces []Arg) []Arg {
   if rule.SdkId == am.sdkId {
      if len(am.filterData) > 0 {
         for _, data := range am.filterData {
            log.Println("---------------------------------------------------------------------有这个data")
            faces = append(faces, data)
         }
      }
   }
   return faces
}
// 计算区域内的目标数量以及将相似度、占比、尺寸等打包
@@ -394,7 +397,7 @@
   a.time = time.Unix(time.Now().Unix(), 0).String()[11:16]
   a.keepRight = arg.KeepRight
   a.isStatic = arg.IsStatic
   log.Println("--------------------看看区域数据:",*a)
   //log.Println("--------------------看看区域数据:",*a)
}
// 将字符串格式的坐标序列化为Point格式
@@ -520,11 +523,12 @@
// 过滤规则先筛选出符合条件的目标数量
func filterRule(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.SdkId == "FaceDetect" || rule.SdkId == "FaceCompare" {
   if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971" {
      // 处理的是人脸算法 如果这条规则配置的是人脸算法,过滤完条件之后直接得出结果,因为肯定没有数量条件,自己拼接
      if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "FaceCompare" {
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971" {
            // 只需要过滤阈值,过滤完后数组长度大于0即为报警,但要考虑如何对每一张都报警呢
            argValue, err := strconv.ParseFloat(rule.SdkArgValue, 64)
            if err != nil {
@@ -558,7 +562,8 @@
            }
            return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort}
         }
         if rule.SdkId == "FaceDetect" { // 人脸检测
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 人脸检测
            log.Println("------------------------------------------------------------------------------------------------------------------------------------终于等到你")
            if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" {
               // 如果是不规矩的连接符统统返回false 规则也只能判断人脸的相似度,所以不存在别的连接符
               if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
@@ -588,6 +593,7 @@
                  am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段
               }
               if am.targetNum > 0 {
                  log.Println("!!!!!!!!!人脸检测成功")
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
               } else {
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}