| | |
| | | IsStatic bool // 是否静止 |
| | | ImageWidth int // 摄像机拍摄的图像宽 像素 |
| | | ImageHeight int // 摄像机拍摄的图像高 像素 |
| | | AreaMapList []AreaMap // 本sdk提取的数据按照区域划分后的数据集合 |
| | | AreaMapList []AreaMap // 本sdk提取的数据按照区域划分后的数据集合 |
| | | } |
| | | |
| | | // 从算法模块儿拿来的对一帧图像各个算法提取的数据集合 |
| | |
| | | args.RuleResult["face"] = []Arg{} |
| | | if len(taskRuleList) > 0 { |
| | | for _, taskRule := range taskRuleList { |
| | | log.Println("------------------------------任务规则:",taskRule) |
| | | //log.Println("------------------------------任务规则:",taskRule) |
| | | ruleList := taskRule.GroupRules // 获取的是task下面的任务组 |
| | | taskId := taskRule.TaskId |
| | | //log.Println("------------本组任务下的规则组的数量:",len(ruleList)) |
| | |
| | | if err := recover(); err != nil { |
| | | fmt.Println("比对规则有误", err.(string)) |
| | | } |
| | | |
| | | }() |
| | | log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:",(*groupRule).GroupText) |
| | | log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:", (*groupRule).GroupText) |
| | | resultSplice := []*LittleRuleResult{} |
| | | // 先过完条件规则 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | |
| | | } |
| | | } |
| | | } |
| | | // 过完条件数据后把符合条件的人脸数据塞进结果标签里 |
| | | faces := []Arg{} |
| | | for _, sdkData := range args.Sdkdata { |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | faces = append(faces,putFaceToResult(groupRule.Rules[j], &areaMap)...) |
| | | } |
| | | } |
| | | } |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | flag := 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-5c1c3278a971" { |
| | | flag = true |
| | | } |
| | | } |
| | | if flag { |
| | | args.RuleResult["face"] = faces |
| | | } |
| | | |
| | | // 再过其他数据 这步直接得到结果(真或假) 过目标数量 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | for _, sdkData := range args.Sdkdata { |
| | |
| | | for _, va := range resultSplice { |
| | | completeFormula = completeFormula + va.Result |
| | | } |
| | | if completeFormula != "" { |
| | | log.Println("看看公式-----------:", completeFormula) |
| | | if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||") || strings.HasPrefix(completeFormula,">=") || strings.HasPrefix(completeFormula,"<=") || strings.HasPrefix(completeFormula,"==") || strings.HasPrefix(completeFormula,"!=") ||strings.HasPrefix(completeFormula,">") || strings.HasPrefix(completeFormula,"<") { |
| | | // 以这些开头的基本是联动任务 |
| | | if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||") || strings.HasPrefix(completeFormula,">=") || strings.HasPrefix(completeFormula,"<=") || strings.HasPrefix(completeFormula,"==") || strings.HasPrefix(completeFormula,"!=") { |
| | | completeFormula = completeFormula[2:len(completeFormula)-1] |
| | | } |
| | | if strings.HasPrefix(completeFormula,">") || strings.HasPrefix(completeFormula,"<") { |
| | | completeFormula = completeFormula[1:len(completeFormula)-1] |
| | | } |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||"){ |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") { |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result,_ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | return result.(bool) |
| | | } |
| | | if completeFormula != "" { |
| | | log.Println("结果公式-----------:", completeFormula) |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") { |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if !result.(bool) { |
| | | // 给这帧数据打上规则组标签 |
| | | //args.RuleResult = append(args.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId}) |
| | |
| | | timeEle.N = timeEle.InitN // 重置定时器 |
| | | } |
| | | } |
| | | log.Println("--------------------走这里了吗---------------") |
| | | return false |
| | | } else { |
| | | // 最后成功报警才把符合条件的人脸数据塞进结果标签里 |
| | | faces := []Arg{} |
| | | for _, sdkData := range args.Sdkdata { |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | faces = append(faces, putFaceToResult(groupRule.Rules[j], &areaMap)...) |
| | | } |
| | | } |
| | | } |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | flag11 := 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-5c1c3278a971" { |
| | | flag11 = true |
| | | } |
| | | } |
| | | if flag11 { |
| | | args.RuleResult["face"] = faces |
| | | } |
| | | // 去看池子里是否有与本帧数据有关的定时器,如果有,看此时是否走到0,没有此定时器或有定时器走到0的话返回成功报警 |
| | | var flag bool = true |
| | | for k, timeEle := range TimeEleList { |
| | |
| | | sdkName := "" |
| | | 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 同时要避免重复拼接 |
| | | if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo && !strings.Contains(sdkName, sdkData.SdkName) { // 只记录yolo符合规则的sdk 同时要避免重复拼接 |
| | | sdkName = sdkData.SdkName + " " |
| | | } |
| | | } |
| | | } |
| | | 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)) |
| | | log.Println("-------------------yolo结果标签", args.RuleResult["yolo"].([]Result)) |
| | | } |
| | | if args.RuleResult["face"] != nil { |
| | | log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg)) |
| | | log.Println("-------------------face结果标签", args.RuleResult["face"].([]Arg)) |
| | | } |
| | | return true |
| | | } else { |
| | |
| | | |
| | | func putFaceToResult(rule *protomsg.Rule, am *AreaMap) []Arg { |
| | | faces := []Arg{} |
| | | if rule.SdkId == am.sdkId && rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971"{ |
| | | if rule.SdkId == am.sdkId && rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971" { |
| | | if len(am.filterData) > 0 { |
| | | for _, data := range am.filterData { |
| | | faces = append(faces, data) |
| | |
| | | |
| | | // } |
| | | for _, obj := range arg.Photo { |
| | | log.Println("------------------看看sdkData:",arg.SdkName,"的Photo数据----------------", obj, "----顺便看看占比-----:", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale)) |
| | | log.Println("------------------看看sdkData:", arg.SdkName, "的Photo数据----------------", obj, "----顺便看看占比-----:", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale)) |
| | | if threshold <= obj.Score && size <= float64(obj.Rects.Width*obj.Rects.Height) && intersectionper <= PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) { |
| | | // 这步要备齐表达式里所需要的所有参数 |
| | | a.targetNum++ |
| | |
| | | // 联动任务的处理 |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) { |
| | | // new一个定时器,如果以此groupId为标志的定时器不存在的话 |
| | | log.Println("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText) |
| | | var flag bool = true |
| | | var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} |
| | | for k, timeEle1 := range TimeEleList { |
| | |
| | | for _, va := range timeEle.RuleResults { |
| | | if va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | log.Println("这个摄像机--",args.CameraId,"--被赋予了result",va.Result) |
| | | } |
| | | } |
| | | // 判断结果数组是否完满(即被赋值完毕)可得出报警结果 |
| | | var isPerfect = true |
| | | for _, va := range timeEle.RuleResults { |
| | | log.Println("---------------------瞅瞅当前数组________________:",*va) |
| | | if va.Result == "" && va.RuleWithPre != "||" { |
| | | isPerfect = false |
| | | } |
| | |
| | | for _, va := range timeEle.RuleResults { |
| | | completeFormula = completeFormula + va.RuleWithPre + "" + va.Result |
| | | } |
| | | log.Println("---------------------------联动任务的公式", completeFormula) |
| | | if completeFormula != "" { |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | sdkName := "" |
| | | 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 同时要避免重复拼接 |
| | | if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo && !strings.Contains(sdkName, sdkData.SdkName) { // 只记录yolo符合规则的sdk 同时要避免重复拼接 |
| | | sdkName = sdkData.SdkName + " " |
| | | } |
| | | } |
| | | } |
| | | 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)) |
| | | log.Println("-------------------yolo结果标签", args.RuleResult["yolo"].([]Result)) |
| | | } |
| | | if args.RuleResult["face"] != nil { |
| | | log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg)) |
| | | log.Println("-------------------face结果标签", args.RuleResult["face"].([]Arg)) |
| | | } |
| | | os.Exit(0) |
| | | } |
| | |
| | | var formula string |
| | | if rule.SdkArgAlias == "score" { |
| | | formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前相似度小公式:", formula) |
| | | } else if rule.SdkArgAlias == "proportion" { |
| | | formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前占比小公式:", formula) |
| | | } else { |
| | | formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前尺寸小公式:", formula) |
| | | } |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | // 处理的都是yolo数据 |
| | | if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加 |
| | | log.Println("----------当前条件规则:---------",rule) |
| | | log.Println("----------当前条件规则:---------", rule) |
| | | var args []Arg |
| | | if rule.RuleWithPre == "&&" { |
| | | args = am.filterData |
| | |
| | | var formula string |
| | | if rule.SdkArgAlias == "score" { |
| | | formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前相似度小公式:",formula) |
| | | log.Println("当前相似度小公式:", formula) |
| | | } else if rule.SdkArgAlias == "proportion" { |
| | | formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前占比小公式:",formula) |
| | | log.Println("当前占比小公式:", formula) |
| | | } else { |
| | | formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前尺寸小公式:",formula) |
| | | log.Println("当前尺寸小公式:", formula) |
| | | } |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | return LittleRuleResult{} |
| | | } |
| | | func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { |
| | | if rule.PolygonId == am.areaId && rule.SdkId == am.sdkId{ // 首先规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.PolygonId == am.areaId && rule.SdkId == am.sdkId { // 首先规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规则 |
| | | log.Println("----------当前时间规则:---------",rule) |
| | | log.Println("----------当前时间规则:---------", rule) |
| | | // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组) |
| | | //fmt.Println("时间规则的测试") |
| | | now := time.Now() |
| | | index := getIndexOfWeek(now.Weekday().String()) |
| | | timeList := GetTimeById(rule.SdkArgValue, index) |
| | | log.Println("当天的时间段集合:----------",timeList) |
| | | log.Println("当天的时间段集合:----------", timeList) |
| | | //fmt.Println("从数据库中查出的时间规则:", timeList) |
| | | // 判断图片数据的时间是否符合当前规则 在一个即为true,全不在为false |
| | | flag := "false" |
| | | for _, timeSlot := range timeList { |
| | | if rule.Operator == "satisfy" || rule.Operator == "=="{ // 满足所选的时间规则 |
| | | |
| | | if rule.Operator == "satisfy" || rule.Operator == "==" { // 满足所选的时间规则 |
| | | flag := "false" |
| | | for _, timeSlot := range timeList { |
| | | formula := "'" + timeSlot.Start + "'" + "<" + "'" + am.time + "'" |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | break |
| | | } |
| | | } |
| | | if rule.Operator == "unsatisfy" || rule.Operator == "!="{ // 不满足所选的时间规则 |
| | | formula := timeSlot.Start + "<" + am.time |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort} |
| | | } |
| | | |
| | | if rule.Operator == "unsatisfy" || rule.Operator == "!=" { // 不满足所选的时间规则 |
| | | flag := "true" |
| | | for _, timeSlot := range timeList { |
| | | formula := "'" + timeSlot.Start + "'" + " < " + "'" + am.time + "'" |
| | | log.Println("-----------------时间规则不满足的公式start:", formula) |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | |
| | | formula1 := timeSlot.End + ">" + am.time |
| | | formula1 := "'" + timeSlot.End + "'" + " > " + "'" + am.time + "'" |
| | | log.Println("-----------------时间规则不满足的公式end:", formula1) |
| | | expression1, _ := govaluate.NewEvaluableExpression(formula1) // 得到数学公式 |
| | | result1, _ := expression1.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) && result1.(bool) { |
| | | flag = "true" |
| | | flag = "false" |
| | | break |
| | | } |
| | | } |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort} |
| | | } |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort} |
| | | |
| | | } |
| | | } |
| | | return LittleRuleResult{} |
| | |
| | | // cameraTimeRule = rule |
| | | // } |
| | | //} |
| | | _,cameraTimeRule := cache.GetTimeRuleById(id) |
| | | _, cameraTimeRule := cache.GetTimeRuleById(id) |
| | | var timeRangeList []day |
| | | json.Unmarshal([]byte(cameraTimeRule.TimeRule), &timeRangeList) |
| | | for _, timerange := range timeRangeList { |