| | |
| | | //InsertYolo(msg.RuleResult["cacheData"].(ruleserver.ResultMsg)) |
| | | // 把缓存的数据上传后得到地址存进去 |
| | | // 解压缩并上传图片 |
| | | msg1 := msg.RuleResult["cacheData"].(ruleserver.ResultMsg) |
| | | bdata, err := util.UnCompress(msg1.Data) |
| | | if err != nil { |
| | | panic("解压缩图片时出现错误") |
| | | msgs := msg.RuleResult["cacheData"].([]ruleserver.ResultMsg) |
| | | for _,msg1 := range msgs { |
| | | bdata, err := util.UnCompress(msg1.Data) |
| | | if err != nil { |
| | | panic("解压缩图片时出现错误") |
| | | } |
| | | i := protomsg.Image{} |
| | | err = proto.Unmarshal(bdata, &i) |
| | | resp1, err1 := util.DrawPolygonOnImage(msg1.Cid, i, msg1.RuleResult["yolo"].([]ruleserver.Result), weedfsUrl) |
| | | if err1 != nil { |
| | | logger.Error("缓存数据画框或上传图片服务器出错", err) |
| | | } else { |
| | | logger.Info("上传的图片信息:", resp1) |
| | | } |
| | | url = append(url, strings.Split(resp1["fileUrl"].(string), "/")[1]) |
| | | } |
| | | i := protomsg.Image{} |
| | | err = proto.Unmarshal(bdata, &i) |
| | | resp1, err1 := util.DrawPolygonOnImage(msg1.Cid, i, msg1.RuleResult["yolo"].([]ruleserver.Result), weedfsUrl) |
| | | if err1 != nil { |
| | | logger.Error("缓存数据画框或上传图片服务器出错", err) |
| | | } else { |
| | | logger.Info("上传的图片信息:", resp1) |
| | | } |
| | | url = append(url, strings.Split(resp1["fileUrl"].(string), "/")[1]) |
| | | } |
| | | url = append(url, strings.Split(resp["fileUrl"].(string), "/")[1]) |
| | | esDataId := uuid.NewV4().String() |
| | |
| | | panic("解析msg时出现错误") |
| | | } |
| | | |
| | | // 找201的人脸数据 |
| | | //for _, sdkinfo := range m.Tasklab.Sdkinfos { |
| | | // if sdkinfo.Sdktype == "FaceDetect" && m.Cid == "e7e3f5b0-d0ef-40af-a9c9-eefd736937bf"{ // 人脸检测 |
| | | // if len(sdkinfo.Sdkdata) > 1 { |
| | | // logger.Debug("有201的人脸数据了") |
| | | // } else { |
| | | // logger.Debug("没有201的人脸数据") |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | // 先进行一下追踪 |
| | | ruleserver.FaceIsSame(&m) |
| | | args.CameraId = m.Cid |
| | |
| | | |
| | | import ( |
| | | "fmt" |
| | | "os" |
| | | "ruleprocess/cache" |
| | | "ruleprocess/logger" |
| | | "sort" |
| | |
| | | CameraId string |
| | | TaskId string |
| | | Sdkdata []*SdkData |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5 |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result, cacheData: []ResultMsg, timeLabel: 0,1,2,3,4,5 |
| | | } |
| | | |
| | | type ResultMsg struct { |
| | |
| | | // 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{message,args.RuleResult}}) |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | 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"].([]FaceResult))) |
| | | // 把数组里缓存的数据取出来一起报警 |
| | | args.RuleResult["linkCache"] = []*ResultMsg{} |
| | | for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults { |
| | | args.RuleResult["linkCache"] = append(args.RuleResult["linkCache"].([]*ResultMsg),ruleRes.CacheData) |
| | | } |
| | | //os.Exit(0) |
| | | logger.Debug("联动任务缓存了几个数据",len(args.RuleResult["linkCache"].([]*ResultMsg))) |
| | | os.Exit(1) |
| | | } |
| | | } |
| | | } else { |
| | |
| | | } |
| | | } else { // 没有报警, |
| | | //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false") |
| | | // 所以也要去结果数组里放值或更新 |
| | | for _, va := range timeEle.RuleResults { |
| | | if args.CameraId != "" && va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | // 所以也要去结果数组里放值或更新 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,干掉定时器") |
| | | } |
| | | } |
| | | // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西 |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | type RuleResult struct { |
| | | // 每个摄像机一个结构体 |
| | | CameraId string // 摄像机id |
| | | Sort int32 // 摄像机在规则组中序号 |
| | | Result string // 摄像机过滤数据得出的结果 |
| | | RuleWithPre string // 摄像机之间的连接符 |
| | | CameraId string // 摄像机id |
| | | Sort int32 // 摄像机在规则组中序号 |
| | | Result string // 摄像机过滤数据得出的结果 |
| | | RuleWithPre string // 摄像机之间的连接符 |
| | | CacheData *ResultMsg // 缓存当前帧数据 |
| | | } |
| | | |
| | | func TimeTicker() { |
| | |
| | | logger.Debug("———————————-------------首次符合持续时间规则并报警") |
| | | flagTime = "10" |
| | | timeEle.AlarmFlag = true |
| | | args.RuleResult["cacheData"] = timeEle.CacheSdkData |
| | | args.RuleResult["cacheData"] = []ResultMsg{} |
| | | args.RuleResult["cacheData"] = append(args.RuleResult["cacheData"].([]ResultMsg),timeEle.CacheSdkData) |
| | | args.RuleResult["timeLabel"] = flagTime |
| | | } |
| | | if timeEle.N != 0 { |
| | | flagTime = "00" |
| | | // 有定时器但不为0把已打的标签删除 |
| | | // args.RuleResult = nil |
| | | logger.Debug("------------------------结果为真但计数器不到0,不报警,此时的计数器",k,"的值为:", timeEle.N) |
| | | logger.Debug("------------------------结果为真但计数器不到0,不报警,此时的计数器", k, "的值为:", timeEle.N) |
| | | } |
| | | } |
| | | } |