panlei
2019-07-30 79bdf923af6398b07a473907fd9f1969e23b1ee7
注释大部分打印
2个文件已修改
56 ■■■■ 已修改文件
ruleserver/readyDataForRule.go 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/readyDataForRule.go
@@ -73,7 +73,7 @@
func GetPolygons(cameraId string) []protomsg.CameraPolygon {
    var cameraPolygons []protomsg.CameraPolygon
    cameraPolygons = cache.GetPolygonsByCameraId(cameraId)
    logger.Debug("------=======查看下全部区域:",cameraPolygons)
    //logger.Debug("------=======查看下全部区域:",cameraPolygons)
    return cameraPolygons
}
@@ -159,7 +159,7 @@
        ids = append(ids,key)
    }
    logger.Info("------------------------------------------------------------------------------------------------------------------------")
    logger.Info("=====================人员id的集合为:",ids)
    //logger.Info("=====================人员id的集合为:",ids)
    if len(ids) > 0 {
        baseinfos, err1 := esutil.Dbpersoninfosbyid(ids,dbTablePersons,serverIp,serverPort)
        if err1 != nil {
@@ -167,7 +167,7 @@
        }
        for _,baseinfo := range baseinfos  {
            // 根据tableId查询底库信息给liker赋值
            logger.Info("---------看看每个底库人员的信息:",baseinfo.Id,baseinfo.PersonName)
            //logger.Info("---------看看每个底库人员的信息:",baseinfo.Id,baseinfo.PersonName)
            var tableIds []string
            tableIds = append(tableIds,baseinfo.TableId) // 虽然是传入数组返回数组的接口,但我按单个的使用了
            table,err := esutil.Dbtablefosbyid(tableIds,"dbtables",serverIp,serverPort)
@@ -221,7 +221,7 @@
                    for _, areaMap := range sdkData.AreaMapList {
                        // 拿区域中每个人脸特征值去对比,填充其liker
                        if groupRule.Rules[j].PolygonId == areaMap.areaId {
                            logger.Info("--------------看看compareFlag的值和tableId和areaMap.args的长度:",compareFlag,tableIds,len(areaMap.args))
                            //logger.Info("--------------看看compareFlag的值和tableId和areaMap.args的长度:",compareFlag,tableIds,len(areaMap.args))
                            for _, arg := range areaMap.args {
                                if compareFlag == 1 {
                                    arg.fillLiker(nil,threshold)
@@ -229,7 +229,7 @@
                                if compareFlag == 2 {
                                    arg.fillLiker(tableIds,threshold)
                                }
                                logger.Info("-------------------成功给liker赋值,长度为:", len(arg.Liker))
                                //logger.Info("-------------------成功给liker赋值,长度为:", len(arg.Liker))
                            }
                            areaMap.filterData = areaMap.args
                            //logger.Info("=======第一次看args:",(areaMap.filterData))
ruleserver/ruleToformula.go
@@ -108,7 +108,7 @@
        // 拿到本摄像机的区域
        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)
        }
@@ -119,7 +119,7 @@
        args.RuleResult = make(map[string]interface{})
        args.RuleResult["yolo"] = []Result{}
        args.RuleResult["face"] = []FaceResult{}
        logger.Warn("传进去之前是什么德行:",args.RuleResult["yolo"])
        //logger.Warn("传进去之前是什么德行:",args.RuleResult["yolo"])
        if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
            for _, group := range taskGroup.GroupRules {
                //logger.Println("------------------------------任务规则:",taskRule)
@@ -147,7 +147,7 @@
        }
    }()
    logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", *groupRule)
    logger.Warn("传进去之后是什么德行:",args.RuleResult["yolo"])
    //logger.Warn("传进去之后是什么德行:",args.RuleResult["yolo"])
    Compare(args, groupRule)
    resultSplice := []*LittleRuleResult{}
    sdkNames := ""
@@ -162,9 +162,9 @@
            }
            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 != "" {
@@ -284,7 +284,7 @@
                }
            }
            for _,face := range faces  {
                logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
                //logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
            }
            logger.Warn("___________________________________________________________________________终于走完万里长征")
            // 把他们的位置数据也传下去
@@ -296,14 +296,14 @@
                    }
                }
            }
            logger.Debug("------locations的内容:", locations)
            //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)))
                //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
            }
            // 最后过持续时间等时间维度的条件   把时间规则位置调整到这个位置是为了缓存数据
            for j := 0; j < len(groupRule.Rules); j++ {
@@ -435,9 +435,9 @@
                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)))
                    //logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result)))
                    if args.RuleResult["face"] != nil {
                        logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]FaceResult)))
                        //logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]FaceResult)))
                    }
                    //os.Exit(0)
                }
@@ -446,7 +446,7 @@
            logger.Warn("数组不圆满不打标签")
        }
    } else { // 没有报警,
        logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
        //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
        // 所以也要去结果数组里放值或更新
        for _, va := range timeEle.RuleResults {
            if args.CameraId != "" && va.CameraId == args.CameraId {
@@ -465,7 +465,7 @@
        if rule.PolygonId == am.areaId { // 算法和区域都得对的上
            if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" && rule.SdkArgAlias != "compareBase" {
                logger.Debug("当前小规则是:",rule)
                //logger.Debug("当前小规则是:",rule)
                flag := "false"
                // 把没有相似者的人脸从filterData中删除
                for index := 0; index < len(am.filterData); {
@@ -483,7 +483,7 @@
                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" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
@@ -491,10 +491,10 @@
                        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]
@@ -520,7 +520,7 @@
                        am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段
                    }
                    if am.targetNum > 0 {
                        logger.Info("!!!!!!!!!人脸检测成功")
                         logger.Info("!!!!!!!!!人脸检测成功")
                        return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
                    } else {
                        return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
@@ -546,7 +546,7 @@
                }
                // 先清空过滤后的数据,再往里塞本次过滤后的数据
                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" {
@@ -601,7 +601,7 @@
                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)
                //logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
            }
        }
    }
@@ -611,7 +611,7 @@
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} // 如果后面不跟操作符就直接返回数量  比如要跟下一个区域比较数量的就直接返回本区域的数量
@@ -647,13 +647,13 @@
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
@@ -680,12 +680,12 @@
                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) {