| | |
| | | package ruleserver |
| | | |
| | | import ( |
| | | "fmt" |
| | | "ruleprocess/cache" |
| | | "ruleprocess/logger" |
| | | "sort" |
| | |
| | | |
| | | // 每个目标的参数:相似度,占比,尺寸 |
| | | type Arg struct { |
| | | Id uint64 |
| | | Score float64 // 区域内的目标的相似度 |
| | | Proportion float64 // 区域内的目标的占比 |
| | | Size float64 // 区域内的目标的尺寸 |
| | |
| | | |
| | | // sdk输出的图片上单个目标的数据 |
| | | type PhotoMap struct { |
| | | Id uint64 |
| | | Rects Rect // 矩形区域参数 |
| | | Score float64 // 相似度得分(有多大程度像一个目标。人脸,人体或车等等) |
| | | IsYolo bool // 是否是yolo数据 |
| | |
| | | CameraId string |
| | | TaskId string |
| | | Sdkdata []*SdkData |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5 |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result |
| | | } |
| | | |
| | | type ResultMsg struct { |
| | | *protomsg.SdkMessage |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result |
| | | } |
| | | |
| | | // 过规则库打上的标签 |
| | |
| | | TaskId string // 任务id |
| | | SdkName string |
| | | RuleGroupId string // 规则组id |
| | | DefenceState bool //是否布防 |
| | | DefenceState bool // 是否布防 |
| | | AlarmLevel int32 // 报警等级 |
| | | RuleText string // 文字版规则组 |
| | | Location []Rect // 目标的坐标 |
| | | AlarmPolygon string // 触发的报警框 |
| | | Others |
| | | } |
| | | type Others struct { |
| | | CacheData []ResultMsg //(本组规则中含有持续时间的规则开启的定时器缓存的数据帧) |
| | | LinkCache []ResultMsg |
| | | TimeLabel string |
| | | } |
| | | |
| | | // 过规则库打上的标签 |
| | | type FaceResult struct { |
| | | Result |
| | | Args []Arg |
| | | Args []Arg |
| | | } |
| | | type LittleRuleResult struct { |
| | | SdkName string // 记录下此结果是哪个sdk的结果 |
| | |
| | | // 拿到本摄像机的区域 |
| | | cameraPolygons := GetPolygons(args.CameraId) |
| | | // 把所有的sdk提取的数据都按所属摄像机的区域归置 |
| | | logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname) |
| | | //logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname) |
| | | for _, arg := range args.Sdkdata { |
| | | SdkDataFormat(args.CameraId, arg, cameraPolygons) |
| | | } |
| | |
| | | args.RuleResult = make(map[string]interface{}) |
| | | args.RuleResult["yolo"] = []Result{} |
| | | args.RuleResult["face"] = []FaceResult{} |
| | | //logger.Warn("传进去之前是什么德行:",args.RuleResult["yolo"]) |
| | | if taskGroup != nil && len(taskGroup.GroupRules) > 0 { |
| | | // 先过独立,再过联动 |
| | | for _, group := range taskGroup.GroupRules { |
| | | //logger.Println("------------------------------任务规则:",taskRule) |
| | | taskId := taskGroup.TaskId |
| | | //logger.Println("------------本组任务下的规则组的数量:",len(ruleList)) |
| | | temp := group.Rules // temp为一组完整规则 在此需要判断规则是否是联动规则 |
| | | label := Others{} |
| | | if len(temp) > 0 { |
| | | if group.SetType != "linkTask" { |
| | | // 独立任务的处理 |
| | | RunRule(args, group, taskId, message, label) |
| | | } |
| | | } |
| | | } |
| | | for _, group := range taskGroup.GroupRules { |
| | | //logger.Println("------------------------------任务规则:",taskRule) |
| | | taskId := taskGroup.TaskId |
| | | //logger.Println("------------本组任务下的规则组的数量:",len(ruleList)) |
| | | temp := group.Rules // temp为一组完整规则 在此需要判断规则是否是联动规则 |
| | | label := Others{} |
| | | if len(temp) > 0 { |
| | | if group.SetType == "linkTask" { |
| | | // groupId中含有link则为联动任务 |
| | | LinkTask(args, group, taskId, message) |
| | | } else { |
| | | // 独立任务的处理 |
| | | RunRule(args, group, taskId, message) |
| | | LinkTask(args, group, taskId, message, label) |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage) bool { |
| | | func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) bool { |
| | | defer func() { |
| | | if err := recover(); err != nil { |
| | | logger.Error("比对规则有误", err.(string)) |
| | | } |
| | | }() |
| | | logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", *groupRule) |
| | | logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", (*groupRule).GroupText) |
| | | //logger.Warn("传进去之后是什么德行:",args.RuleResult["yolo"]) |
| | | Compare(args, groupRule) |
| | | resultSplice := []*LittleRuleResult{} |
| | | sdkNames := "" |
| | |
| | | } |
| | | ipcId := sdk.IpcId |
| | | sdkName := sdk.SdkName |
| | | logger.Info("规则的ipcId与sdkData的IpcId:", ipcId, "===", sdkData.IpcId) |
| | | //logger.Info("规则的ipcId与sdkData的IpcId:", ipcId, "===", sdkData.IpcId) |
| | | if ipcId == sdkData.IpcId { |
| | | logger.Info("当前走的规则是--:", sdkName, "---","") |
| | | //logger.Info("当前走的规则是--:", sdkName, "---","") |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | ruleResult := filterRule(groupRule.Rules[j], areaMap) |
| | | if ruleResult.Result != "" { |
| | |
| | | } |
| | | } |
| | | } |
| | | // 这步过的是时间规则(时间段等) |
| | | // 这步过的是时间段规则(时间段等) |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | for _, sdkData := range args.Sdkdata { |
| | | sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) |
| | |
| | | completeFormula = completeFormula[1:] |
| | | } |
| | | logger.Info("-------------------看看拔毛后的表达式:", completeFormula) |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | return result.(bool) |
| | | //expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | //result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | //return result.(bool) |
| | | } |
| | | if completeFormula != "" { |
| | | logger.Info("结果公式-----------:", completeFormula) |
| | | expression, err := govaluate.NewEvaluableExpression(completeFormula) |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil{ |
| | | expression, err2 := govaluate.NewEvaluableExpression(completeFormula) |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err2 != nil { |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | |
| | | if result.(bool) { |
| | | // 最后成功报警才把符合条件的人脸数据塞进结果标签里 |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | faces := []Arg{} |
| | | faceFlag := false |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" { |
| | | faceFlag = true |
| | | } |
| | | } |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" && faceFlag { // sdkData里有人脸数据且配置了算法才把符合条件的数据塞进标签里去 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | faces = append(faces, putFaceToResult(areaMap,faces)...) |
| | | } |
| | | } |
| | | } |
| | | for _,face := range faces { |
| | | logger.Debug("————————————————________________看看人脸的坐标:",face.Location) |
| | | } |
| | | logger.Warn("___________________________________________________________________________终于走完万里长征") |
| | | // 把他们的位置数据也传下去 |
| | | locations := []Rect{} |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && sdkNames != "" { // 把yolo数据的各个目标的坐标输出方便后面画框 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | locations = append(locations, putYolosToResult(areaMap)...) |
| | | } |
| | | } |
| | | } |
| | | logger.Debug("------locations的内容:", locations) |
| | | if sdkNames != "" { |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId}) |
| | | logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result))) |
| | | } |
| | | if faceFlag { |
| | | args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId},faces}) |
| | | logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult))) |
| | | } |
| | | // 最后过持续时间等时间维度的条件 把时间规则位置调整到这个位置是为了缓存数据 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | for _, sdkData := range args.Sdkdata { |
| | |
| | | } |
| | | } |
| | | // 进行定时器的处理和判断 |
| | | timeFlag := TimerAlarm(args, groupRule.GroupId, result.(bool)) |
| | | if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" { // 满足定时器条件 |
| | | timeFlag := TimerAlarm(&label, groupRule.GroupId, result.(bool)) |
| | | if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" { // 没有定时器或者满足定时器条件 |
| | | // 打人脸标签和yolo标签 |
| | | // 最后成功报警才把符合条件的人脸数据塞进结果标签里 |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | faces := []Arg{} |
| | | faceFlag := false |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" { |
| | | faceFlag = true |
| | | } |
| | | } |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" && faceFlag { // sdkData里有人脸数据且配置了算法才把符合条件的数据塞进标签里去 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | faces = append(faces, putFaceToResult(areaMap, faces)...) |
| | | } |
| | | } |
| | | } |
| | | //for _,face := range faces { |
| | | // //logger.Debug("————————————————________________看看人脸的坐标:",face.Location) |
| | | //} |
| | | logger.Warn("___________________________________________________________________________终于走完万里长征") |
| | | // 把他们的位置数据也传下去 |
| | | locations := []Rect{} |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && sdkNames != "" { // 把yolo数据的各个目标的坐标输出方便后面画框 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | locations = append(locations, putYolosToResult(areaMap)...) |
| | | } |
| | | } |
| | | } |
| | | //logger.Debug("------locations的内容:", locations) |
| | | if sdkNames != "" { |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, label}) |
| | | //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result))) |
| | | } |
| | | if faceFlag { |
| | | args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId, label}, faces}) |
| | | //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult))) |
| | | } |
| | | return true |
| | | } else { |
| | | return false |
| | | } |
| | | |
| | | } else { |
| | | // 结果为假时也要走,有时候为假的状态反转数据也需要记录下来 |
| | | timeFlag := TimerAlarm(args, groupRule.GroupId, result.(bool)) |
| | | fmt.Println(timeFlag) |
| | | //timeFlag := TimerAlarm(args, groupRule.GroupId, result.(bool)) |
| | | //fmt.Println(timeFlag) |
| | | return false |
| | | } |
| | | } else { |
| | |
| | | } |
| | | } |
| | | |
| | | func putFaceToResult(am *AreaMap,faceList []*Arg) []Arg { |
| | | func putFaceToResult(am *AreaMap, faceList []Arg) []Arg { |
| | | faces := []Arg{} |
| | | if len(am.filterData) > 0 { |
| | | for _, data := range am.filterData { |
| | | flag := true |
| | | for _,face := range faceList { |
| | | flag := true |
| | | for _, face := range faceList { |
| | | if data.Location.X == face.Location.X && data.Location.Y == face.Location.Y && data.Location.Width == face.Location.Width && data.Location.Height == face.Location.Height { |
| | | flag = false |
| | | } |
| | |
| | | } |
| | | |
| | | // 联动任务的处理 |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage) { |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) { |
| | | // new一个定时器,如果以此groupId为标志的定时器不存在的话 |
| | | logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText) |
| | | var flag bool = true |
| | | var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} |
| | | var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} |
| | | for k, timeEle1 := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | flag = false // 已经有了这个定时器就置为false 不再新增 |
| | |
| | | } |
| | | } |
| | | if flag { // 如果还没有这个定时器元素就新增一个 |
| | | timeEle := TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} // 扔进去一个定时器元素 |
| | | //timeEle := TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} // 扔进去一个定时器元素 |
| | | //TimeEleList = make(map[string]timeElement) |
| | | TimeEleList[groupRule.GroupId] = &timeEle // 定时器元素以规则组id为键 |
| | | logger.Info("---------------------------------------------联动任务创建了计数器并且计数器集合为:", TimeEleList) |
| | |
| | | } |
| | | } |
| | | if flag1 { |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre}) |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre, ResultMsg{}}) |
| | | } |
| | | } |
| | | } |
| | | // 往数组里赋值 |
| | | isOk := RunRule(args, groupRule, taskId, message) |
| | | isOk := RunRule(args, groupRule, taskId, message, label) |
| | | if isOk { |
| | | logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为true") |
| | | // 根据cameraId去更新或者插入结果,然后判断是否数组是否可以得出报警的结论 |
| | |
| | | for _, va := range timeEle.RuleResults { |
| | | if va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | tempMap := make(map[string]interface{}) |
| | | for k, result := range args.RuleResult { |
| | | if k == "yolo" { |
| | | tempMap[k] = []Result{} |
| | | for _, res := range result.([]Result) { |
| | | tempMap[k] = append(tempMap[k].([]Result), res) |
| | | } |
| | | } |
| | | if k == "face" { |
| | | tempMap[k] = []FaceResult{} |
| | | for _, res := range result.([]FaceResult) { |
| | | tempMap[k] = append(tempMap[k].([]FaceResult), res) |
| | | } |
| | | } |
| | | } |
| | | va.CacheData = ResultMsg{message, tempMap} |
| | | logger.Info("这个摄像机--", args.CameraId, "--被赋予了result", va.Result) |
| | | } |
| | | } |
| | | // 判断结果数组是否完满(即被赋值完毕)可得出报警结果 |
| | | var isPerfect = true |
| | | for _, va := range timeEle.RuleResults { |
| | | logger.Info("---------------------瞅瞅当前数组________________:", *va) |
| | | //logger.Info("---------------------瞅瞅当前数组________________:", *va) |
| | | if va.Result == "" && va.RuleWithPre != "||" { |
| | | isPerfect = false |
| | | } |
| | | } |
| | | if isPerfect { |
| | | logger.Debug("数组完满了,联动任务可以成功报警了!") |
| | | // 将数组按sort排序 |
| | | sort.Sort(SubList(timeEle.RuleResults)) |
| | | // 排序后取各自的结果和连接符拼出规则表达式得出结果 |
| | |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) { |
| | | logger.Info("___________________________________________________________________联动任务报警") |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, ""}) |
| | | logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result))) |
| | | if args.RuleResult["face"] != nil { |
| | | logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]Arg))) |
| | | // 把数组里缓存的数据取出来一起报警 |
| | | label.LinkCache = []ResultMsg{} |
| | | for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults { |
| | | label.LinkCache = append(label.LinkCache, ruleRes.CacheData) |
| | | } |
| | | //os.Exit(0) |
| | | logger.Debug("联动任务缓存了几个数据", len(label.LinkCache)) |
| | | for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ { |
| | | if args.RuleResult["yolo"].([]Result)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上 |
| | | args.RuleResult["yolo"].([]Result)[i].Others.LinkCache = label.LinkCache |
| | | } |
| | | } |
| | | for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ { |
| | | if args.RuleResult["face"].([]FaceResult)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上 |
| | | args.RuleResult["face"].([]FaceResult)[i].Others.LinkCache = label.LinkCache |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } else { |
| | | logger.Warn("数组不圆满不打标签") |
| | | } |
| | | } else { // 没有报警, |
| | | logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false") |
| | | // 所以也要去结果数组里放值或更新 |
| | | for _, va := range timeEle.RuleResults { |
| | | if args.CameraId != "" && va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false") |
| | | // 所以也要去结果数组里放值或更新 07/30备注: 不应放值,应删除定时器,等为true时再度开启 |
| | | //for _, va := range timeEle.RuleResults { |
| | | // if args.CameraId != "" && va.CameraId == args.CameraId { |
| | | // va.Result = strconv.FormatBool(isOk) |
| | | // } |
| | | //} |
| | | for k, _ := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | delete(TimeEleList, k) |
| | | logger.Debug("因为定时器的一帧数据结果为false,干掉定时器") |
| | | } |
| | | } |
| | | // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西 |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | //logger.Info("规则的算法id和区域的算法id:", rule.SdkId, "===", am.sdkId) |
| | | if rule.PolygonId == am.areaId { // 算法和区域都得对的上 |
| | | |
| | | if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" && rule.SdkArgAlias != "compareBase" { |
| | | logger.Debug("当前小规则是:",rule) |
| | | if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule"{ |
| | | //logger.Debug("当前小规则是:",rule) |
| | | flag := "false" |
| | | // 把没有相似者的人脸从filterData中删除 |
| | | for index := 0; index < len(am.filterData); { |
| | |
| | | if len(am.filterData) > 0 { |
| | | flag = "true" |
| | | } |
| | | logger.Info("---------人脸比对符合条件的数量为:",len(am.filterData)) |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort} |
| | | } |
| | | if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 人脸检测 |
| | | logger.Debug("当前小规则是:",rule) |
| | | //logger.Debug("当前小规则是:",rule) |
| | | if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" { |
| | | // 如果是不规矩的连接符统统返回false 规则也只能判断人脸的相似度,所以不存在别的连接符 |
| | | if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加 |
| | | //logger.Info("---------------------------终于等到你") |
| | | logger.Info("-----------------------过规则之前区域内的人脸数量为:",am.targetNum) |
| | | var args []*Arg |
| | | if rule.RuleWithPre == "&&" { |
| | | args = am.filterData |
| | | logger.Info("过滤后的args的长度为:",len(args)) |
| | | //logger.Info("过滤后的args的长度为:",len(args)) |
| | | } else { |
| | | args = am.args |
| | | logger.Info("没过滤的args的长度为:",len(args)) |
| | | //logger.Info("没过滤的args的长度为:",len(args)) |
| | | } |
| | | // 先清空过滤后的数据,再往里塞本次过滤后的数据 |
| | | am.filterData = am.filterData[0:0] |
| | |
| | | } |
| | | } |
| | | am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段 |
| | | } |
| | | if am.targetNum > 0 { |
| | | logger.Info("!!!!!!!!!人脸检测成功") |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | logger.Info("过完条件后的目标数量为:",am.targetNum) |
| | | if am.targetNum > 0 { |
| | | logger.Info("!!!!!!!!!人脸检测成功") |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } else { |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | } |
| | | } else { |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | return LittleRuleResult{} |
| | | } |
| | | } else { |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | return LittleRuleResult{} |
| | | } |
| | | } else { |
| | | return LittleRuleResult{} |
| | |
| | | } |
| | | // 先清空过滤后的数据,再往里塞本次过滤后的数据 |
| | | am.filterData = am.filterData[0:0] |
| | | logger.Debug("看看args:::::", args) |
| | | //logger.Debug("看看args:::::", args) |
| | | for _, arg := range args { |
| | | var formula string |
| | | if rule.SdkArgAlias == "score" { |
| | |
| | | if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上 配置的算法要对的上 |
| | | if rule.SdkArgAlias == "duration" { // |
| | | logger.Info("当前小规则是:---------", rule) |
| | | // 先看看定时器元素队列中是否有这个摄像机这个区域的定时器,如果有就不能再次创建了 |
| | | // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了 |
| | | var flag bool = true |
| | | for k, _ := range TimeEleList { |
| | | if k == groupId+" "+rule.Id { |
| | | if k == groupId+"+"+rule.Id { |
| | | flag = false // 有就置为false |
| | | logger.Info("有这个定时器,不再创建了:") |
| | | } |
| | |
| | | timeLength, _ := strconv.Atoi(rule.SdkArgValue) |
| | | timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: ResultMsg{message, args.RuleResult}} // 扔进去一个定时器元素(并缓存当前画面帧数据) |
| | | //TimeEleList = make(map[string]timeElement) |
| | | TimeEleList[groupId+" "+rule.Id] = &timeEle // 定时器元素以组规则id和当前持续时间小规则id为键 |
| | | logger.Info("创建了计数器并且计数器集合为:", TimeEleList) |
| | | TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键 |
| | | logger.Info("创建了计数器") |
| | | } |
| | | } |
| | | } |
| | |
| | | func transferParameters(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { |
| | | if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "objCount" { // 如果参数是要区域内目标数量 即yolo 人脸不会有数量 |
| | | logger.Info("当前小规则是:---------", rule) |
| | | //logger.Info("当前小规则是:---------", rule) |
| | | //logger.Info("得出结果阶段", "比较的规则是:", rule) |
| | | if rule.Operator == "" { |
| | | return LittleRuleResult{am.sdkName, strconv.Itoa(am.targetNum) + "" + rule.RuleWithPre, rule.Sort} // 如果后面不跟操作符就直接返回数量 比如要跟下一个区域比较数量的就直接返回本区域的数量 |
| | |
| | | func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { |
| | | if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规 |
| | | logger.Info("----------当前时间规则:---------", rule) |
| | | //logger.Info("----------当前时间规则:---------", rule) |
| | | // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组) |
| | | //logger.Info("时间规则的测试") |
| | | now := time.Now() |
| | | index := getIndexOfWeek(now.Weekday().String()) |
| | | timeList := GetTimeById(rule.SdkArgValue, index) |
| | | logger.Info("当天的时间段集合:----------", timeList) |
| | | //logger.Info("当天的时间段集合:----------", timeList) |
| | | //logger.Info("从数据库中查出的时间规则:", timeList) |
| | | // 判断图片数据的时间是否符合当前规则 在一个即为true,全不在为false |
| | | |
| | |
| | | flag := "true" |
| | | for _, timeSlot := range timeList { |
| | | formula := "'" + timeSlot.Start + "'" + " < " + "'" + am.time + "'" |
| | | logger.Info("-----------------时间规则不满足的公式start:", formula) |
| | | //logger.Info("-----------------时间规则不满足的公式start:", formula) |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | |
| | | formula1 := "'" + timeSlot.End + "'" + " > " + "'" + am.time + "'" |
| | | logger.Info("-----------------时间规则不满足的公式end:", formula1) |
| | | //logger.Info("-----------------时间规则不满足的公式end:", formula1) |
| | | expression1, _ := govaluate.NewEvaluableExpression(formula1) // 得到数学公式 |
| | | result1, _ := expression1.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) && result1.(bool) { |