panlei
2019-07-01 ded52966461c4328244b12d0bef59640b2c9b7cb
ruleserver/ruleToformula.go
@@ -64,7 +64,7 @@
   Location   Rect    // 记下每个目标的位置参数,最后给结果装配人脸数据的时候用的到
   SdkName    string
   ThftRes    protomsg.ThftResult
   Liker      []LikePerson
   Liker      []*protomsg.Baseinfo
}
type LikePerson struct {
@@ -98,7 +98,7 @@
   IsYolo  bool    // 是否是yolo数据
   SdkName string
   ThftRes protomsg.ThftResult
   Liker   []LikePerson // 如果是人脸的话尤其是比对,应存下他跟底库的人员的相似情况 yolo的话给nil就行
   Liker   []*protomsg.Baseinfo // 如果是人脸的话尤其是比对,应存下他跟底库的人员的相似情况 yolo的话给nil就行
}
// 每个算法对于当前帧画面自己提取的数据
@@ -183,14 +183,12 @@
      areaMap := AreaMap{cameraId: cameraId, areaId: polygon.Id, areaJson: polygon.Polygon, triggerLine: polygon.TriggerLine, directionLine: polygon.DirectionLine}
      // 为每个摄像机区域填充数据
      areaMap.CountAreaObjs(arg)
      log.Println("-------areaMap的内容",areaMap)
      arg.AreaMapList = append(arg.AreaMapList, areaMap)
      log.Println("-------AreaMapList的内容",arg.AreaMapList)
   }
}
// 对单帧图像的判断 是舍弃(或者说对于某些需求可以放ES数据库一份)还是返回
func Judge(args SdkDatas) {
func Judge(args *SdkDatas) {
   if len(args.Sdkdata) > 0 {
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
@@ -226,14 +224,11 @@
      }
   }
}
func RunRule(args SdkDatas, groupRule *protomsg.GroupRule, taskId string) bool {
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) bool {
   resultSplice := []*LittleRuleResult{}
   // 先过完条件规则
   for j := 0; j < len(groupRule.Rules); j++ {
      for _, sdkData := range args.Sdkdata {
         if sdkData.SdkId == "812b674b-2375-4589-919a-5c1c3278a975" {
            log.Println("入侵的算法数据", sdkData)
         }
         for _, areaMap := range sdkData.AreaMapList {
            ruleResult := filterRule(groupRule.Rules[j], &areaMap)
            if ruleResult.Result != "" {
@@ -293,6 +288,7 @@
      completeFormula = completeFormula + va.Result
   }
   if completeFormula != "" {
      log.Println("看看公式-----------:", completeFormula)
      expression, _ := govaluate.NewEvaluableExpression(completeFormula)
      result, _ := expression.Evaluate(nil) // 得到数学公式的结果
      if result.(bool) {
@@ -315,7 +311,7 @@
            }
         }
         if flag {
            fmt.Println("本帧数据符合规则")
            fmt.Println("----------------------------终于走完万里长征")
            // 如果成功了我应该找到规则中涉及到的sdk,记录下他们的sdkname
            sdkName := ""
            for j := 0; j < len(groupRule.Rules); j++ {
@@ -327,6 +323,7 @@
            }
            // 过完规则后打个标签,告诉调用者本帧数据针对哪个任务哪组规则报警了     后加:可能还不够,还需要区分触发报警的对象,后面往es数据库插数据时要用
            args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
            log.Println("-------------------结果标签",args.RuleResult["yolo"].([]Result))
            return true
         } else {
            return false
@@ -370,7 +367,7 @@
         // 这步要备齐表达式里所需要的所有参数
         a.targetNum++
         arg1 := Arg{obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.SdkName, obj.ThftRes, obj.Liker}
         log.Println("放进去的arg:-------", arg1)
         //log.Println("放进去的arg:-------", arg1)
         a.args = append(a.args, arg1)
         a.filterData = append(a.filterData, arg1)
      }
@@ -417,7 +414,7 @@
}
// 联动任务的处理
func linkTask(args SdkDatas, groupRule *protomsg.GroupRule, taskId string) {
func linkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) {
   // new一个定时器,如果以此groupId为标志的定时器不存在的话
   var flag bool = true
   var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId}
@@ -520,7 +517,7 @@
            for _, obj := range am.filterData {
               for index := 0; index < len(obj.Liker); {
                  // 将达不到阈值的相似者从相似者数组中删除
                  if obj.Liker[index].Score < argValue {
                  if float64(obj.Liker[index].CompareScore) < argValue {
                     // Go 语言中切片删除元素的本质是:以被删除元素为分界点,将前后两个部分的内存重新连接起来。不用怀疑,数组删除元素就这么坑爹
                     obj.Liker = append(obj.Liker[:index], obj.Liker[index+1:]...)
                  } else {
@@ -588,7 +585,6 @@
      }
   } else {
      // 处理的都是yolo数据
      log.Println("规则中的sdkId为:", rule.SdkId, "--区域数据集合中的sdkId为:", am.sdkId, "--规则中的区域Id为:", rule.PolygonId, "--区域数据集合中的区域Id为:", am.areaId, )
      if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上
         if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
            var args []Arg
@@ -708,7 +704,7 @@
}
func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      if rule.SdkArgAlias == "time" { // 判断是否符合时间规则
      if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规则
         // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组)
         //fmt.Println("时间规则的测试")
         now := time.Now()